mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-09 04:02:41 +09:00
Compare commits
20
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98cceae59d | ||
|
|
3e32414849 | ||
|
|
7707b9531c | ||
|
|
86745e01e9 | ||
|
|
098830a95a | ||
|
|
cf83f66911 | ||
|
|
c577b97f35 | ||
|
|
8cc485cf81 | ||
|
|
6c36d934f7 | ||
|
|
63e3be5750 | ||
|
|
cdecda7f78 | ||
|
|
4ad2858773 | ||
|
|
fda41bb57a | ||
|
|
ce08f82a92 | ||
|
|
ef067f36c6 | ||
|
|
fc2b6b5299 | ||
|
|
55846b24ea | ||
|
|
20a15ac11d | ||
|
|
667ac7da8e | ||
|
|
1b81c14c48 |
@@ -314,8 +314,8 @@ jobs:
|
||||
path: |
|
||||
~/.cache/rebar3
|
||||
fluxer_gateway/_build
|
||||
!fluxer_gateway/_build/default/lib/fluxer_gateway
|
||||
!fluxer_gateway/_build/test/lib/fluxer_gateway
|
||||
!fluxer_gateway/_build/default/lib/fluxer_gateway/**
|
||||
!fluxer_gateway/_build/test/lib/fluxer_gateway/**
|
||||
key: >-
|
||||
rebar3-${{ runner.os }}-otp28-rebar3.24.0-${{ hashFiles('fluxer_gateway/rebar.lock',
|
||||
'fluxer_gateway/rebar.config') }}
|
||||
@@ -345,8 +345,8 @@ jobs:
|
||||
path: |
|
||||
~/.cache/rebar3
|
||||
fluxer_gateway/_build
|
||||
!fluxer_gateway/_build/default/lib/fluxer_gateway
|
||||
!fluxer_gateway/_build/test/lib/fluxer_gateway
|
||||
!fluxer_gateway/_build/default/lib/fluxer_gateway/**
|
||||
!fluxer_gateway/_build/test/lib/fluxer_gateway/**
|
||||
key: >-
|
||||
rebar3-${{ runner.os }}-otp28-rebar3.24.0-${{ hashFiles('fluxer_gateway/rebar.lock',
|
||||
'fluxer_gateway/rebar.config') }}
|
||||
@@ -426,6 +426,28 @@ jobs:
|
||||
'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml',
|
||||
'packages/markdown_parser/rust/src/**') }}
|
||||
|
||||
lint:
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271
|
||||
|
||||
- name: Install Node.js
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Check formatting and lint
|
||||
run: pnpm exec biome ci .
|
||||
|
||||
i18n:
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 25
|
||||
|
||||
@@ -3,12 +3,20 @@
|
||||
# A name absent from this file is one Compose does not forward, and it reaches a
|
||||
# service only through a Compose override file that adds it to that service's
|
||||
# environment. packages/config/src/__tests__/DeployEnvCoverage.test.ts fails when
|
||||
# a Compose edit forgets the matching line here.
|
||||
# a Compose edit forgets the matching line here. Compose expands this file from
|
||||
# top to bottom, so a line written with ${...} has to sit below every name it
|
||||
# reads.
|
||||
|
||||
FLUXER_DOMAIN=chat.example.com
|
||||
FLUXER_PUBLIC_SCHEME=https
|
||||
FLUXER_PUBLIC_PORT=443
|
||||
|
||||
# The three lines above are the address browsers use, and every endpoint the
|
||||
# services advertise carries the port from FLUXER_PUBLIC_PORT. They do not move
|
||||
# what the host publishes. FLUXER_HTTP_PORT and FLUXER_HTTPS_PORT further down
|
||||
# do that, and a non-default port needs the matching one set as well. Both
|
||||
# complete recipes are written out beside them.
|
||||
|
||||
# How browsers reach this instance.
|
||||
#
|
||||
# Default: Fluxer binds 80 and 443 and gets its own Let's Encrypt certificate.
|
||||
@@ -33,50 +41,71 @@ FLUXER_PUBLIC_PORT=443
|
||||
# address if it reaches Fluxer from a public IP.
|
||||
#FLUXER_EDGE_TRUSTED_PROXIES=private_ranges
|
||||
|
||||
# The public origin browsers use, without a trailing slash. Derived from the three
|
||||
# values above and correct for the usual https-on-443 setup, so leave it alone
|
||||
# unless you serve Fluxer on a non-default port, where the port must appear here.
|
||||
# The origin browsers see, without a trailing slash. Leave it unset and each
|
||||
# service builds one from the three values at the top of this file. Set it and it
|
||||
# wins: every service reads the host, the scheme and the port out of it and
|
||||
# ignores those three names. Use it when browsers reach the instance on a host
|
||||
# FLUXER_DOMAIN does not name. It has to be a bare origin, a scheme and a host
|
||||
# and an optional port and nothing after them, or the services refuse to start.
|
||||
# It does not move the edge listener or the published ports either, so set the
|
||||
# publish below to the port written here.
|
||||
#FLUXER_PUBLIC_ORIGIN=https://chat.example.com
|
||||
|
||||
# Overrides the address Fluxer's edge listens on. Honoured in the default mode
|
||||
# only: docker-compose.proxy.yml sets the literal :8080 and Compose lets the last
|
||||
# file win, so a value here is discarded under the proxy overlay with no warning.
|
||||
# Set it only for an unusual default-mode layout, such as serving several
|
||||
# hostnames or binding a non-default TLS port.
|
||||
#FLUXER_EDGE_SITE_ADDRESS=chat.example.com
|
||||
# Overrides the address the edge listens on inside its container. Compose builds
|
||||
# it from FLUXER_PUBLIC_SCHEME and FLUXER_DOMAIN with no port, and the edge keeps
|
||||
# its container ports at 80 and 443 whatever the public port is. Caddy matches a
|
||||
# site by host and ignores the port in the Host header, so a request arriving on
|
||||
# a non-default published port still lands on this site. Put a port in this value
|
||||
# only if you also publish that same container port below, or nothing will be
|
||||
# listening where the publish points. Honoured in the default mode only:
|
||||
# docker-compose.proxy.yml sets the literal :8080 and tunnel.compose.yml the
|
||||
# literal :80, and Compose lets the last file win, so a value here is discarded
|
||||
# under either overlay with no warning. Set it for an unusual default-mode
|
||||
# layout, such as serving several hostnames. Write the scheme into it: a bare
|
||||
# hostname means automatic HTTPS on 443 whatever FLUXER_PUBLIC_SCHEME says.
|
||||
#FLUXER_EDGE_SITE_ADDRESS=https://chat.example.com
|
||||
|
||||
# The old name for the value above. It is read only when
|
||||
# FLUXER_EDGE_SITE_ADDRESS is unset, so an existing .env keeps the listener
|
||||
# it already had. Rename it to FLUXER_EDGE_SITE_ADDRESS at your convenience.
|
||||
#FLUXER_CADDY_SITE_ADDRESS=
|
||||
|
||||
# FLUXER_PUBLIC_ORIGIN is the origin browsers see. It must carry the port
|
||||
# whenever FLUXER_PUBLIC_PORT is not the default for its scheme, because an
|
||||
# origin written with a default port never matches a browser Origin header.
|
||||
# Serving on any other port means setting all three, plus the published port
|
||||
# below, and pointing FLUXER_EDGE_SITE_ADDRESS at the same scheme and host.
|
||||
# Compose expands this file from top to bottom, so FLUXER_PUBLIC_ORIGIN has to
|
||||
# stay below the two values it reads. Above them it silently expands to a bare
|
||||
# host with a trailing colon.
|
||||
#FLUXER_PUBLIC_SCHEME=http
|
||||
#FLUXER_PUBLIC_PORT=19080
|
||||
#FLUXER_PUBLIC_ORIGIN=${FLUXER_PUBLIC_SCHEME}://${FLUXER_DOMAIN}:${FLUXER_PUBLIC_PORT}
|
||||
#FLUXER_HTTP_PORT=19080
|
||||
|
||||
# Ports Caddy publishes on the host. Caddy still listens on 80 and 443 inside
|
||||
# the container, so change only these when something else already owns the
|
||||
# standard ports or another proxy sits in front. Both take an optional bind
|
||||
# address in front of the port, and 127.0.0.1 keeps the publish off every
|
||||
# public interface. FLUXER_HTTPS_PORT moves the TCP and the UDP publish
|
||||
# together, because HTTP/3 needs both on the same port.
|
||||
# Host side of the edge's publishes, and the only two names that decide which
|
||||
# host ports Fluxer binds. The container side is fixed. Container 80 carries the
|
||||
# HTTP to HTTPS redirect and the Let's Encrypt HTTP challenge under an https
|
||||
# scheme, and the site itself under an http one. Container 443 carries the TLS
|
||||
# site. FLUXER_HTTPS_PORT moves the TCP and the UDP publish together, because
|
||||
# HTTP/3 needs both on the same port. Both take an optional bind address in front
|
||||
# of the port, and 127.0.0.1 keeps the publish off every public interface. Give
|
||||
# them different host ports: the same host port on both is two publishes of one
|
||||
# port and the edge refuses to start.
|
||||
#FLUXER_HTTP_PORT=80
|
||||
#FLUXER_HTTPS_PORT=443
|
||||
#FLUXER_HTTP_PORT=127.0.0.1:80
|
||||
#FLUXER_HTTPS_PORT=127.0.0.1:443
|
||||
|
||||
# HTTPS on 8443, complete. Host 80 stays published and still answers the ACME
|
||||
# challenge. Let's Encrypt only ever connects to the public 80 or 443, so the
|
||||
# certificate is issued if a router in front forwards public 80 to this host and
|
||||
# is not issued otherwise. Serve your own certificate from the Caddyfile when it
|
||||
# cannot.
|
||||
#FLUXER_PUBLIC_PORT=8443
|
||||
#FLUXER_HTTPS_PORT=8443
|
||||
|
||||
# Plain HTTP on 19080, complete. The port 80 publish moves to 19080, so nothing
|
||||
# binds host 80. Under an http scheme nothing listens on container 443, so the
|
||||
# last line parks that publish on loopback for a host that wants 443 for
|
||||
# something else. Drop it and 443 is published and idle, which is what earlier
|
||||
# releases did.
|
||||
#FLUXER_PUBLIC_SCHEME=http
|
||||
#FLUXER_PUBLIC_PORT=19080
|
||||
#FLUXER_HTTP_PORT=19080
|
||||
#FLUXER_HTTPS_PORT=127.0.0.1:443
|
||||
|
||||
# A tunnel or another proxy in front of the stack needs no HTTPS publish at all.
|
||||
# tunnel.compose.yml ships beside this file and replaces Caddy's published ports
|
||||
# with a single loopback HTTP publish, so nothing binds 443. FLUXER_HTTP_PORT
|
||||
# with a single loopback HTTP publish, so nothing binds 443, and points the edge
|
||||
# at plain HTTP on that publish so it stops redirecting to https. FLUXER_HTTP_PORT
|
||||
# still moves that one publish. Set the line below and plain docker compose
|
||||
# commands pick the file up, or add it to your own -f flags if you pass any. The
|
||||
# file uses the !override tag, which needs Compose 2.24.4 or newer.
|
||||
@@ -153,9 +182,11 @@ FLUXER_VAPID_PRIVATE_KEY=CHANGE_ME
|
||||
LIVEKIT_API_KEY=fluxer
|
||||
LIVEKIT_API_SECRET=CHANGE_ME
|
||||
|
||||
# The URL browsers use for voice signalling. Derived from FLUXER_PUBLIC_SCHEME,
|
||||
# FLUXER_DOMAIN and FLUXER_PUBLIC_PORT as wss://host[:port]/livekit when empty.
|
||||
# Set it only when LiveKit is served from another host.
|
||||
# The URL browsers use for voice signalling. Compose builds it from
|
||||
# FLUXER_PUBLIC_ORIGIN, or from FLUXER_PUBLIC_SCHEME, FLUXER_DOMAIN and
|
||||
# FLUXER_PUBLIC_PORT, as that origin followed by /livekit. The client rewrites a
|
||||
# leading http to ws itself. Set it only when LiveKit is served from another
|
||||
# host.
|
||||
#FLUXER_LIVEKIT_URL=
|
||||
|
||||
# Media ports. LiveKit advertises these in ICE candidates, so the host must
|
||||
|
||||
@@ -18,6 +18,7 @@ x-fluxer-env: &fluxer-env
|
||||
FLUXER_BASE_DOMAIN: ${FLUXER_DOMAIN:?set FLUXER_DOMAIN in .env}
|
||||
FLUXER_PUBLIC_SCHEME: ${FLUXER_PUBLIC_SCHEME:-https}
|
||||
FLUXER_PUBLIC_PORT: ${FLUXER_PUBLIC_PORT:-443}
|
||||
FLUXER_PUBLIC_ORIGIN: ${FLUXER_PUBLIC_ORIGIN:-}
|
||||
FLUXER_TRUST_CLIENT_IP_HEADER: "true"
|
||||
FLUXER_CLIENT_IP_HEADER_NAME: x-forwarded-for
|
||||
FLUXER_API_HEADERS_TIMEOUT_MS: ${FLUXER_API_HEADERS_TIMEOUT_MS:-30000}
|
||||
@@ -56,7 +57,7 @@ x-fluxer-env: &fluxer-env
|
||||
FLUXER_LIVEKIT_INTERNAL_URL: http://livekit:7880
|
||||
FLUXER_LIVEKIT_WEBHOOK_URL: http://api:8080/webhooks/livekit
|
||||
FLUXER_LIVEKIT_DEFAULT_REGION: '{"id":"default","name":"Default","emoji":"🌍","latitude":0,"longitude":0}'
|
||||
FLUXER_LIVEKIT_URL: ${FLUXER_LIVEKIT_URL:-${FLUXER_PUBLIC_ORIGIN:-${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}}/livekit}
|
||||
FLUXER_LIVEKIT_URL: ${FLUXER_LIVEKIT_URL:-${FLUXER_PUBLIC_ORIGIN:-${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}:${FLUXER_PUBLIC_PORT:-443}}/livekit}
|
||||
|
||||
FLUXER_KLIPY_API_KEY: ${FLUXER_KLIPY_API_KEY:-}
|
||||
|
||||
@@ -132,7 +133,7 @@ services:
|
||||
- "${FLUXER_HTTPS_PORT:-443}:443"
|
||||
- "${FLUXER_HTTPS_PORT:-443}:443/udp"
|
||||
environment:
|
||||
FLUXER_EDGE_SITE_ADDRESS: ${FLUXER_EDGE_SITE_ADDRESS:-${FLUXER_CADDY_SITE_ADDRESS:-${FLUXER_DOMAIN:?set FLUXER_DOMAIN in .env}}}
|
||||
FLUXER_EDGE_SITE_ADDRESS: ${FLUXER_EDGE_SITE_ADDRESS:-${FLUXER_CADDY_SITE_ADDRESS:-${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN:?set FLUXER_DOMAIN in .env}}}
|
||||
FLUXER_EDGE_TRUSTED_PROXIES: ${FLUXER_EDGE_TRUSTED_PROXIES:-private_ranges}
|
||||
volumes:
|
||||
- ./Caddyfile:/etc/caddy/Caddyfile:ro
|
||||
@@ -494,6 +495,10 @@ services:
|
||||
environment:
|
||||
FLUXER_APP_PROXY_HOST: 0.0.0.0
|
||||
FLUXER_APP_PROXY_PORT: "8080"
|
||||
FLUXER_BASE_DOMAIN: ${FLUXER_DOMAIN:?set FLUXER_DOMAIN in .env}
|
||||
FLUXER_PUBLIC_SCHEME: ${FLUXER_PUBLIC_SCHEME:-https}
|
||||
FLUXER_PUBLIC_PORT: ${FLUXER_PUBLIC_PORT:-443}
|
||||
FLUXER_PUBLIC_ORIGIN: ${FLUXER_PUBLIC_ORIGIN:-}
|
||||
DISCOVERY_UPSTREAM_URL: http://edge:8088/.well-known/fluxer
|
||||
PUBLIC_BOOTSTRAP_API_ENDPOINT: /api
|
||||
PUBLIC_BOOTSTRAP_API_PUBLIC_ENDPOINT: ${FLUXER_PUBLIC_ORIGIN:-${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}}/api
|
||||
|
||||
@@ -2,3 +2,5 @@ services:
|
||||
edge:
|
||||
ports: !override
|
||||
- "${FLUXER_HTTP_PORT:-127.0.0.1:80}:80"
|
||||
environment:
|
||||
FLUXER_EDGE_SITE_ADDRESS: ":80"
|
||||
|
||||
@@ -12287,14 +12287,7 @@
|
||||
"max_concurrent_guild_starts": {"type": "integer", "minimum": 1, "maximum": 10000, "format": "int32"},
|
||||
"gateway_dispatch_relay_shards": {"type": "integer", "minimum": 1, "maximum": 10000, "format": "int32"},
|
||||
"gateway_dispatch_relay_max_queue": {"type": "integer", "minimum": 0, "maximum": 1000000, "format": "int32"},
|
||||
"voice_e2ee_scope": {"enum": ["guild_feature_only", "platform_wide"], "type": "string"},
|
||||
"voice_reconciliation_v3_percentage": {"type": "number", "minimum": 0, "maximum": 100},
|
||||
"voice_reconciliation_v3_interval_ms": {
|
||||
"type": "integer",
|
||||
"minimum": 500,
|
||||
"maximum": 60000,
|
||||
"format": "int32"
|
||||
}
|
||||
"voice_e2ee_scope": {"enum": ["guild_feature_only", "platform_wide"], "type": "string"}
|
||||
}
|
||||
},
|
||||
"InstanceConfigUpdateRequest": {
|
||||
@@ -12534,14 +12527,7 @@
|
||||
"max_concurrent_guild_starts": {"type": "integer", "minimum": 1, "maximum": 10000, "format": "int32"},
|
||||
"gateway_dispatch_relay_shards": {"type": "integer", "minimum": 1, "maximum": 10000, "format": "int32"},
|
||||
"gateway_dispatch_relay_max_queue": {"type": "integer", "minimum": 0, "maximum": 1000000, "format": "int32"},
|
||||
"voice_e2ee_scope": {"enum": ["guild_feature_only", "platform_wide"], "type": "string"},
|
||||
"voice_reconciliation_v3_percentage": {"type": "number", "minimum": 0, "maximum": 100},
|
||||
"voice_reconciliation_v3_interval_ms": {
|
||||
"type": "integer",
|
||||
"minimum": 500,
|
||||
"maximum": 60000,
|
||||
"format": "int32"
|
||||
}
|
||||
"voice_e2ee_scope": {"enum": ["guild_feature_only", "platform_wide"], "type": "string"}
|
||||
}
|
||||
},
|
||||
"BrandingAssetUploadRequest": {
|
||||
|
||||
@@ -129,6 +129,11 @@ impl AdminConfig {
|
||||
pub fn secure_cookies(&self) -> bool {
|
||||
self.admin_endpoint.starts_with("https://")
|
||||
}
|
||||
|
||||
pub fn admin_origin(&self) -> Option<String> {
|
||||
let origin = url::Url::parse(&self.admin_endpoint).ok()?.origin();
|
||||
origin.is_tuple().then(|| origin.ascii_serialization())
|
||||
}
|
||||
}
|
||||
|
||||
impl RuntimeEnv {
|
||||
@@ -202,6 +207,7 @@ mod tests {
|
||||
unsafe { env::remove_var(name) };
|
||||
}
|
||||
unsafe { env::remove_var("FLUXER_PUBLIC_PORT") };
|
||||
unsafe { env::remove_var("FLUXER_PUBLIC_ORIGIN") };
|
||||
unsafe { env::set_var("FLUXER_ADMIN_SECRET_KEY_BASE", "test-secret") };
|
||||
for (name, value) in vars {
|
||||
unsafe { env::set_var(name, value) };
|
||||
@@ -350,7 +356,7 @@ mod tests {
|
||||
("FLUXER_BASE_DOMAIN", "fluxer.example"),
|
||||
("FLUXER_PUBLIC_PORT", "19080"),
|
||||
("FLUXER_ADMIN_ENDPOINT", "http://fluxer.example/admin"),
|
||||
("FLUXER_APP_ENDPOINT", "http://fluxer.example:19080"),
|
||||
("FLUXER_APP_ENDPOINT", "http://fluxer.example"),
|
||||
("FLUXER_MEDIA_ENDPOINT", "http://fluxer.example/media"),
|
||||
("FLUXER_STATIC_CDN_ENDPOINT", "https://cdn.example.net"),
|
||||
(
|
||||
|
||||
@@ -27,7 +27,6 @@ pub async fn csrf_protection(
|
||||
) -> Response {
|
||||
let config = state.config();
|
||||
let secret = config.secret_key_base.clone();
|
||||
let admin_endpoint = config.admin_endpoint.clone();
|
||||
let secure_cookies = config.secure_cookies();
|
||||
|
||||
let user_id = request
|
||||
@@ -50,7 +49,7 @@ pub async fn csrf_protection(
|
||||
.iter()
|
||||
.any(|suffix| path.ends_with(suffix));
|
||||
if !is_ignored {
|
||||
if !is_same_site_request(&request, &admin_endpoint) {
|
||||
if !is_same_site_request(&request, config.admin_origin().as_deref()) {
|
||||
return StatusCode::FORBIDDEN.into_response();
|
||||
}
|
||||
let header_token = extract_csrf_header(&request);
|
||||
@@ -167,7 +166,7 @@ async fn extract_csrf_from_form_body(
|
||||
Ok((request, token))
|
||||
}
|
||||
|
||||
fn is_same_site_request(request: &Request, admin_endpoint: &str) -> bool {
|
||||
fn is_same_site_request(request: &Request, admin_origin: Option<&str>) -> bool {
|
||||
if let Some(site) = request
|
||||
.headers()
|
||||
.get("sec-fetch-site")
|
||||
@@ -180,7 +179,7 @@ fn is_same_site_request(request: &Request, admin_endpoint: &str) -> bool {
|
||||
.get(header::ORIGIN)
|
||||
.and_then(|value| value.to_str().ok())
|
||||
{
|
||||
Some(origin) => origin == admin_endpoint,
|
||||
Some(origin) => admin_origin.is_some_and(|expected| origin == expected),
|
||||
None => true,
|
||||
}
|
||||
}
|
||||
@@ -275,6 +274,98 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
async fn action_status(admin_endpoint: &str, origin: &str) -> StatusCode {
|
||||
let state = state_with_admin_endpoint(admin_endpoint);
|
||||
let app = Router::new()
|
||||
.route("/", get(|| async { "ok" }).post(|| async { "ok" }))
|
||||
.layer(from_fn_with_state(state, csrf_protection));
|
||||
let issued = app
|
||||
.clone()
|
||||
.oneshot(Request::builder().uri("/").body(Body::empty()).unwrap())
|
||||
.await
|
||||
.expect("router responds");
|
||||
let cookie = issued
|
||||
.headers()
|
||||
.get_all(header::SET_COOKIE)
|
||||
.iter()
|
||||
.filter_map(|value| value.to_str().ok())
|
||||
.filter_map(|value| value.split(';').next())
|
||||
.find(|pair| pair.contains("csrf_token=") && !pair.ends_with('='))
|
||||
.expect("a csrf cookie is issued")
|
||||
.to_owned();
|
||||
let token = cookie.split_once('=').expect("a cookie value").1.to_owned();
|
||||
let response = app
|
||||
.oneshot(
|
||||
Request::builder()
|
||||
.method(Method::POST)
|
||||
.uri("/")
|
||||
.header(header::COOKIE, cookie.as_str())
|
||||
.header(header::ORIGIN, origin)
|
||||
.header(CSRF_HEADER_NAME, token.as_str())
|
||||
.body(Body::empty())
|
||||
.unwrap(),
|
||||
)
|
||||
.await
|
||||
.expect("router responds");
|
||||
response.status()
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn a_matching_origin_passes_the_same_site_check() {
|
||||
let status = action_status(
|
||||
"https://admin.example.test/admin",
|
||||
"https://admin.example.test",
|
||||
)
|
||||
.await;
|
||||
assert_eq!(status, StatusCode::OK);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn a_matching_origin_on_a_non_default_port_passes_the_same_site_check() {
|
||||
let status = action_status(
|
||||
"https://admin.example.test:19080/admin",
|
||||
"https://admin.example.test:19080",
|
||||
)
|
||||
.await;
|
||||
assert_eq!(status, StatusCode::OK);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn a_foreign_origin_fails_the_same_site_check() {
|
||||
let status = action_status(
|
||||
"https://admin.example.test:19080/admin",
|
||||
"https://evil.example.test:19080",
|
||||
)
|
||||
.await;
|
||||
assert_eq!(status, StatusCode::FORBIDDEN);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn another_port_on_the_admin_host_fails_the_same_site_check() {
|
||||
let status = action_status(
|
||||
"https://admin.example.test:19080/admin",
|
||||
"https://admin.example.test",
|
||||
)
|
||||
.await;
|
||||
assert_eq!(status, StatusCode::FORBIDDEN);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn an_unparseable_admin_endpoint_fails_closed() {
|
||||
let status = action_status("not-an-endpoint", "https://admin.example.test").await;
|
||||
assert_eq!(status, StatusCode::FORBIDDEN);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn an_explicit_default_port_matches_a_portless_origin() {
|
||||
let status = action_status(
|
||||
"https://admin.example.test:443/admin",
|
||||
"https://admin.example.test",
|
||||
)
|
||||
.await;
|
||||
assert_eq!(status, StatusCode::OK);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn oauth2_callback_is_exempt() {
|
||||
let exempt = IGNORED_PATH_SUFFIXES
|
||||
|
||||
@@ -18,6 +18,7 @@ use tower::ServiceExt;
|
||||
const SECRET_KEY: &str = "legacy-csrf-cookie-test-secret";
|
||||
const ADMIN_ORIGIN: &str = "https://admin.example.test";
|
||||
const LEGACY_HEX_TOKEN: &str = "8f14e45fceea167a5a36dedd4bea25438f14e45fceea167a5a36dedd4bea2543";
|
||||
const CREATED_KEY_SECRET: &str = "fa_1900000000000000001_OneTimeSecretForTests";
|
||||
|
||||
struct TestApp {
|
||||
router: Router,
|
||||
@@ -128,6 +129,10 @@ async fn load_page(app: &TestApp, cookie: &str) -> (String, String) {
|
||||
let body = to_bytes(response.into_body(), usize::MAX).await.unwrap();
|
||||
let text = String::from_utf8(body.to_vec()).unwrap();
|
||||
assert_eq!(status, StatusCode::OK, "{text}");
|
||||
assert!(
|
||||
text.contains("AdminUser"),
|
||||
"the page did not render the admin the mock API returns"
|
||||
);
|
||||
let cookie_token = host_csrf_cookie(&headers)
|
||||
.unwrap_or_else(|| panic!("no __Host-csrf_token in Set-Cookie: {headers:?}"));
|
||||
let page_token = form_csrf_value(&text).expect("no _csrf hidden input rendered");
|
||||
@@ -166,7 +171,16 @@ async fn submit_action(app: &TestApp, cookie: &str, form_token: &str) -> StatusC
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
response.status()
|
||||
let status = response.status();
|
||||
let body = to_bytes(response.into_body(), usize::MAX).await.unwrap();
|
||||
let text = String::from_utf8(body.to_vec()).unwrap();
|
||||
if status == StatusCode::OK {
|
||||
assert!(
|
||||
text.contains(CREATED_KEY_SECRET),
|
||||
"the action did not render the key the mock API creates"
|
||||
);
|
||||
}
|
||||
status
|
||||
}
|
||||
|
||||
fn host_csrf_cookie(headers: &HeaderMap) -> Option<String> {
|
||||
@@ -207,11 +221,11 @@ async fn spawn_mock_api() -> String {
|
||||
|
||||
async fn mock_api(method: Method, uri: Uri) -> Response {
|
||||
match (method, uri.path()) {
|
||||
(Method::GET, "/admin/users/me") => Json(json!({ "user": admin_user() })).into_response(),
|
||||
(Method::GET, "/admin/users/@me") => Json(json!({ "user": admin_user() })).into_response(),
|
||||
(Method::GET, "/admin/api-keys") => Json(json!([])).into_response(),
|
||||
(Method::POST, "/admin/api-keys") => Json(json!({
|
||||
"key_id": "1900000000000000001",
|
||||
"key": "fa_1900000000000000001_OneTimeSecretForTests",
|
||||
"key": CREATED_KEY_SECRET,
|
||||
"name": "Legacy Cookie Key",
|
||||
"created_at": "2026-07-10T15:00:00.000Z",
|
||||
"expires_at": null,
|
||||
|
||||
@@ -30,8 +30,8 @@ import {phraseBlocklistCache} from '../../middleware/PhraseBlocklistCache';
|
||||
import {profileSubstringBlocklistCache} from '../../middleware/ProfileSubstringBlocklistCache';
|
||||
import {urlBlocklistCache} from '../../middleware/UrlBlocklistCache';
|
||||
import {
|
||||
getIpBanBlastRadiusVerdict,
|
||||
getSuspiciousIpSkipReason,
|
||||
hasHighCgnatBlastRadiusRisk,
|
||||
isSingleIpBanCandidate,
|
||||
} from '../../risk/IpBanCgnatGuard';
|
||||
import {isIpBanExempt} from '../../risk/IpBanExemptions';
|
||||
@@ -292,7 +292,7 @@ export class AdminBanManagementService {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
const highRisk = await hasHighCgnatBlastRadiusRisk(ip, this.deps.ipInfoService, {
|
||||
const {cgnat: highRisk} = await getIpBanBlastRadiusVerdict(ip, this.deps.ipInfoService, {
|
||||
source: 'admin.ip_ban',
|
||||
reason: 'pre_write_cgnat_guard',
|
||||
});
|
||||
|
||||
@@ -209,7 +209,7 @@ export async function forgotPassword(ctx: ApiContext, {data, request}: ForgotPas
|
||||
}
|
||||
const hasValidDns = await emailDnsValidation.hasValidDnsRecords(data.email);
|
||||
if (!hasValidDns) {
|
||||
throw InputValidationError.fromCode('email', ValidationErrorCodes.INVALID_EMAIL_ADDRESS);
|
||||
throw InputValidationError.fromCode('email', ValidationErrorCodes.EMAIL_DOMAIN_CANNOT_RECEIVE_MAIL);
|
||||
}
|
||||
const user = await users.findByEmail(data.email);
|
||||
if (!user) {
|
||||
|
||||
@@ -187,7 +187,7 @@ export async function register(
|
||||
contactDomain = normalizePolicyContactDomain(extractEmailDomain(rawEmail));
|
||||
const hasValidDns = await emailDnsValidation.hasValidDnsRecords(rawEmail);
|
||||
if (!hasValidDns) {
|
||||
throw InputValidationError.fromCode('email', ValidationErrorCodes.INVALID_EMAIL_ADDRESS);
|
||||
throw InputValidationError.fromCode('email', ValidationErrorCodes.EMAIL_DOMAIN_CANNOT_RECEIVE_MAIL);
|
||||
}
|
||||
contactDomainBlocked = accountPolicyEvaluator.isBlockedRegistrationEmailDomain(contactDomain);
|
||||
if (contactDomainBlocked) {
|
||||
|
||||
@@ -40,7 +40,7 @@ export class DonationCheckoutService {
|
||||
}
|
||||
const hasValidDns = await this.emailDnsValidationService.hasValidDnsRecords(params.email);
|
||||
if (!hasValidDns) {
|
||||
throw InputValidationError.fromCode('email', ValidationErrorCodes.INVALID_EMAIL_ADDRESS);
|
||||
throw InputValidationError.fromCode('email', ValidationErrorCodes.EMAIL_DOMAIN_CANNOT_RECEIVE_MAIL);
|
||||
}
|
||||
const isRecurring = params.interval !== null;
|
||||
const existingDonor = await this.donationRepository.findDonorByEmail(params.email);
|
||||
|
||||
@@ -24,7 +24,7 @@ export class DonationMagicLinkService {
|
||||
async sendMagicLink(email: string): Promise<void> {
|
||||
const hasValidDns = await this.emailDnsValidationService.hasValidDnsRecords(email);
|
||||
if (!hasValidDns) {
|
||||
throw InputValidationError.fromCode('email', ValidationErrorCodes.INVALID_EMAIL_ADDRESS);
|
||||
throw InputValidationError.fromCode('email', ValidationErrorCodes.EMAIL_DOMAIN_CANNOT_RECEIVE_MAIL);
|
||||
}
|
||||
const donor = await this.donationRepository.findDonorByEmail(email);
|
||||
if (!donor) {
|
||||
|
||||
@@ -401,7 +401,7 @@ export class GuildDiscoveryService extends IGuildDiscoveryService {
|
||||
const language =
|
||||
params.primaryLanguage && isValidDiscoveryLanguage(params.primaryLanguage) ? params.primaryLanguage : undefined;
|
||||
const tag = params.tag && params.tag.trim().length > 0 ? normalizeDiscoveryTag(params.tag) : undefined;
|
||||
const sortBy = params.sortBy === 'member_count' ? 'memberCount' : 'relevance';
|
||||
const sortBy = params.sortBy === 'relevance' ? 'relevance' : 'memberCount';
|
||||
const filters: GuildSearchFilters = {
|
||||
isDiscoverable: true,
|
||||
discoveryCategory: params.categoryId,
|
||||
@@ -444,7 +444,6 @@ export class GuildDiscoveryService extends IGuildDiscoveryService {
|
||||
for (const guild of guilds) {
|
||||
const counts = freshCounts.get(BigInt(guild.id) as GuildID);
|
||||
if (counts) {
|
||||
guild.member_count = counts.memberCount;
|
||||
guild.online_count = counts.onlineCount;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ import type {UserCacheService} from '../../infrastructure/UserCacheService';
|
||||
import {Logger} from '../../Logger';
|
||||
import type {RequestCache} from '../../middleware/RequestCacheMiddleware';
|
||||
import type {GuildBan} from '../../models/GuildBan';
|
||||
import {hasHighCgnatBlastRadiusRisk, isSingleIpBanCandidate} from '../../risk/IpBanCgnatGuard';
|
||||
import {getIpBanBlastRadiusVerdict, isSingleIpBanCandidate} from '../../risk/IpBanCgnatGuard';
|
||||
import {isIpBanExempt} from '../../risk/IpBanExemptions';
|
||||
import type {IUserRepository} from '../../user/IUserRepository';
|
||||
import type {WorkerTaskName} from '../../worker/WorkerLaneConfig';
|
||||
@@ -237,19 +237,20 @@ export class GuildModerationService {
|
||||
return true;
|
||||
}
|
||||
try {
|
||||
const highRisk = await hasHighCgnatBlastRadiusRisk(userIp, this.ipInfoService, {
|
||||
const {cgnat, sharedAccess} = await getIpBanBlastRadiusVerdict(userIp, this.ipInfoService, {
|
||||
source: 'guild.ip_ban',
|
||||
reason: 'join_cgnat_guard',
|
||||
});
|
||||
const highRisk = cgnat || sharedAccess;
|
||||
if (highRisk) {
|
||||
Logger.warn(
|
||||
{userIp, bannedIp},
|
||||
'Skipping guild IP ban match because IPInfo indicates high CGNAT blast-radius risk',
|
||||
'Skipping guild IP ban match because IPInfo indicates high shared-network blast-radius risk',
|
||||
);
|
||||
}
|
||||
return !highRisk;
|
||||
} catch (error) {
|
||||
Logger.warn({error, userIp, bannedIp}, 'IPInfo CGNAT guard failed while checking guild IP ban');
|
||||
Logger.warn({error, userIp, bannedIp}, 'IPInfo blast-radius guard failed while checking guild IP ban');
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,23 +68,10 @@ export class GuildSearchService {
|
||||
const includeNsfwRequested = searchParams.include_nsfw ?? false;
|
||||
const canUserAccessNsfw =
|
||||
guildIsAgeRestricted || includeNsfwRequested ? await this.getCanUserAccessNsfw(userId) : false;
|
||||
if (guildIsAgeRestricted) {
|
||||
if (!canUserAccessNsfw) {
|
||||
throw new NsfwContentRequiresAgeVerificationError();
|
||||
}
|
||||
if (!includeNsfwRequested) {
|
||||
const hitsPerPage = searchParams.hits_per_page ?? 25;
|
||||
const page = searchParams.page ?? 1;
|
||||
return {
|
||||
channels: [],
|
||||
messages: [],
|
||||
total: 0,
|
||||
hits_per_page: hitsPerPage,
|
||||
page,
|
||||
};
|
||||
}
|
||||
if (guildIsAgeRestricted && !canUserAccessNsfw) {
|
||||
throw new NsfwContentRequiresAgeVerificationError();
|
||||
}
|
||||
const canIncludeNsfw = includeNsfwRequested && canUserAccessNsfw;
|
||||
const canIncludeNsfw = canUserAccessNsfw && (includeNsfwRequested || guildIsAgeRestricted);
|
||||
const guildNsfw = guildData?.nsfw ?? false;
|
||||
const channels = await this.channelRepository.listChannels(channelIds);
|
||||
const channelMap = new Map<string, Channel>();
|
||||
|
||||
@@ -14,7 +14,7 @@ import type {GuildID, RoleID, UserID} from '../../../BrandedTypes';
|
||||
import {guildIdToRoleId} from '../../../BrandedTypes';
|
||||
import {Logger} from '../../../Logger';
|
||||
import type {GuildMember} from '../../../models/GuildMember';
|
||||
import {hasHighCgnatBlastRadiusRisk, isSingleIpBanCandidate} from '../../../risk/IpBanCgnatGuard';
|
||||
import {getIpBanBlastRadiusVerdict, isSingleIpBanCandidate} from '../../../risk/IpBanCgnatGuard';
|
||||
import {isIpBanExempt} from '../../../risk/IpBanExemptions';
|
||||
import type {IUserRepository} from '../../../user/IUserRepository';
|
||||
import type {IGuildRepositoryAggregate} from '../../repositories/IGuildRepositoryAggregate';
|
||||
@@ -119,14 +119,15 @@ export class GuildMemberValidationService {
|
||||
return true;
|
||||
}
|
||||
try {
|
||||
const highRisk = await hasHighCgnatBlastRadiusRisk(userIp, this.ipInfoService, {
|
||||
const {cgnat, sharedAccess} = await getIpBanBlastRadiusVerdict(userIp, this.ipInfoService, {
|
||||
source: 'guild.member_ip_ban',
|
||||
reason: 'join_cgnat_guard',
|
||||
});
|
||||
const highRisk = cgnat || sharedAccess;
|
||||
if (highRisk) {
|
||||
Logger.warn(
|
||||
{userIp, bannedIp},
|
||||
'Skipping guild member IP ban match because IPInfo indicates high CGNAT blast-radius risk',
|
||||
'Skipping guild member IP ban match because IPInfo indicates high shared-network blast-radius risk',
|
||||
);
|
||||
}
|
||||
return !highRisk;
|
||||
|
||||
@@ -8,13 +8,21 @@ import type {
|
||||
DiscoveryCategoryResponse,
|
||||
DiscoveryGuildListResponse,
|
||||
} from '@fluxer/schema/src/domains/guild/GuildDiscoverySchemas';
|
||||
import type {WorkerTaskHelpers} from '@pkgs/worker/src/contracts/WorkerTask';
|
||||
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
|
||||
import {createTestAccount, setUserACLs} from '../../auth/tests/AuthTestUtils';
|
||||
import type {GuildID} from '../../BrandedTypes';
|
||||
import {createTestBotAccount} from '../../bot/tests/BotTestUtils';
|
||||
import {setInjectedGatewayService} from '../../middleware/ServiceRegistry';
|
||||
import {getGuildRepository} from '../../middleware/ServiceSingletons';
|
||||
import {banUser} from '../../moderation/tests/ModerationTestUtils';
|
||||
import {type ApiTestHarness, createApiTestHarness} from '../../test/ApiTestHarness';
|
||||
import {NoopLogger} from '../../test/mocks/NoopLogger';
|
||||
import {NoopGatewayService} from '../../test/NoopGatewayService';
|
||||
import {HTTP_STATUS, TEST_IDS} from '../../test/TestConstants';
|
||||
import {createBuilder, createBuilderWithoutAuth} from '../../test/TestRequestBuilder';
|
||||
import syncDiscoveryIndex from '../../worker/tasks/SyncDiscoveryIndex';
|
||||
import {clearWorkerDependencies, setWorkerDependenciesForTest} from '../../worker/WorkerContext';
|
||||
import {createGuild, getUserGuilds} from './GuildTestUtils';
|
||||
|
||||
async function setGuildMemberCount(harness: ApiTestHarness, guildId: string, memberCount: number): Promise<void> {
|
||||
@@ -24,6 +32,30 @@ async function setGuildMemberCount(harness: ApiTestHarness, guildId: string, mem
|
||||
.execute();
|
||||
}
|
||||
|
||||
interface LiveGuildCounts {
|
||||
memberCount: number;
|
||||
onlineCount: number;
|
||||
}
|
||||
|
||||
const WORKER_HELPERS = {logger: new NoopLogger()} as unknown as WorkerTaskHelpers;
|
||||
|
||||
class LiveCountsGatewayService extends NoopGatewayService {
|
||||
constructor(private readonly liveCounts: Map<string, LiveGuildCounts>) {
|
||||
super();
|
||||
}
|
||||
|
||||
override async getDiscoveryGuildCounts(guildIds: Array<GuildID>): Promise<Map<GuildID, LiveGuildCounts>> {
|
||||
const counts = new Map<GuildID, LiveGuildCounts>();
|
||||
for (const guildId of guildIds) {
|
||||
const live = this.liveCounts.get(guildId.toString());
|
||||
if (live) {
|
||||
counts.set(guildId, live);
|
||||
}
|
||||
}
|
||||
return counts;
|
||||
}
|
||||
}
|
||||
|
||||
async function applyAndApprove(
|
||||
harness: ApiTestHarness,
|
||||
ownerToken: string,
|
||||
@@ -44,12 +76,39 @@ async function applyAndApprove(
|
||||
.execute();
|
||||
}
|
||||
|
||||
async function createApprovedDiscoveryGuild(
|
||||
harness: ApiTestHarness,
|
||||
adminToken: string,
|
||||
name: string,
|
||||
memberCount: number,
|
||||
): Promise<string> {
|
||||
const owner = await createTestAccount(harness);
|
||||
const guild = await createGuild(harness, owner.token, name);
|
||||
await setGuildMemberCount(harness, guild.id, memberCount);
|
||||
await applyAndApprove(
|
||||
harness,
|
||||
owner.token,
|
||||
adminToken,
|
||||
guild.id,
|
||||
`${name} welcomes everyone`,
|
||||
DiscoveryCategories.GAMING,
|
||||
);
|
||||
return guild.id;
|
||||
}
|
||||
|
||||
function expectNonIncreasing(counts: Array<number>): void {
|
||||
for (let index = 1; index < counts.length; index++) {
|
||||
expect(counts[index]).toBeLessThanOrEqual(counts[index - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
describe('Discovery Search and Join', () => {
|
||||
let harness: ApiTestHarness;
|
||||
beforeEach(async () => {
|
||||
harness = await createApiTestHarness({search: 'enabled'});
|
||||
});
|
||||
afterEach(async () => {
|
||||
clearWorkerDependencies();
|
||||
await harness?.shutdown();
|
||||
});
|
||||
describe('categories', () => {
|
||||
@@ -257,6 +316,82 @@ describe('Discovery Search and Join', () => {
|
||||
.execute();
|
||||
expect(results.guilds.length).toBeLessThanOrEqual(2);
|
||||
});
|
||||
test('should order results by the member count it reports back', async () => {
|
||||
const liveCounts = new Map<string, LiveGuildCounts>();
|
||||
setInjectedGatewayService(new LiveCountsGatewayService(liveCounts));
|
||||
const admin = await createTestAccount(harness);
|
||||
await setUserACLs(harness, admin, ['admin:authenticate', 'discovery:review']);
|
||||
const guildIds: Array<string> = [];
|
||||
for (const memberCount of [50, 40, 30, 20, 10]) {
|
||||
guildIds.push(
|
||||
await createApprovedDiscoveryGuild(harness, admin.token, `Ordered Guild ${memberCount}`, memberCount),
|
||||
);
|
||||
}
|
||||
liveCounts.set(guildIds[0], {memberCount: 5, onlineCount: 3});
|
||||
liveCounts.set(guildIds[4], {memberCount: 500, onlineCount: 7});
|
||||
const searcher = await createTestAccount(harness);
|
||||
const results = await createBuilder<DiscoveryGuildListResponse>(harness, searcher.token)
|
||||
.get('/discovery/guilds?sort_by=member_count&limit=48')
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
expect(results.guilds.map((guild) => guild.id)).toEqual(guildIds);
|
||||
expectNonIncreasing(results.guilds.map((guild) => guild.member_count));
|
||||
expect(results.guilds[0].online_count).toBe(3);
|
||||
expect(results.guilds[4].online_count).toBe(7);
|
||||
});
|
||||
test('should rank by member count when the client omits sort_by', async () => {
|
||||
const admin = await createTestAccount(harness);
|
||||
await setUserACLs(harness, admin, ['admin:authenticate', 'discovery:review']);
|
||||
const guildsByCount = new Map<number, string>();
|
||||
for (const memberCount of [30, 10, 20]) {
|
||||
guildsByCount.set(
|
||||
memberCount,
|
||||
await createApprovedDiscoveryGuild(harness, admin.token, `Unsorted Guild ${memberCount}`, memberCount),
|
||||
);
|
||||
}
|
||||
const searcher = await createTestAccount(harness);
|
||||
const results = await createBuilder<DiscoveryGuildListResponse>(harness, searcher.token)
|
||||
.get('/discovery/guilds?limit=48')
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
expect(results.guilds.map((guild) => guild.id)).toEqual([
|
||||
guildsByCount.get(30),
|
||||
guildsByCount.get(20),
|
||||
guildsByCount.get(10),
|
||||
]);
|
||||
expectNonIncreasing(results.guilds.map((guild) => guild.member_count));
|
||||
});
|
||||
test('should not repeat guilds across pages when the discovery index is resynced', async () => {
|
||||
const liveCounts = new Map<string, LiveGuildCounts>();
|
||||
const gatewayService = new LiveCountsGatewayService(liveCounts);
|
||||
setInjectedGatewayService(gatewayService);
|
||||
const admin = await createTestAccount(harness);
|
||||
await setUserACLs(harness, admin, ['admin:authenticate', 'discovery:review']);
|
||||
const guildIds: Array<string> = [];
|
||||
for (const [index, memberCount] of [60, 50, 40, 40, 30, 30].entries()) {
|
||||
guildIds.push(await createApprovedDiscoveryGuild(harness, admin.token, `Paged Guild ${index}`, memberCount));
|
||||
}
|
||||
const searcher = await createTestAccount(harness);
|
||||
const firstPage = await createBuilder<DiscoveryGuildListResponse>(harness, searcher.token)
|
||||
.get('/discovery/guilds?sort_by=member_count&limit=2&offset=0')
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
expect(firstPage.guilds.map((guild) => guild.id)).toEqual([guildIds[0], guildIds[1]]);
|
||||
liveCounts.set(guildIds[0], {memberCount: 5, onlineCount: 0});
|
||||
setWorkerDependenciesForTest({guildRepository: getGuildRepository(), gatewayService});
|
||||
await syncDiscoveryIndex({}, WORKER_HELPERS);
|
||||
const secondPage = await createBuilder<DiscoveryGuildListResponse>(harness, searcher.token)
|
||||
.get('/discovery/guilds?sort_by=member_count&limit=2&offset=2')
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
const thirdPage = await createBuilder<DiscoveryGuildListResponse>(harness, searcher.token)
|
||||
.get('/discovery/guilds?sort_by=member_count&limit=2&offset=4')
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
const paged = [...firstPage.guilds, ...secondPage.guilds, ...thirdPage.guilds].map((guild) => guild.id);
|
||||
expect(new Set(paged).size).toBe(paged.length);
|
||||
expect([...paged].sort()).toEqual([...guildIds].sort());
|
||||
});
|
||||
test('should require login to search', async () => {
|
||||
await createBuilderWithoutAuth(harness).get('/discovery/guilds').expect(HTTP_STATUS.UNAUTHORIZED).execute();
|
||||
});
|
||||
|
||||
@@ -27,25 +27,51 @@ interface EmailDnsValidationServiceOptions {
|
||||
enforceInTestMode?: boolean;
|
||||
positiveTtlMs?: number;
|
||||
negativeTtlMs?: number;
|
||||
lookupTimeoutMs?: number;
|
||||
maxCachedDomains?: number;
|
||||
isEmailEnabled?: () => Promise<boolean>;
|
||||
}
|
||||
|
||||
type DnsResolutionResult = 'valid' | 'invalid' | 'fallback' | 'transient_error';
|
||||
type DomainVerdict = 'valid' | 'invalid' | 'unverified';
|
||||
|
||||
const DOMAIN_NOT_FOUND_CODES = new Set(['ENOTFOUND', 'ENONAME', 'EAI_NONAME', 'NXDOMAIN']);
|
||||
const DOMAIN_NO_RECORD_CODES = new Set(['ENODATA', 'ENOENT', 'NODATA']);
|
||||
const DNS_LOOKUP_TIMEOUT_MS = 2000;
|
||||
const DNS_LOOKUP_TRIES = 1;
|
||||
const MAX_CACHED_DOMAINS = 10000;
|
||||
|
||||
async function isInstanceEmailEnabled(): Promise<boolean> {
|
||||
const {getInstanceConfigRepository} = await import('../middleware/ServiceSingletons');
|
||||
return getInstanceConfigRepository().isEmailEnabled();
|
||||
}
|
||||
|
||||
function createLookupTimeoutError(): NodeJS.ErrnoException {
|
||||
const error: NodeJS.ErrnoException = new Error('Email DNS lookup timed out');
|
||||
error.code = 'ETIMEOUT';
|
||||
return error;
|
||||
}
|
||||
|
||||
export class EmailDnsValidationService implements IEmailDnsValidationService {
|
||||
private readonly resolver: IDnsResolver;
|
||||
private readonly enforceInTestMode: boolean;
|
||||
private readonly positiveTtlMs: number;
|
||||
private readonly negativeTtlMs: number;
|
||||
private readonly lookupTimeoutMs: number;
|
||||
private readonly maxCachedDomains: number;
|
||||
private readonly isEmailEnabled: () => Promise<boolean>;
|
||||
private readonly domainCache = new Map<string, DomainValidationCacheEntry>();
|
||||
|
||||
constructor(options: EmailDnsValidationServiceOptions = {}) {
|
||||
this.resolver = options.resolver ?? new Resolver();
|
||||
this.lookupTimeoutMs = options.lookupTimeoutMs ?? DNS_LOOKUP_TIMEOUT_MS;
|
||||
this.resolver =
|
||||
options.resolver ??
|
||||
new Resolver({timeout: this.lookupTimeoutMs, tries: DNS_LOOKUP_TRIES, maxTimeout: this.lookupTimeoutMs});
|
||||
this.enforceInTestMode = options.enforceInTestMode ?? false;
|
||||
this.positiveTtlMs = options.positiveTtlMs ?? ms('30 minutes');
|
||||
this.negativeTtlMs = options.negativeTtlMs ?? ms('5 minutes');
|
||||
this.maxCachedDomains = options.maxCachedDomains ?? MAX_CACHED_DOMAINS;
|
||||
this.isEmailEnabled = options.isEmailEnabled ?? isInstanceEmailEnabled;
|
||||
}
|
||||
|
||||
async hasValidDnsRecords(email: string): Promise<boolean> {
|
||||
@@ -56,13 +82,19 @@ export class EmailDnsValidationService implements IEmailDnsValidationService {
|
||||
if (!domain) {
|
||||
return false;
|
||||
}
|
||||
if (!(await this.isEmailEnabled())) {
|
||||
return true;
|
||||
}
|
||||
const cached = this.getCachedDomainResult(domain);
|
||||
if (cached !== null) {
|
||||
return cached;
|
||||
}
|
||||
const isValid = await this.resolveDomain(domain);
|
||||
this.setCachedDomainResult(domain, isValid);
|
||||
return isValid;
|
||||
const verdict = await this.resolveDomain(domain);
|
||||
if (verdict === 'invalid') {
|
||||
Logger.warn({domain}, 'Email domain publishes no mail exchange or address records, rejecting the address');
|
||||
}
|
||||
this.setCachedDomainResult(domain, verdict);
|
||||
return verdict !== 'invalid';
|
||||
}
|
||||
|
||||
private extractDomain(email: string): string | null {
|
||||
@@ -82,41 +114,49 @@ export class EmailDnsValidationService implements IEmailDnsValidationService {
|
||||
this.domainCache.delete(domain);
|
||||
return null;
|
||||
}
|
||||
this.domainCache.delete(domain);
|
||||
this.domainCache.set(domain, cached);
|
||||
return cached.valid;
|
||||
}
|
||||
|
||||
private setCachedDomainResult(domain: string, isValid: boolean): void {
|
||||
const ttlMs = isValid ? this.positiveTtlMs : this.negativeTtlMs;
|
||||
private setCachedDomainResult(domain: string, verdict: DomainVerdict): void {
|
||||
const ttlMs = verdict === 'valid' ? this.positiveTtlMs : this.negativeTtlMs;
|
||||
if (this.domainCache.size >= this.maxCachedDomains && !this.domainCache.has(domain)) {
|
||||
const oldestDomain = this.domainCache.keys().next().value;
|
||||
if (oldestDomain !== undefined) {
|
||||
this.domainCache.delete(oldestDomain);
|
||||
}
|
||||
}
|
||||
this.domainCache.set(domain, {
|
||||
valid: isValid,
|
||||
valid: verdict !== 'invalid',
|
||||
expiresAtMs: Date.now() + ttlMs,
|
||||
});
|
||||
}
|
||||
|
||||
private async resolveDomain(domain: string): Promise<boolean> {
|
||||
private async resolveDomain(domain: string): Promise<DomainVerdict> {
|
||||
const mxResult = await this.resolveMx(domain);
|
||||
if (mxResult === 'valid') {
|
||||
return true;
|
||||
return 'valid';
|
||||
}
|
||||
if (mxResult === 'invalid') {
|
||||
return false;
|
||||
return 'invalid';
|
||||
}
|
||||
if (mxResult === 'transient_error') {
|
||||
return true;
|
||||
return 'unverified';
|
||||
}
|
||||
const addressResult = await this.resolveAddressRecords(domain);
|
||||
if (addressResult === 'valid') {
|
||||
return true;
|
||||
return 'valid';
|
||||
}
|
||||
if (addressResult === 'invalid') {
|
||||
return false;
|
||||
return 'invalid';
|
||||
}
|
||||
return true;
|
||||
return 'unverified';
|
||||
}
|
||||
|
||||
private async resolveMx(domain: string): Promise<DnsResolutionResult> {
|
||||
try {
|
||||
const records = await this.resolver.resolveMx(domain);
|
||||
const records = await this.withLookupDeadline(this.resolver.resolveMx(domain));
|
||||
if (records.length > 0) {
|
||||
return 'valid';
|
||||
}
|
||||
@@ -128,8 +168,8 @@ export class EmailDnsValidationService implements IEmailDnsValidationService {
|
||||
|
||||
private async resolveAddressRecords(domain: string): Promise<DnsResolutionResult> {
|
||||
const [ipv4Result, ipv6Result] = await Promise.allSettled([
|
||||
this.resolver.resolve4(domain),
|
||||
this.resolver.resolve6(domain),
|
||||
this.withLookupDeadline(this.resolver.resolve4(domain)),
|
||||
this.withLookupDeadline(this.resolver.resolve6(domain)),
|
||||
]);
|
||||
if (ipv4Result.status === 'fulfilled' && ipv4Result.value.length > 0) {
|
||||
return 'valid';
|
||||
@@ -147,6 +187,20 @@ export class EmailDnsValidationService implements IEmailDnsValidationService {
|
||||
return 'invalid';
|
||||
}
|
||||
|
||||
private async withLookupDeadline<T>(lookup: Promise<T>): Promise<T> {
|
||||
let timer: ReturnType<typeof setTimeout> | undefined;
|
||||
try {
|
||||
return await Promise.race([
|
||||
lookup,
|
||||
new Promise<never>((_resolve, reject) => {
|
||||
timer = setTimeout(() => reject(createLookupTimeoutError()), this.lookupTimeoutMs);
|
||||
}),
|
||||
]);
|
||||
} finally {
|
||||
clearTimeout(timer);
|
||||
}
|
||||
}
|
||||
|
||||
private classifyResolverError(
|
||||
error: unknown,
|
||||
domain: string,
|
||||
|
||||
@@ -324,9 +324,6 @@ export class LiveKitService extends ILiveKitService {
|
||||
participants: participants.map((participant) => ({identity: participant.identity})),
|
||||
};
|
||||
} catch (error) {
|
||||
if (LiveKitService.isHttp404(error)) {
|
||||
return {status: 'ok', participants: []};
|
||||
}
|
||||
Logger.warn({error, regionId, serverId, roomName}, 'LiveKit listParticipants failed');
|
||||
const status = LiveKitService.getHttpStatus(error);
|
||||
const isRetryable = status != null && status >= 500;
|
||||
|
||||
@@ -0,0 +1,220 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {ms} from 'itty-time';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
import {Config} from '../../Config';
|
||||
import {getInstanceConfigRepository} from '../../middleware/ServiceSingletons';
|
||||
import {EmailDnsValidationService} from '../EmailDnsValidationService';
|
||||
|
||||
interface MxRecord {
|
||||
exchange: string;
|
||||
priority: number;
|
||||
}
|
||||
|
||||
function dnsError(code: string): NodeJS.ErrnoException {
|
||||
const error: NodeJS.ErrnoException = new Error(`dns lookup failed with ${code}`);
|
||||
error.code = code;
|
||||
return error;
|
||||
}
|
||||
|
||||
class FakeDnsResolver {
|
||||
readonly lookups: Array<string> = [];
|
||||
mxRecords: Array<MxRecord> = [{exchange: 'mx.example.com', priority: 10}];
|
||||
mxErrorCode: string | null = null;
|
||||
addressErrorCode: string | null = 'ENOTFOUND';
|
||||
addresses: Array<string> = [];
|
||||
stall = false;
|
||||
|
||||
async resolveMx(domain: string): Promise<Array<MxRecord>> {
|
||||
this.lookups.push(`mx:${domain}`);
|
||||
if (this.stall) {
|
||||
return new Promise<Array<MxRecord>>(() => {});
|
||||
}
|
||||
if (this.mxErrorCode) {
|
||||
throw dnsError(this.mxErrorCode);
|
||||
}
|
||||
return this.mxRecords;
|
||||
}
|
||||
|
||||
async resolve4(domain: string): Promise<Array<string>> {
|
||||
this.lookups.push(`a:${domain}`);
|
||||
if (this.addressErrorCode) {
|
||||
throw dnsError(this.addressErrorCode);
|
||||
}
|
||||
return this.addresses;
|
||||
}
|
||||
|
||||
async resolve6(domain: string): Promise<Array<string>> {
|
||||
this.lookups.push(`aaaa:${domain}`);
|
||||
if (this.addressErrorCode) {
|
||||
throw dnsError(this.addressErrorCode);
|
||||
}
|
||||
return this.addresses;
|
||||
}
|
||||
}
|
||||
|
||||
describe('EmailDnsValidationService', () => {
|
||||
it('skips the lookup when the instance sends no mail', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
resolver.mxErrorCode = 'ENOTFOUND';
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => false,
|
||||
});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
expect(resolver.lookups).toEqual([]);
|
||||
});
|
||||
|
||||
it('looks the domain up when the instance sends mail', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => true,
|
||||
});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
expect(resolver.lookups).toEqual(['mx:gmail.com']);
|
||||
});
|
||||
|
||||
it('follows the env email flag when no gate is supplied and the operator set nothing', async () => {
|
||||
expect(Config.email.enabled).toBe(true);
|
||||
const resolver = new FakeDnsResolver();
|
||||
const service = new EmailDnsValidationService({resolver, enforceInTestMode: true});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
expect(resolver.lookups).toEqual(['mx:gmail.com']);
|
||||
});
|
||||
|
||||
it('follows the runtime instance email setting over the env flag', async () => {
|
||||
expect(Config.email.enabled).toBe(true);
|
||||
await getInstanceConfigRepository().setInstanceIntegrationsConfig({email: {enabled: false}});
|
||||
const resolver = new FakeDnsResolver();
|
||||
resolver.mxErrorCode = 'ENOTFOUND';
|
||||
const service = new EmailDnsValidationService({resolver, enforceInTestMode: true});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
expect(resolver.lookups).toEqual([]);
|
||||
});
|
||||
|
||||
it('still rejects a syntactically broken address when the instance sends no mail', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => false,
|
||||
});
|
||||
expect(await service.hasValidDnsRecords('probe@')).toBe(false);
|
||||
expect(resolver.lookups).toEqual([]);
|
||||
});
|
||||
|
||||
it('rejects a domain that does not exist', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
resolver.mxErrorCode = 'ENOTFOUND';
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => true,
|
||||
});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(false);
|
||||
expect(resolver.lookups).toEqual(['mx:asdf.asdf']);
|
||||
});
|
||||
|
||||
it('accepts a domain that publishes address records but no mail records', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
resolver.mxErrorCode = 'ENODATA';
|
||||
resolver.addressErrorCode = null;
|
||||
resolver.addresses = ['198.51.100.10'];
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => true,
|
||||
});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
expect(resolver.lookups).toEqual(['mx:mail-less.test', 'a:mail-less.test', 'aaaa:mail-less.test']);
|
||||
});
|
||||
|
||||
it('rejects a domain that publishes neither mail nor address records', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
resolver.mxErrorCode = 'ENODATA';
|
||||
resolver.addressErrorCode = 'ENODATA';
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => true,
|
||||
});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(false);
|
||||
expect(resolver.lookups).toEqual(['mx:no-records.test', 'a:no-records.test', 'aaaa:no-records.test']);
|
||||
});
|
||||
|
||||
it('allows the address when the resolver fails transiently', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
resolver.mxErrorCode = 'ESERVFAIL';
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => true,
|
||||
});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
});
|
||||
|
||||
it('does not cache a transient failure as a verified domain', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
resolver.mxErrorCode = 'ESERVFAIL';
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => true,
|
||||
positiveTtlMs: ms('30 minutes'),
|
||||
negativeTtlMs: 0,
|
||||
});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
expect(resolver.lookups).toEqual(['mx:asdf.asdf', 'mx:asdf.asdf']);
|
||||
});
|
||||
|
||||
it('caches a verified domain for the positive ttl', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => true,
|
||||
positiveTtlMs: ms('30 minutes'),
|
||||
negativeTtlMs: 0,
|
||||
});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
expect(resolver.lookups).toEqual(['mx:gmail.com']);
|
||||
});
|
||||
|
||||
it('gives up on a stalled resolver instead of hanging', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
resolver.stall = true;
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => true,
|
||||
lookupTimeoutMs: 10,
|
||||
});
|
||||
const startedAtMs = Date.now();
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(true);
|
||||
expect(Date.now() - startedAtMs).toBeLessThan(ms('5 seconds'));
|
||||
expect(resolver.lookups).toEqual(['mx:stalled.test']);
|
||||
});
|
||||
|
||||
it('bounds the domain cache', async () => {
|
||||
const resolver = new FakeDnsResolver();
|
||||
resolver.mxErrorCode = 'ENOTFOUND';
|
||||
const service = new EmailDnsValidationService({
|
||||
resolver,
|
||||
enforceInTestMode: true,
|
||||
isEmailEnabled: async () => true,
|
||||
maxCachedDomains: 2,
|
||||
});
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(false);
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(false);
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(false);
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(false);
|
||||
expect(resolver.lookups).toEqual(['mx:first.test', 'mx:second.test', 'mx:third.test']);
|
||||
expect(await service.hasValidDnsRecords('[email protected]')).toBe(false);
|
||||
expect(resolver.lookups).toEqual(['mx:first.test', 'mx:second.test', 'mx:third.test', 'mx:first.test']);
|
||||
});
|
||||
});
|
||||
@@ -2,7 +2,8 @@
|
||||
|
||||
import {AccessToken, TrackSource} from 'livekit-server-sdk';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
import {computeLiveKitPublishSources, VOICE_TOKEN_TTL_SECONDS} from '../LiveKitService';
|
||||
import {createChannelID, createGuildID} from '../../BrandedTypes';
|
||||
import {computeLiveKitPublishSources, LiveKitService, VOICE_TOKEN_TTL_SECONDS} from '../LiveKitService';
|
||||
|
||||
function decodeJwtPayload(token: string): Record<string, unknown> {
|
||||
const [, payload] = token.split('.');
|
||||
@@ -57,3 +58,78 @@ describe('LiveKitService publish permissions', () => {
|
||||
expect(exp - nowSeconds).toBeGreaterThan(0);
|
||||
});
|
||||
});
|
||||
|
||||
class FakeTwirpError extends Error {
|
||||
status: number;
|
||||
code?: string;
|
||||
constructor(message: string, status: number, code?: string) {
|
||||
super(message);
|
||||
this.name = 'TwirpError';
|
||||
this.status = status;
|
||||
this.code = code;
|
||||
}
|
||||
}
|
||||
|
||||
function createServiceWithRoomServiceClient(roomServiceClient: unknown): LiveKitService {
|
||||
const service = Object.create(LiveKitService.prototype) as LiveKitService;
|
||||
Reflect.set(
|
||||
service,
|
||||
'serverClients',
|
||||
new Map([
|
||||
[
|
||||
'region-1',
|
||||
new Map([
|
||||
[
|
||||
'region-1-server-1',
|
||||
{
|
||||
endpoint: 'ws://livekit.test/livekit',
|
||||
apiKey: 'test-key',
|
||||
apiSecret: 'test-secret',
|
||||
isActive: true,
|
||||
roomServiceClient,
|
||||
},
|
||||
],
|
||||
]),
|
||||
],
|
||||
]),
|
||||
);
|
||||
return service;
|
||||
}
|
||||
|
||||
describe('LiveKitService listParticipants', () => {
|
||||
const params = {
|
||||
guildId: createGuildID(1n),
|
||||
channelId: createChannelID(2n),
|
||||
regionId: 'region-1',
|
||||
serverId: 'region-1-server-1',
|
||||
};
|
||||
|
||||
it('reports a 404 as an unreadable room instead of an empty one', async () => {
|
||||
const service = createServiceWithRoomServiceClient({
|
||||
listParticipants: async () => {
|
||||
throw new FakeTwirpError('not_found', 404, 'not_found');
|
||||
},
|
||||
});
|
||||
const result = await service.listParticipants(params);
|
||||
expect(result.status).toBe('error');
|
||||
});
|
||||
|
||||
it('reports a bad_route 404 as an unreadable room instead of an empty one', async () => {
|
||||
const service = createServiceWithRoomServiceClient({
|
||||
listParticipants: async () => {
|
||||
throw new FakeTwirpError('invalid path prefix', 404, 'bad_route');
|
||||
},
|
||||
});
|
||||
const result = await service.listParticipants(params);
|
||||
expect(result.status).toBe('error');
|
||||
expect(result.status === 'error' && result.retryable).toBe(false);
|
||||
});
|
||||
|
||||
it('still reports a genuinely empty room as empty', async () => {
|
||||
const service = createServiceWithRoomServiceClient({
|
||||
listParticipants: async () => [],
|
||||
});
|
||||
const result = await service.listParticipants(params);
|
||||
expect(result).toEqual({status: 'ok', participants: []});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -63,8 +63,6 @@ describe('GatewayRolloutConfigPublisher', () => {
|
||||
gateway_dispatch_relay_shards: 32,
|
||||
gateway_dispatch_relay_max_queue: 50000,
|
||||
voice_e2ee_scope: 'guild_feature_only',
|
||||
voice_reconciliation_v3_percentage: 100,
|
||||
voice_reconciliation_v3_interval_ms: 2000,
|
||||
};
|
||||
|
||||
await publisher.publish(config);
|
||||
|
||||
@@ -42,8 +42,6 @@ const DEFAULT_GATEWAY_ROLLOUT_CONFIG: GatewayRolloutConfig = {
|
||||
gateway_dispatch_relay_shards: 32,
|
||||
gateway_dispatch_relay_max_queue: 50000,
|
||||
voice_e2ee_scope: 'guild_feature_only',
|
||||
voice_reconciliation_v3_percentage: 100,
|
||||
voice_reconciliation_v3_interval_ms: 2000,
|
||||
};
|
||||
export type InstanceRegistrationMode = 'open' | 'approval' | 'closed';
|
||||
export interface InstanceRegistrationConfig {
|
||||
|
||||
@@ -343,7 +343,7 @@ export class ReportService {
|
||||
const normalizedEmail = this.normalizeEmail(email);
|
||||
const hasValidDns = await this.emailDnsValidationService.hasValidDnsRecords(normalizedEmail);
|
||||
if (!hasValidDns) {
|
||||
throw InputValidationError.fromCode('email', ValidationErrorCodes.INVALID_EMAIL_ADDRESS);
|
||||
throw InputValidationError.fromCode('email', ValidationErrorCodes.EMAIL_DOMAIN_CANNOT_RECEIVE_MAIL);
|
||||
}
|
||||
const verificationCode = this.generateDsaVerificationCode();
|
||||
const expiresAt = new Date(Date.now() + ms('10 minutes'));
|
||||
|
||||
@@ -7,9 +7,14 @@ import {isTrustedCommercialPrivacyProvider} from './TrustedPrivacyProviders';
|
||||
|
||||
const VERDICT_CACHE_TTL_MS = 60 * 60 * 1000;
|
||||
|
||||
interface IpBanBlastRadiusVerdict {
|
||||
cgnat: boolean;
|
||||
sharedAccess: boolean;
|
||||
}
|
||||
|
||||
interface CachedVerdict {
|
||||
expiresAtMs: number;
|
||||
highRisk: boolean;
|
||||
verdict: IpBanBlastRadiusVerdict;
|
||||
}
|
||||
|
||||
const verdictCache = new Map<string, CachedVerdict>();
|
||||
@@ -48,7 +53,7 @@ export function getSuspiciousIpSkipReason(result: IpInfoLookupResult): Suspiciou
|
||||
return null;
|
||||
}
|
||||
|
||||
function isHighSharedAccessBlastRadiusRisk(result: IpInfoLookupResult): boolean {
|
||||
export function isHighSharedAccessBlastRadiusRisk(result: IpInfoLookupResult): boolean {
|
||||
if (result.flags.isHosting || isAnonymousAccess(result)) {
|
||||
return false;
|
||||
}
|
||||
@@ -60,29 +65,32 @@ export function isSingleIpBanCandidate(value: string): boolean {
|
||||
return parseIpBanEntry(value)?.type === 'single';
|
||||
}
|
||||
|
||||
export async function hasHighCgnatBlastRadiusRisk(
|
||||
export async function getIpBanBlastRadiusVerdict(
|
||||
ip: string,
|
||||
ipInfoService: IpInfoService,
|
||||
context: {
|
||||
source: string;
|
||||
reason: string;
|
||||
},
|
||||
): Promise<boolean> {
|
||||
): Promise<IpBanBlastRadiusVerdict> {
|
||||
const now = Date.now();
|
||||
const cacheKey = getSameIpDecisionKey(ip) ?? ip;
|
||||
const cached = verdictCache.get(cacheKey);
|
||||
if (cached && cached.expiresAtMs > now) {
|
||||
return cached.highRisk;
|
||||
return cached.verdict;
|
||||
}
|
||||
const result = await ipInfoService.lookup(ip, {
|
||||
source: context.source,
|
||||
reason: context.reason,
|
||||
metadata: {policy: 'ip_ban_cgnat_guard'},
|
||||
});
|
||||
const highRisk = isHighCgnatBlastRadiusRisk(result);
|
||||
const verdict: IpBanBlastRadiusVerdict = {
|
||||
cgnat: isHighCgnatBlastRadiusRisk(result),
|
||||
sharedAccess: isHighSharedAccessBlastRadiusRisk(result),
|
||||
};
|
||||
verdictCache.set(cacheKey, {
|
||||
highRisk,
|
||||
verdict,
|
||||
expiresAtMs: now + VERDICT_CACHE_TTL_MS,
|
||||
});
|
||||
return highRisk;
|
||||
return verdict;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
|
||||
import type {IpInfoLookupResult} from '@pkgs/geoip/src/IpInfoService';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
import {isHighCgnatBlastRadiusRisk, isSingleIpBanCandidate} from '../IpBanCgnatGuard';
|
||||
import {
|
||||
isHighCgnatBlastRadiusRisk,
|
||||
isHighSharedAccessBlastRadiusRisk,
|
||||
isSingleIpBanCandidate,
|
||||
} from '../IpBanCgnatGuard';
|
||||
|
||||
function ipInfoResult(overrides: Partial<IpInfoLookupResult> = {}): IpInfoLookupResult {
|
||||
return {
|
||||
@@ -96,4 +100,63 @@ describe('IpBanCgnatGuard', () => {
|
||||
),
|
||||
).toBe(false);
|
||||
});
|
||||
it('flags satellite, anycast and education networks as high blast-radius risk', () => {
|
||||
expect(
|
||||
isHighSharedAccessBlastRadiusRisk(
|
||||
ipInfoResult({
|
||||
flags: {isAnycast: false, isHosting: false, isMobile: false, isSatellite: true},
|
||||
}),
|
||||
),
|
||||
).toBe(true);
|
||||
expect(
|
||||
isHighSharedAccessBlastRadiusRisk(
|
||||
ipInfoResult({
|
||||
flags: {isAnycast: true, isHosting: false, isMobile: false, isSatellite: false},
|
||||
}),
|
||||
),
|
||||
).toBe(true);
|
||||
expect(
|
||||
isHighSharedAccessBlastRadiusRisk(
|
||||
ipInfoResult({asn: {asn: 'AS64500', number: 64500, name: 'Test University', domain: null, type: 'education'}}),
|
||||
),
|
||||
).toBe(true);
|
||||
});
|
||||
it('does not flag ordinary residential networks as shared-access risk', () => {
|
||||
expect(isHighSharedAccessBlastRadiusRisk(ipInfoResult())).toBe(false);
|
||||
});
|
||||
it('does not treat shared-access networks as CGNAT risk', () => {
|
||||
expect(
|
||||
isHighCgnatBlastRadiusRisk(
|
||||
ipInfoResult({
|
||||
flags: {isAnycast: false, isHosting: false, isMobile: false, isSatellite: true},
|
||||
}),
|
||||
),
|
||||
).toBe(false);
|
||||
});
|
||||
it('does not exempt hosting or anonymous shared-access infrastructure', () => {
|
||||
expect(
|
||||
isHighSharedAccessBlastRadiusRisk(
|
||||
ipInfoResult({
|
||||
flags: {isAnycast: true, isHosting: true, isMobile: false, isSatellite: false},
|
||||
}),
|
||||
),
|
||||
).toBe(false);
|
||||
expect(
|
||||
isHighSharedAccessBlastRadiusRisk(
|
||||
ipInfoResult({
|
||||
anonymous: {
|
||||
isAnonymous: true,
|
||||
providerName: 'Example VPN',
|
||||
isVpn: true,
|
||||
isProxy: false,
|
||||
isResidentialProxy: false,
|
||||
isTor: false,
|
||||
isRelay: false,
|
||||
percentDaysSeen: null,
|
||||
},
|
||||
flags: {isAnycast: false, isHosting: false, isMobile: false, isSatellite: true},
|
||||
}),
|
||||
),
|
||||
).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -344,7 +344,7 @@ describe('Message Search Permissions', () => {
|
||||
}
|
||||
expect(result.messages.length).toBe(0);
|
||||
});
|
||||
test('age-restricted guild requires include_nsfw: true', async () => {
|
||||
test('age-restricted guild is searchable by an adult member without include_nsfw', async () => {
|
||||
const owner = await createTestAccount(harness, {dateOfBirth: '2000-01-01'});
|
||||
const guild = await createGuild(harness, owner.token, 'Age Restricted Search Guild');
|
||||
const systemChannelId = guild.system_channel_id!;
|
||||
@@ -363,7 +363,7 @@ describe('Message Search Permissions', () => {
|
||||
if (!isSearchResult(excluded)) {
|
||||
expect.fail('Expected search result but got indexing response');
|
||||
}
|
||||
expect(excluded.messages.length).toBe(0);
|
||||
expect(excluded.messages.some((m) => m.channel_id === systemChannelId)).toBe(true);
|
||||
const included = await createBuilder<MessageSearchResponse>(harness, owner.token)
|
||||
.post('/search/messages')
|
||||
.body({
|
||||
@@ -379,6 +379,30 @@ describe('Message Search Permissions', () => {
|
||||
expect(included.messages.length).toBeGreaterThan(0);
|
||||
expect(included.messages.some((m) => m.channel_id === systemChannelId)).toBe(true);
|
||||
});
|
||||
test('age-restricted guild is searchable in a channel pinned to nsfw_override: false', async () => {
|
||||
const owner = await createTestAccount(harness, {dateOfBirth: '2000-01-01'});
|
||||
const guild = await createGuild(harness, owner.token, 'Age Restricted Override Guild');
|
||||
const channel = await createBuilder<{id: string; nsfw_override?: boolean | null}>(harness, owner.token)
|
||||
.post(`/guilds/${guild.id}/channels`)
|
||||
.body({name: 'override-channel', type: ChannelTypes.GUILD_TEXT, nsfw: false})
|
||||
.execute();
|
||||
expect(channel.nsfw_override).toBe(false);
|
||||
await sendChannelMessage(harness, owner.token, channel.id, 'age restricted override searchable message');
|
||||
await updateGuild(harness, owner.token, guild.id, {nsfw_level: GuildNSFWLevel.AGE_RESTRICTED});
|
||||
await markGuildChannelsAsIndexed(harness, owner.token, guild.id);
|
||||
const result = await createBuilder<MessageSearchResponse>(harness, owner.token)
|
||||
.post('/search/messages')
|
||||
.body({
|
||||
content: 'age restricted override searchable',
|
||||
context_guild_id: guild.id,
|
||||
})
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
if (!isSearchResult(result)) {
|
||||
expect.fail('Expected search result but got indexing response');
|
||||
}
|
||||
expect(result.messages.some((m) => m.channel_id === channel.id)).toBe(true);
|
||||
});
|
||||
test('underage user cannot search messages in an age-restricted guild', async () => {
|
||||
const owner = await createTestAccount(harness, {dateOfBirth: '2000-01-01'});
|
||||
const underageMember = await createTestAccount(harness, {dateOfBirth: '2012-01-01'});
|
||||
|
||||
@@ -441,16 +441,25 @@ function collectGuildText(doc: SearchableGuild): Array<string | null> {
|
||||
return [doc.name, doc.vanityUrlCode, doc.discoveryDescription, ...doc.discoveryTags];
|
||||
}
|
||||
|
||||
const sortGuildsByCreatedAt = sortNumericField<SearchableGuild, GuildSearchFilters>('createdAt', 'asc');
|
||||
const sortGuildsByMemberCount = sortNumericField<SearchableGuild, GuildSearchFilters>('memberCount', 'desc');
|
||||
|
||||
function sortGuilds(left: SearchableGuild, right: SearchableGuild, filters: GuildSearchFilters, query: string): number {
|
||||
const sorter = filters.sortBy === 'memberCount' ? sortGuildsByMemberCount : sortGuildsByCreatedAt;
|
||||
const delta = sorter(left, right, filters, query);
|
||||
if (delta !== 0) return delta;
|
||||
const leftId = BigInt(left.id);
|
||||
const rightId = BigInt(right.id);
|
||||
if (leftId === rightId) return 0;
|
||||
return leftId > rightId ? -1 : 1;
|
||||
}
|
||||
|
||||
class InMemoryGuildSearchService
|
||||
extends InMemorySearchServiceBase<GuildSearchFilters, SearchableGuild>
|
||||
implements IGuildSearchService
|
||||
{
|
||||
constructor() {
|
||||
super(
|
||||
matchesGuildFilters,
|
||||
collectGuildText,
|
||||
sortNumericField<SearchableGuild, GuildSearchFilters>('createdAt', 'asc'),
|
||||
);
|
||||
super(matchesGuildFilters, collectGuildText, sortGuilds);
|
||||
}
|
||||
|
||||
async indexGuild(guild: Guild, discovery?: GuildDiscoveryContext): Promise<void> {
|
||||
|
||||
@@ -178,7 +178,7 @@ export class EmailChangeService {
|
||||
}
|
||||
const hasValidDns = await emailDnsValidation.hasValidDnsRecords(trimmedEmail);
|
||||
if (!hasValidDns) {
|
||||
throw InputValidationError.fromCode('new_email', ValidationErrorCodes.INVALID_EMAIL_ADDRESS);
|
||||
throw InputValidationError.fromCode('new_email', ValidationErrorCodes.EMAIL_DOMAIN_CANNOT_RECEIVE_MAIL);
|
||||
}
|
||||
const existing = await users.findByEmail(trimmedEmail.toLowerCase());
|
||||
if (existing && existing.id !== user.id) {
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
import {DiscoveryApplicationStatus} from '@fluxer/constants/src/DiscoveryConstants';
|
||||
import type {WorkerTaskHandler} from '@pkgs/worker/src/contracts/WorkerTask';
|
||||
import type {GuildID} from '../../BrandedTypes';
|
||||
import {GuildDiscoveryRepository} from '../../guild/repositories/GuildDiscoveryRepository';
|
||||
import {getGuildSearchService} from '../../SearchFactory';
|
||||
import {mapWithConcurrency} from '../../utils/ConcurrencyUtils';
|
||||
@@ -17,7 +16,7 @@ const syncDiscoveryIndex: WorkerTaskHandler = async (_payload, helpers) => {
|
||||
helpers.logger.warn('Search service not available, skipping discovery index sync');
|
||||
return;
|
||||
}
|
||||
const {guildRepository, gatewayService} = getWorkerDependencies();
|
||||
const {guildRepository} = getWorkerDependencies();
|
||||
const discoveryRepository = new GuildDiscoveryRepository();
|
||||
const approvedRows = await discoveryRepository.listByStatus(DiscoveryApplicationStatus.APPROVED);
|
||||
if (approvedRows.length === 0) {
|
||||
@@ -25,21 +24,6 @@ const syncDiscoveryIndex: WorkerTaskHandler = async (_payload, helpers) => {
|
||||
return;
|
||||
}
|
||||
const guildIds = approvedRows.map((row) => row.guild_id);
|
||||
let freshCounts = new Map<
|
||||
GuildID,
|
||||
{
|
||||
memberCount: number;
|
||||
onlineCount: number;
|
||||
}
|
||||
>();
|
||||
try {
|
||||
freshCounts = await gatewayService.getDiscoveryGuildCounts(guildIds);
|
||||
} catch (error) {
|
||||
helpers.logger.warn(
|
||||
{error: error instanceof Error ? error.message : String(error)},
|
||||
'Failed to fetch fresh guild counts from gateway, using database values',
|
||||
);
|
||||
}
|
||||
let synced = 0;
|
||||
for (let i = 0; i < guildIds.length; i += BATCH_SIZE) {
|
||||
const batch = guildIds.slice(i, i + BATCH_SIZE);
|
||||
@@ -54,7 +38,7 @@ const syncDiscoveryIndex: WorkerTaskHandler = async (_payload, helpers) => {
|
||||
if (!guild) return null;
|
||||
const discoveryRow = discoveryRows[index];
|
||||
if (!discoveryRow || discoveryRow.status !== DiscoveryApplicationStatus.APPROVED) return null;
|
||||
return {guild, discoveryRow, counts: freshCounts.get(guildId)};
|
||||
return {guild, discoveryRow};
|
||||
})
|
||||
.filter((update): update is NonNullable<typeof update> => update != null);
|
||||
await mapWithConcurrency(updates, UPDATE_CONCURRENCY, (update) =>
|
||||
@@ -63,7 +47,6 @@ const syncDiscoveryIndex: WorkerTaskHandler = async (_payload, helpers) => {
|
||||
categoryId: update.discoveryRow.category_type,
|
||||
primaryLanguage: update.discoveryRow.primary_language ?? null,
|
||||
tags: update.discoveryRow.custom_tags ?? [],
|
||||
memberCount: update.counts?.memberCount,
|
||||
}),
|
||||
);
|
||||
synced += updates.length;
|
||||
|
||||
@@ -28,6 +28,12 @@ const MODULE_REGISTRY_TEST_FILES = [
|
||||
'src/api/risk/__tests__/AccountPolicyService.test.ts',
|
||||
];
|
||||
|
||||
const INSTANCE_POLICY_TEST_FILES = [
|
||||
'src/api/admin/tests/InstanceConfigPendingRegistrationApproval.test.ts',
|
||||
'src/api/auth/tests/DeferredPhoneGate.test.ts',
|
||||
'src/api/instance/tests/SingleCommunityService.test.ts',
|
||||
];
|
||||
|
||||
const sharedExclude = [
|
||||
...configDefaults.exclude,
|
||||
'pkgs/**',
|
||||
@@ -76,7 +82,7 @@ export default defineConfig({
|
||||
...sharedTestConfig,
|
||||
name: 'api',
|
||||
include: ['src/**/*.{test,spec}.{ts,tsx}'],
|
||||
exclude: [...sharedExclude, ...MODULE_REGISTRY_TEST_FILES],
|
||||
exclude: [...sharedExclude, ...MODULE_REGISTRY_TEST_FILES, ...INSTANCE_POLICY_TEST_FILES],
|
||||
isolate: false,
|
||||
},
|
||||
},
|
||||
@@ -90,6 +96,16 @@ export default defineConfig({
|
||||
isolate: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
plugins: [tsconfigPaths()],
|
||||
test: {
|
||||
...sharedTestConfig,
|
||||
name: 'api-instance-policy',
|
||||
include: INSTANCE_POLICY_TEST_FILES,
|
||||
exclude: sharedExclude,
|
||||
isolate: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
@@ -7,114 +7,65 @@
|
||||
|
||||
## Fluxer modifications
|
||||
|
||||
Changes applied on top of the upstream v2.17.2 source. Previously maintained as
|
||||
a pnpm patch at `patches/[email protected]`; now maintained as regular
|
||||
source edits in this package.
|
||||
Changes applied on top of the upstream v2.17.2 source. These were previously a pnpm patch at `patches/[email protected]` and are now plain source edits in this package.
|
||||
|
||||
1. **AV1 E2EE support** (`src/e2ee/worker/av1Crypto.ts`, `FrameCryptor.ts`, `e2ee.worker.ts`)
|
||||
OBU-level AV1 encryption and decryption for end-to-end encrypted voice/video.
|
||||
|
||||
OBU-level AV1 encryption and decryption for end-to-end encrypted voice and video.
|
||||
|
||||
2. **UpdateTrackContext message** (`src/e2ee/types.ts`, worker dispatch)
|
||||
Replaced `updateCodec` with richer `updateTrackContext` carrying participant
|
||||
identity and track ID, preventing codec mismatch on track reuse.
|
||||
|
||||
`updateCodec` replaced with `updateTrackContext`, which carries participant identity and track id so a reused track cannot pick up the wrong codec.
|
||||
|
||||
3. **E2EEManager state tracking** (`src/e2ee/E2eeManager.ts`)
|
||||
Added `getE2EETransformState()` / `setE2EETransformState()` for proper
|
||||
transform lifecycle management.
|
||||
|
||||
4. **Screenshare scalability mode** (`src/room/participant/LocalParticipant.ts`)
|
||||
Preserve caller-supplied `scalabilityMode` for screen shares instead of forcing
|
||||
`L3T3_KEY`, so VP9/AV1 screen shares can use the browser's compatible default
|
||||
unless Fluxer explicitly requests an SVC layer layout.
|
||||
`getE2EETransformState()` and `setE2EETransformState()` for transform lifecycle management.
|
||||
|
||||
4. **Screen share scalability mode** (`src/room/participant/LocalParticipant.ts`)
|
||||
|
||||
A caller-supplied `scalabilityMode` is preserved for screen shares instead of being forced to `L3T3_KEY`, so VP9 and AV1 screen shares use the browser default unless Fluxer asks for a specific SVC layout.
|
||||
|
||||
5. **E2EE frame layout guards** (`src/e2ee/worker/FrameCryptor.ts`)
|
||||
Validate encrypted frame trailer, IV, tag, and clear-prefix bounds before
|
||||
constructing typed-array views, and drop malformed encrypted frames without
|
||||
tearing down the transform stream.
|
||||
|
||||
Encrypted frame trailer, IV, tag and clear-prefix bounds are validated before any typed-array view is constructed, and malformed frames are dropped without tearing down the transform stream.
|
||||
|
||||
6. **Encrypted backup codec publishing** (`src/room/participant/LocalParticipant.ts`, `src/e2ee/E2eeManager.ts`)
|
||||
Allows backup codec tracks to be advertised and published while E2EE is
|
||||
enabled, and attaches sender transforms to backup codec senders using their
|
||||
cloned media track ID and codec.
|
||||
|
||||
Backup codec tracks can be advertised and published while E2EE is on, with sender transforms attached using the cloned media track id and codec.
|
||||
|
||||
7. **Publisher codec preferences** (`src/room/RTCEngine.ts`)
|
||||
Applies `RTCRtpTransceiver.setCodecPreferences()` to publisher transceivers
|
||||
so browser SDP follows the selected primary or backup codec, and prefers
|
||||
H.264 profiles that use Chromium's external/hardware encoder before the
|
||||
OpenH264 software profile.
|
||||
|
||||
`setCodecPreferences()` is applied to publisher transceivers so the browser's SDP follows the selected primary or backup codec. H.264 profiles rank Baseline `42001f` first, then Constrained Baseline `42e01f`, then everything else. Main, High and Constrained High rank last on purpose.
|
||||
|
||||
livekit-server registers H.264 High `640032` on the publisher peer connection but filters it off the subscriber peer connection, and its `CodecParametersFuzzySearch` falls back to a mime-only match. A High publication therefore reaches subscribers under their `42e01f` payload type and decodes to nothing on a Constrained-Baseline-only decoder such as Firefox's OpenH264 GMP. `42001f` is the one profile Chromium's accelerated encoder factory advertises that such a decoder can still handle, because Chromium's VAAPI encoder and OpenH264 both write a Constrained Baseline SPS for `H264PROFILE_BASELINE`.
|
||||
|
||||
The trade is that livekit-server does not register `42001f` either, so Windows and macOS negotiate `42e01f`, which Chromium's accelerated encoder factory does not advertise there (`kPlatformH264CbpEncoding` is off by default on Windows, and `IsH264ConstrainedBaselineProfileAvailableForAcceleratedEncoder` returns false on Apple). Those publishers fall back to software H.264, which is what an unpatched browser does anyway. Linux, ChromeOS and Android keep hardware encoding.
|
||||
|
||||
8. **Media publishing defaults** (`src/room/defaults.ts`, `src/room/utils.ts`, `src/room/track/options.ts`)
|
||||
Falls back to H.264, then VP9, VP8, AV1, and HEVC/H.265 according to actual
|
||||
sender capabilities, pairs advanced codecs with H.264 backup simulcast, and
|
||||
uses maintain-resolution screen-share defaults with a 4K60-ready bitrate cap.
|
||||
The order puts AV1 and HEVC last because both are opt-in in Fluxer, so a
|
||||
fallback inside `publishTrack` must not land on a codec the user did not
|
||||
enable. Fluxer picks the codec itself before publishing, so this list only
|
||||
applies when the client overrides the request, such as the reconnect
|
||||
republish that runs outside Fluxer's own flows.
|
||||
|
||||
Codec fallback follows actual sender capabilities in the order H.264, VP9, VP8, AV1, HEVC. Advanced codecs are paired with an H.264 backup simulcast, and screen shares default to maintain-resolution with a 4K60-ready bitrate cap. AV1 and HEVC come last because both are opt-in in Fluxer, so a fallback inside `publishTrack` must not land on a codec the user did not enable. Fluxer picks the codec itself before publishing, so this order only applies when the client overrides the request, such as the reconnect republish that runs outside Fluxer's own flows.
|
||||
|
||||
9. **High-fidelity Opus SDP munging** (`src/room/PCTransport.ts`)
|
||||
Forces Opus RED/FEC, stereo signaling, 10 ms packet time, no DTX, and a
|
||||
510 kbps maximum average bitrate in local offers and remote answers.
|
||||
|
||||
Local offers and remote answers are munged to force Opus RED and FEC, 10 ms packet time, no DTX, and a 510 kbps maximum average bitrate. Stereo signalling stays opt-in. `stereo=1` and `sprop-stereo=1` are added only for publications whose `TrackBitrateInfo.stereo` is set (studio mode above the stereo bitrate threshold, and screen-share audio) and for the subscriber mids the server advertised as stereo, so a mono microphone is not encoded and decoded as a two-channel stream.
|
||||
|
||||
10. **Remote audio volume restore at exactly zero** (`src/room/track/RemoteAudioTrack.ts`)
|
||||
`attach()`, `connectWebAudio()` and `getVolume()` guarded the remembered
|
||||
`elementVolume` with a truthiness check, so a track deliberately held at `0`
|
||||
came back at full volume whenever it was re-attached or its Web Audio graph
|
||||
was rebuilt. All three guards now test `!== undefined`. Note that remote
|
||||
gains above `1.0` are only legal because `setVolume()` takes the Web Audio
|
||||
`gainNode` branch; the `el.volume` branch would throw `IndexSizeError`.
|
||||
`webAudioMix` must stay unconditional.
|
||||
|
||||
`attach()`, `connectWebAudio()` and `getVolume()` guarded the remembered `elementVolume` with a truthiness check, so a track deliberately held at `0` came back at full volume whenever it was re-attached or its Web Audio graph was rebuilt. All three now test `!== undefined`. Remote gains above `1.0` are only legal because `setVolume()` takes the Web Audio `gainNode` branch, as the `el.volume` branch would throw `IndexSizeError`, so `webAudioMix` must stay unconditional.
|
||||
|
||||
11. **Processor teardown before source stop** (`src/room/track/LocalTrack.ts`)
|
||||
`stop()` called `super.stop()` first, killing the source `MediaStreamTrack`
|
||||
and closing the readable feeding a track processor before `processor.destroy()`
|
||||
ran. A camera-effect worker therefore saw input EOF before its owner's stop
|
||||
command and reported an operational failure during an ordinary camera-off.
|
||||
The processor is now captured, detached, and its teardown initiated before
|
||||
`super.stop()`.
|
||||
|
||||
12. **Transactional source and processor swaps** (`src/room/track/LocalTrack.ts`,
|
||||
`LocalVideoTrack.ts`, `LocalAudioTrack.ts`)
|
||||
`setMediaStreamTrack()` applied the new source, restarted the processor and
|
||||
re-armed the sender with no unwind path, so a failure anywhere in the middle
|
||||
left a half-applied track: listeners moved, elements detached, sender pointing
|
||||
at a dead track. It now takes `SetMediaStreamTrackOptions`
|
||||
(`force`, `deferEndedListener`, `preservePreviousTrack`) and, on failure,
|
||||
restores the previous source, constraints, `enabled` state, listeners,
|
||||
processor and sender, throwing `TrackInvalidError` when the previous source is
|
||||
no longer `live` because an ended track cannot be restored. Both errors are
|
||||
surfaced together as an `AggregateError` when the unwind itself fails.
|
||||
`stageTrackReplacement()` / `commitStagedTrackReplacement()` expose a two-phase
|
||||
swap: the candidate becomes the active source with its `ended` listener
|
||||
deferred and the previous source preserved, and only the commit adopts the
|
||||
`ended` listener and clears the staged identity, so a caller can validate its
|
||||
publication before the swap is observable. `replaceTrack()` and `restart()`
|
||||
guard the `providedByUser` flip behind a `replacementCommitted` flag.
|
||||
`restart()` still detaches and stops the previous source before calling
|
||||
`getUserMedia()`, as upstream does, because Safari ends a freshly acquired
|
||||
track with a capture failure while the old track for the same device is
|
||||
live. `setSimulcastTrackSender()` routes an already-installed processor's
|
||||
`processedTrack` to a newly registered secondary sender so a backup codec
|
||||
never publishes raw frames while the primary is processed.
|
||||
Processor install and teardown in all three classes roll the processed/raw
|
||||
sender track back, including `LocalVideoTrack`'s secondary simulcast senders,
|
||||
and aggregate every cleanup failure instead of discarding it.
|
||||
`stop()` called `super.stop()` first, killing the source `MediaStreamTrack` and closing the readable that feeds a track processor before `processor.destroy()` ran. A camera-effect worker therefore saw input EOF before its owner's stop command and reported an operational failure during an ordinary camera-off. The processor is now captured, detached and torn down before `super.stop()`.
|
||||
|
||||
13. **Start bitrate for every video codec** (`src/room/PCTransport.ts`,
|
||||
`src/room/participant/LocalParticipant.ts`, `src/room/participant/publishUtils.ts`)
|
||||
`x-google-start-bitrate` was reachable only by AV1 and VP9, gated twice: the
|
||||
publish path registered a track bitrate only for SVC codecs, and the offer
|
||||
munging returned early for everything else. H264, H265 and VP8 therefore
|
||||
opened at the Chromium default and had to ramp, which showed up as a 3000 kbps
|
||||
screen share encoding at 346 kbps twenty seconds in. The bitrate is now
|
||||
registered for every video codec from the highest encoding
|
||||
(`maxEncodingBitrate()`, so a simulcast ladder contributes its top layer), and
|
||||
the offer munging applies the start bitrate whenever a max bitrate is known.
|
||||
The dependency descriptor extension stays SVC-only.
|
||||
`appendStartBitrateToFmtp()` holds the fmtp edit so it can be tested, and
|
||||
`setTrackCodecBitrate()` now replaces an entry for the same cid or transceiver
|
||||
instead of appending, since `trackBitrates` is never cleared.
|
||||
12. **Transactional source and processor swaps** (`src/room/track/LocalTrack.ts`, `LocalVideoTrack.ts`, `LocalAudioTrack.ts`)
|
||||
|
||||
`setMediaStreamTrack()` applied the new source, restarted the processor and re-armed the sender with no unwind path, so a failure part-way through left a half-applied track with listeners moved, elements detached and the sender pointing at a dead track. It now takes `SetMediaStreamTrackOptions` (`force`, `deferEndedListener`, `preservePreviousTrack`) and, on failure, restores the previous source, constraints, `enabled` state, listeners, processor and sender. It throws `TrackInvalidError` when the previous source is no longer `live`, because an ended track cannot be restored, and surfaces both failures as an `AggregateError` when the unwind itself fails.
|
||||
|
||||
`stageTrackReplacement()` and `commitStagedTrackReplacement()` add a two-phase swap. The candidate becomes the active source with its `ended` listener deferred and the previous source preserved, and only the commit adopts the `ended` listener and clears the staged identity, so a caller can validate its publication before the swap is observable. `replaceTrack()` and `restart()` guard the `providedByUser` flip behind a `replacementCommitted` flag. `restart()` still detaches and stops the previous source before calling `getUserMedia()`, as upstream does, because Safari ends a freshly acquired track with a capture failure while the old track for the same device is still live. `setSimulcastTrackSender()` routes an installed processor's `processedTrack` to a newly registered secondary sender so a backup codec never publishes raw frames while the primary is processed. Processor install and teardown in all three classes roll the processed and raw sender track back, including `LocalVideoTrack`'s secondary simulcast senders, and aggregate every cleanup failure instead of discarding it.
|
||||
|
||||
13. **Start bitrate for every video codec** (`src/room/PCTransport.ts`, `src/room/participant/LocalParticipant.ts`, `src/room/participant/publishUtils.ts`)
|
||||
|
||||
`x-google-start-bitrate` was reachable only by AV1 and VP9 because it was gated twice. The publish path registered a track bitrate only for SVC codecs, and the offer munging returned early for everything else. H.264, H.265 and VP8 therefore opened at the Chromium default and had to ramp, which showed up as a 3000 kbps screen share encoding at 346 kbps twenty seconds in. The bitrate is now registered for every video codec from the highest encoding (`maxEncodingBitrate()`, so a simulcast ladder contributes its top layer), and the offer munging applies it whenever a max bitrate is known. The dependency descriptor extension stays SVC-only. `appendStartBitrateToFmtp()` holds the fmtp edit so it can be tested, and `setTrackCodecBitrate()` replaces an entry for the same cid or transceiver instead of appending, since `trackBitrates` is never cleared.
|
||||
|
||||
## Updating from upstream
|
||||
|
||||
|
||||
@@ -3,12 +3,43 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
import type {MediaDescription} from 'sdp-transform';
|
||||
import {describe, expect, it} from 'vitest';
|
||||
import {appendStartBitrateToFmtp} from './PCTransport.ts';
|
||||
import type {TrackBitrateInfo} from './PCTransport.ts';
|
||||
import {appendStartBitrateToFmtp, collectStereoMids, ensureAudioNackAndStereo, ensureOpusFmtp} from './PCTransport.ts';
|
||||
|
||||
function mediaWithFmtp(entries: Array<{payload: number; config: string}>): MediaDescription {
|
||||
return {fmtp: entries} as unknown as MediaDescription;
|
||||
}
|
||||
|
||||
function opusMedia(config: string, mid = '0'): MediaDescription {
|
||||
return {
|
||||
type: 'audio',
|
||||
mid,
|
||||
port: 9,
|
||||
protocol: 'UDP/TLS/RTP/SAVPF',
|
||||
rtp: [{payload: 109, codec: 'opus', rate: 48000, encoding: 2}],
|
||||
fmtp: [{payload: 109, config}],
|
||||
} as unknown as MediaDescription;
|
||||
}
|
||||
|
||||
function offerMedia(mid: string, trackId: string): MediaDescription {
|
||||
const media = opusMedia('useinbandfec=1', mid);
|
||||
media.msid = `- ${trackId}`;
|
||||
return media;
|
||||
}
|
||||
|
||||
function audioBitrateInfo(mid: string | null, trackId: string, stereo: boolean): TrackBitrateInfo {
|
||||
return {
|
||||
transceiver: {mid, sender: {track: {id: trackId}}} as unknown as RTCRtpTransceiver,
|
||||
codec: 'opus',
|
||||
maxbr: 320,
|
||||
stereo,
|
||||
};
|
||||
}
|
||||
|
||||
function opusConfig(media: MediaDescription): string {
|
||||
return media.fmtp.find((fmtp) => fmtp.payload === 109)?.config ?? '';
|
||||
}
|
||||
|
||||
describe('appendStartBitrateToFmtp', () => {
|
||||
it('appends the start bitrate to a non-SVC codec fmtp line', () => {
|
||||
const media = mediaWithFmtp([
|
||||
@@ -44,3 +75,72 @@ describe('appendStartBitrateToFmtp', () => {
|
||||
expect(media.fmtp[0]?.config).toBe('profile-level-id=42e01f');
|
||||
});
|
||||
});
|
||||
|
||||
describe('ensureOpusFmtp', () => {
|
||||
it('does not force stereo on a mono publication', () => {
|
||||
const media = opusMedia('maxplaybackrate=48000;stereo=0;useinbandfec=1');
|
||||
ensureOpusFmtp(media, 48000, false);
|
||||
const config = opusConfig(media);
|
||||
expect(config).toContain('minptime=10');
|
||||
expect(config).toContain('useinbandfec=1');
|
||||
expect(config).toContain('usedtx=0');
|
||||
expect(config).toContain('maxaveragebitrate=48000');
|
||||
expect(config).not.toContain('stereo=1');
|
||||
});
|
||||
|
||||
it('keeps stereo for a stereo publication', () => {
|
||||
const media = opusMedia('maxplaybackrate=48000;useinbandfec=1');
|
||||
ensureOpusFmtp(media, 320000, true);
|
||||
const config = opusConfig(media);
|
||||
expect(config).toContain('stereo=1');
|
||||
expect(config).toContain('sprop-stereo=1');
|
||||
expect(config).toContain('maxaveragebitrate=320000');
|
||||
});
|
||||
|
||||
it('preserves a stereo parameter the server negotiated', () => {
|
||||
const media = opusMedia('minptime=10;stereo=1');
|
||||
ensureOpusFmtp(media, 48000, false);
|
||||
expect(opusConfig(media)).toContain('stereo=1');
|
||||
});
|
||||
});
|
||||
|
||||
describe('ensureAudioNackAndStereo', () => {
|
||||
it('only stamps stereo on the listed mids', () => {
|
||||
const mono = opusMedia('useinbandfec=1', '0');
|
||||
ensureAudioNackAndStereo(mono as never, ['1'], []);
|
||||
expect(opusConfig(mono)).not.toContain('stereo=1');
|
||||
|
||||
const stereo = opusMedia('useinbandfec=1', '1');
|
||||
ensureAudioNackAndStereo(stereo as never, ['1'], []);
|
||||
expect(opusConfig(stereo)).toContain('stereo=1');
|
||||
expect(opusConfig(stereo)).toContain('sprop-stereo=1');
|
||||
});
|
||||
});
|
||||
|
||||
describe('collectStereoMids', () => {
|
||||
it('matches the offer media section by msid before the transceiver has a mid', () => {
|
||||
const media = [offerMedia('0', 'mic-track'), offerMedia('1', 'screenshare-track')];
|
||||
expect(collectStereoMids([audioBitrateInfo(null, 'screenshare-track', true)], media)).toEqual(['1']);
|
||||
});
|
||||
|
||||
it('stamps stereo on the first offer for a new stereo publication', () => {
|
||||
const media = [offerMedia('0', 'mic-track'), offerMedia('1', 'screenshare-track')];
|
||||
const stereoMids = collectStereoMids([audioBitrateInfo(null, 'screenshare-track', true)], media);
|
||||
for (const m of media) {
|
||||
ensureAudioNackAndStereo(m as never, stereoMids, []);
|
||||
}
|
||||
expect(opusConfig(media[0]!)).not.toContain('stereo=1');
|
||||
expect(opusConfig(media[1]!)).toContain('stereo=1');
|
||||
expect(opusConfig(media[1]!)).toContain('sprop-stereo=1');
|
||||
});
|
||||
|
||||
it('uses the assigned mid once renegotiation has one', () => {
|
||||
const media = [offerMedia('0', 'mic-track'), offerMedia('1', 'screenshare-track')];
|
||||
expect(collectStereoMids([audioBitrateInfo('1', 'screenshare-track', true)], media)).toEqual(['1']);
|
||||
});
|
||||
|
||||
it('leaves mono publications out', () => {
|
||||
const media = [offerMedia('0', 'mic-track')];
|
||||
expect(collectStereoMids([audioBitrateInfo(null, 'mic-track', false)], media)).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -11,11 +11,12 @@ import {NegotiationError, UnexpectedConnectionState} from './errors.ts';
|
||||
import type {LoggerOptions} from './types.ts';
|
||||
import {ddExtensionURI, isFireFox, isSafari, isSVCCodec} from './utils.ts';
|
||||
|
||||
interface TrackBitrateInfo {
|
||||
export interface TrackBitrateInfo {
|
||||
cid?: string;
|
||||
transceiver?: RTCRtpTransceiver;
|
||||
codec: string;
|
||||
maxbr: number;
|
||||
stereo?: boolean;
|
||||
}
|
||||
|
||||
const startBitrateFraction = 0.7;
|
||||
@@ -25,8 +26,6 @@ const requiredOpusFmtpParameters = {
|
||||
minptime: '10',
|
||||
useinbandfec: '1',
|
||||
usedtx: '0',
|
||||
stereo: '1',
|
||||
'sprop-stereo': '1',
|
||||
};
|
||||
const debounceInterval = 20;
|
||||
export const PCEvents = {
|
||||
@@ -156,20 +155,18 @@ export default class PCTransport extends EventEmitter {
|
||||
sdpParsed.media.forEach((media) => {
|
||||
const mid = getMidString(media.mid!);
|
||||
if (media.type === 'audio') {
|
||||
ensureOpusFmtp(media);
|
||||
this.trackBitrates.some((trackbr): boolean => {
|
||||
if (!trackbr.transceiver || mid !== trackbr.transceiver.mid) {
|
||||
return false;
|
||||
}
|
||||
const codecPayload = getCodecPayload(media, trackbr.codec);
|
||||
if (codecPayload === 0) {
|
||||
return true;
|
||||
}
|
||||
if (trackbr.codec.toLowerCase() === 'opus') {
|
||||
ensureOpusFmtp(media, trackbr.maxbr > 0 ? trackbr.maxbr * 1000 : opusMaxAverageBitrateBps);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
const trackbr = this.trackBitrates.find(
|
||||
(br) => br.transceiver !== undefined && mid === br.transceiver.mid && br.codec.toLowerCase() === 'opus',
|
||||
);
|
||||
if (trackbr && getCodecPayload(media, trackbr.codec) !== 0) {
|
||||
ensureOpusFmtp(
|
||||
media,
|
||||
trackbr.maxbr > 0 ? trackbr.maxbr * 1000 : opusMaxAverageBitrateBps,
|
||||
trackbr.stereo === true,
|
||||
);
|
||||
} else {
|
||||
ensureOpusFmtp(media);
|
||||
}
|
||||
}
|
||||
});
|
||||
mungedSDP = write(sdpParsed);
|
||||
@@ -240,10 +237,11 @@ export default class PCTransport extends EventEmitter {
|
||||
const offer = await this.pc.createOffer(options);
|
||||
this.log.debug('original offer', {sdp: offer.sdp, ...this.logContext});
|
||||
const sdpParsed = parse(offer.sdp ?? '');
|
||||
const stereoMids = collectStereoMids(this.trackBitrates, sdpParsed.media);
|
||||
sdpParsed.media.forEach((media) => {
|
||||
ensureIPAddrMatchVersion(media);
|
||||
if (media.type === 'audio') {
|
||||
ensureAudioNackAndStereo(media, ['all'], []);
|
||||
ensureAudioNackAndStereo(media, stereoMids, []);
|
||||
} else if (media.type === 'video') {
|
||||
this.trackBitrates.some((trackbr): boolean => {
|
||||
if (!media.msid || !trackbr.cid || !media.msid.includes(trackbr.cid)) {
|
||||
@@ -587,7 +585,11 @@ function ensureAudioRedFmtp(media: MediaDescription, opusPayload: number): void
|
||||
}
|
||||
}
|
||||
|
||||
function ensureOpusFmtp(media: MediaDescription, maxAverageBitrateBps: number = opusMaxAverageBitrateBps): number {
|
||||
export function ensureOpusFmtp(
|
||||
media: MediaDescription,
|
||||
maxAverageBitrateBps: number = opusMaxAverageBitrateBps,
|
||||
stereo = false,
|
||||
): number {
|
||||
const opusPayload = getCodecPayload(media, 'opus');
|
||||
if (opusPayload <= 0) return 0;
|
||||
media.ptime = opusPacketTimeMs;
|
||||
@@ -596,6 +598,10 @@ function ensureOpusFmtp(media: MediaDescription, maxAverageBitrateBps: number =
|
||||
for (const [key, value] of Object.entries(requiredOpusFmtpParameters)) {
|
||||
config = setFmtpParameter(config, key, value);
|
||||
}
|
||||
if (stereo) {
|
||||
config = setFmtpParameter(config, 'stereo', '1');
|
||||
config = setFmtpParameter(config, 'sprop-stereo', '1');
|
||||
}
|
||||
if (maxAverageBitrateBps > 0) {
|
||||
config = setFmtpParameter(config, 'maxaveragebitrate', String(maxAverageBitrateBps));
|
||||
}
|
||||
@@ -604,18 +610,18 @@ function ensureOpusFmtp(media: MediaDescription, maxAverageBitrateBps: number =
|
||||
return opusPayload;
|
||||
}
|
||||
|
||||
function ensureAudioNackAndStereo(
|
||||
export function ensureAudioNackAndStereo(
|
||||
media: {
|
||||
type: string;
|
||||
port: number;
|
||||
protocol: string;
|
||||
payloads?: string | undefined;
|
||||
} & MediaDescription,
|
||||
_stereoMids: Array<string>,
|
||||
stereoMids: Array<string>,
|
||||
nackMids: Array<string>,
|
||||
) {
|
||||
const mid = getMidString(media.mid!);
|
||||
const opusPayload = ensureOpusFmtp(media);
|
||||
const opusPayload = ensureOpusFmtp(media, opusMaxAverageBitrateBps, stereoMids.includes(mid));
|
||||
if (opusPayload > 0) {
|
||||
if (!media.rtcpFb) {
|
||||
media.rtcpFb = [];
|
||||
@@ -629,6 +635,32 @@ function ensureAudioNackAndStereo(
|
||||
}
|
||||
}
|
||||
|
||||
export function collectStereoMids(
|
||||
trackBitrates: Array<TrackBitrateInfo>,
|
||||
media: Array<MediaDescription>,
|
||||
): Array<string> {
|
||||
const stereoMids: Array<string> = [];
|
||||
for (const trackbr of trackBitrates) {
|
||||
if (trackbr.stereo !== true || !trackbr.transceiver) {
|
||||
continue;
|
||||
}
|
||||
if (trackbr.transceiver.mid) {
|
||||
stereoMids.push(getMidString(trackbr.transceiver.mid));
|
||||
continue;
|
||||
}
|
||||
const trackId = trackbr.transceiver.sender.track?.id;
|
||||
if (trackId === undefined) {
|
||||
continue;
|
||||
}
|
||||
for (const m of media) {
|
||||
if (m.type === 'audio' && m.mid !== undefined && m.msid?.includes(trackId)) {
|
||||
stereoMids.push(getMidString(m.mid));
|
||||
}
|
||||
}
|
||||
}
|
||||
return stereoMids;
|
||||
}
|
||||
|
||||
function extractStereoAndNackAudioFromOffer(offer: RTCSessionDescriptionInit): {
|
||||
stereoMids: Array<string>;
|
||||
nackMids: Array<string>;
|
||||
|
||||
@@ -27,7 +27,59 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
const highProfile = codec('video/H264', 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f');
|
||||
const rtx = codec('video/rtx');
|
||||
const preferences = selectPublisherCodecPreferences('h264', [openH264, rtx, externalBaseline, highProfile]);
|
||||
expect(preferences).toEqual([externalBaseline, highProfile, openH264, rtx]);
|
||||
expect(preferences).toEqual([externalBaseline, openH264, highProfile, rtx]);
|
||||
});
|
||||
|
||||
it('ranks Constrained Baseline above Main, High and Constrained High', () => {
|
||||
const constrainedBaseline = codec(
|
||||
'video/H264',
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f',
|
||||
);
|
||||
const mainProfile = codec('video/H264', 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f');
|
||||
const highProfileLevel31 = codec(
|
||||
'video/H264',
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f',
|
||||
);
|
||||
const highProfileLevel51 = codec(
|
||||
'video/H264',
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640033',
|
||||
);
|
||||
const constrainedHigh = codec(
|
||||
'video/H264',
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640c1f',
|
||||
);
|
||||
const preferences = selectPublisherCodecPreferences('h264', [
|
||||
mainProfile,
|
||||
highProfileLevel31,
|
||||
highProfileLevel51,
|
||||
constrainedHigh,
|
||||
constrainedBaseline,
|
||||
]);
|
||||
expect(preferences).toEqual([
|
||||
constrainedBaseline,
|
||||
mainProfile,
|
||||
highProfileLevel31,
|
||||
highProfileLevel51,
|
||||
constrainedHigh,
|
||||
]);
|
||||
});
|
||||
|
||||
it('keeps Constrained Baseline packetization-mode=1 ahead of Constrained Baseline packetization-mode=0 and High', () => {
|
||||
const constrainedBaselineMode0 = codec(
|
||||
'video/H264',
|
||||
'level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f',
|
||||
);
|
||||
const constrainedBaselineMode1 = codec(
|
||||
'video/H264',
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f',
|
||||
);
|
||||
const highProfile = codec('video/H264', 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640033');
|
||||
const preferences = selectPublisherCodecPreferences('h264', [
|
||||
highProfile,
|
||||
constrainedBaselineMode0,
|
||||
constrainedBaselineMode1,
|
||||
]);
|
||||
expect(preferences).toEqual([constrainedBaselineMode1, constrainedBaselineMode0, highProfile]);
|
||||
});
|
||||
|
||||
it('keeps non-H.264 codecs in browser capability order and appends RTX', () => {
|
||||
|
||||
@@ -96,7 +96,7 @@ const videoCodecMimeTypes: Record<VideoCodec, Array<string>> = {
|
||||
vp8: ['video/vp8'],
|
||||
};
|
||||
const h264OpenH264ProfileLevelId = '42e01f';
|
||||
const h264PreferredHardwareProfileLevelIds = new Set(['42001f', '4d001f', '64001f']);
|
||||
const h264PreferredHardwareProfileLevelIds = new Set(['42001f']);
|
||||
type RtpCodecCapability = RTCRtpCapabilities['codecs'][number] & {sdpFmtpLine?: string};
|
||||
|
||||
enum PCState {
|
||||
@@ -1656,8 +1656,8 @@ function getH264PublisherCodecScore(codec: RtpCodecCapability): number {
|
||||
const packetizationMode = getFmtpParameter(codec.sdpFmtpLine, 'packetization-mode');
|
||||
const packetizationScore = packetizationMode === '1' ? 0 : 1;
|
||||
if (profileLevelId && h264PreferredHardwareProfileLevelIds.has(profileLevelId)) return packetizationScore;
|
||||
if (profileLevelId && profileLevelId !== h264OpenH264ProfileLevelId) return 10 + packetizationScore;
|
||||
if (profileLevelId === h264OpenH264ProfileLevelId) return 20 + packetizationScore;
|
||||
if (profileLevelId === h264OpenH264ProfileLevelId) return 10 + packetizationScore;
|
||||
if (profileLevelId) return 20 + packetizationScore;
|
||||
return 30 + packetizationScore;
|
||||
}
|
||||
|
||||
|
||||
@@ -1040,6 +1040,7 @@ export default class LocalParticipant extends Participant {
|
||||
transceiver: trackTransceiver,
|
||||
codec: 'opus',
|
||||
maxbr: encodings[0]?.maxBitrate ? encodings[0].maxBitrate / 1000 : 0,
|
||||
stereo: isStereo,
|
||||
});
|
||||
}
|
||||
} else if (track.codec) {
|
||||
|
||||
@@ -25,7 +25,6 @@ import * as ModalCommands from '@app/features/ui/commands/ModalCommands';
|
||||
import {modal} from '@app/features/ui/commands/ModalCommands';
|
||||
import * as PopoutCommands from '@app/features/ui/commands/PopoutCommands';
|
||||
import * as TextCopyCommands from '@app/features/ui/commands/TextCopyCommands';
|
||||
import * as ToastCommands from '@app/features/ui/commands/ToastCommands';
|
||||
import {MockAvatar} from '@app/features/ui/components/MockAvatar';
|
||||
import {StatusIndicator} from '@app/features/ui/components/StatusIndicator';
|
||||
import FocusRing from '@app/features/ui/focus_ring/FocusRing';
|
||||
@@ -52,9 +51,8 @@ import Users from '@app/features/user/state/Users';
|
||||
import * as NicknameUtils from '@app/features/user/utils/NicknameUtils';
|
||||
import * as ProfileDisplayUtils from '@app/features/user/utils/ProfileDisplayUtils';
|
||||
import {createMockProfile} from '@app/features/user/utils/ProfileUtils';
|
||||
import {COPIED_STATS_JSON_DESCRIPTOR} from '@app/features/voice/components/StatsForNerdsCopyDescriptors';
|
||||
import {copyVoiceDiagnostics} from '@app/features/voice/commands/VoiceDiagnosticsCommands';
|
||||
import MediaEngine from '@app/features/voice/engine/MediaEngineFacade';
|
||||
import {buildStatsForNerdsCopyPayload, collectStatsForNerdsSnapshot} from '@app/features/voice/utils/StatsForNerdsCopy';
|
||||
import {MEDIA_PROXY_PROFILE_BANNER_SIZE_POPOUT} from '@fluxer/constants/src/MediaProxyAssetSizes';
|
||||
import {StatusTypes} from '@fluxer/constants/src/StatusConstants';
|
||||
import type {MessageDescriptor} from '@lingui/core';
|
||||
@@ -462,12 +460,7 @@ export const UserAreaPopout = observer(() => {
|
||||
});
|
||||
}, [i18n]);
|
||||
const handleCopyStats = useCallback(() => {
|
||||
const data = collectStatsForNerdsSnapshot();
|
||||
void buildStatsForNerdsCopyPayload(data).then((payload) => {
|
||||
void navigator.clipboard.writeText(JSON.stringify(payload, null, 2)).then(() => {
|
||||
ToastCommands.createToast({type: 'success', children: i18n._(COPIED_STATS_JSON_DESCRIPTOR)});
|
||||
});
|
||||
});
|
||||
void copyVoiceDiagnostics(i18n);
|
||||
}, [i18n]);
|
||||
const handleCopyUserTag = useCallback(() => {
|
||||
if (!currentUser) {
|
||||
|
||||
@@ -1277,6 +1277,7 @@ const SKELETON_NAGBAR_ROW_SHAPES: Record<NagbarType, SkeletonNagbarRowShape> = {
|
||||
[NagbarType.PREMIUM_ONBOARDING]: {tone: SkeletonNagbarTone.BRAND, hasActions: true},
|
||||
[NagbarType.GIFT_INVENTORY]: {tone: SkeletonNagbarTone.BRAND, hasActions: true},
|
||||
[NagbarType.DESKTOP_DOWNLOAD]: {tone: SkeletonNagbarTone.BRAND, hasActions: true},
|
||||
[NagbarType.DESKTOP_UPDATE_READY]: {tone: SkeletonNagbarTone.BRAND, hasActions: true},
|
||||
[NagbarType.GUILD_MEMBERSHIP_CTA]: {tone: SkeletonNagbarTone.BRAND, hasActions: true},
|
||||
[NagbarType.VISIONARY_MFA]: {tone: SkeletonNagbarTone.BRAND, hasActions: true},
|
||||
[NagbarType.VOICE_SESSION_RESTORE]: {tone: SkeletonNagbarTone.VOICE, hasActions: true},
|
||||
|
||||
@@ -11,6 +11,7 @@ import Config from '@app/features/app/config/Config';
|
||||
import {isClientReconnecting} from '@app/features/app/state/ClientReadiness';
|
||||
import Initialization from '@app/features/app/state/Initialization';
|
||||
import RuntimeConfig from '@app/features/app/state/RuntimeConfig';
|
||||
import Updater from '@app/features/app/state/Updater';
|
||||
import Authentication from '@app/features/auth/state/Authentication';
|
||||
import Channels from '@app/features/channel/state/Channels';
|
||||
import DeveloperOptions from '@app/features/devtools/state/DeveloperOptions';
|
||||
@@ -230,6 +231,7 @@ export const useNagbarConditions = (): NagbarConditions => {
|
||||
const canShowLinuxInputAccess = NativePermission.shouldShowLinuxInputAccessNagbar;
|
||||
const canShowSoftwareEncoder = SoftwareEncoderWarning.showWarning;
|
||||
const canShowStreamerMode = StreamerMode.shouldShowNagbar;
|
||||
const canShowDesktopUpdateReady = Updater.shouldShowUpdateReadyNagbar;
|
||||
const canShowBuildEnvironment =
|
||||
!BUILD_ENVIRONMENT_HIDDEN_RELEASE_CHANNELS.has(Config.PUBLIC_RELEASE_CHANNEL) &&
|
||||
!nagbarState.buildEnvironmentDismissedThisSession;
|
||||
@@ -288,6 +290,7 @@ export const useNagbarConditions = (): NagbarConditions => {
|
||||
canShowLinuxInputAccess,
|
||||
canShowSoftwareEncoder,
|
||||
canShowStreamerMode,
|
||||
canShowDesktopUpdateReady,
|
||||
};
|
||||
};
|
||||
export const useActiveNagbars = (conditions: NagbarConditions): Array<NagbarState> => {
|
||||
@@ -407,6 +410,12 @@ export const useActiveNagbars = (conditions: NagbarConditions): Array<NagbarStat
|
||||
visible: conditions.canShowStreamerMode,
|
||||
dismissible: true,
|
||||
},
|
||||
{
|
||||
type: NagbarType.DESKTOP_UPDATE_READY,
|
||||
priority: -1.5,
|
||||
visible: conditions.canShowDesktopUpdateReady,
|
||||
dismissible: true,
|
||||
},
|
||||
];
|
||||
return selectVisibleNagbars(nagbars);
|
||||
}, [conditions]);
|
||||
|
||||
@@ -15,6 +15,7 @@ export const NagbarType = {
|
||||
PREMIUM_ONBOARDING: 'premium-onboarding',
|
||||
GIFT_INVENTORY: 'gift-inventory',
|
||||
DESKTOP_DOWNLOAD: 'desktop-download',
|
||||
DESKTOP_UPDATE_READY: 'desktop-update-ready',
|
||||
GUILD_MEMBERSHIP_CTA: 'guild-membership-cta',
|
||||
VISIONARY_MFA: 'visionary-mfa',
|
||||
VOICE_SESSION_RESTORE: 'voice-session-restore',
|
||||
@@ -50,6 +51,7 @@ export interface NagbarConditions {
|
||||
canShowPremiumOnboarding: boolean;
|
||||
canShowGiftInventory: boolean;
|
||||
canShowDesktopDownload: boolean;
|
||||
canShowDesktopUpdateReady: boolean;
|
||||
canShowGuildMembershipCta: boolean;
|
||||
canShowVisionaryMfa: boolean;
|
||||
canShowVoiceSessionRestore: boolean;
|
||||
|
||||
@@ -7,6 +7,7 @@ import {ConnectionNagbar} from '@app/features/app/components/layout/app_layout/n
|
||||
import {CorruptedInstallationNagbar} from '@app/features/app/components/layout/app_layout/nagbars/CorruptedInstallationNagbar';
|
||||
import {DesktopDownloadNagbar} from '@app/features/app/components/layout/app_layout/nagbars/DesktopDownloadNagbar';
|
||||
import {DesktopNotificationNagbar} from '@app/features/app/components/layout/app_layout/nagbars/DesktopNotificationNagbar';
|
||||
import {DesktopUpdateReadyNagbar} from '@app/features/app/components/layout/app_layout/nagbars/DesktopUpdateReadyNagbar';
|
||||
import {EmailVerificationNagbar} from '@app/features/app/components/layout/app_layout/nagbars/EmailVerificationNagbar';
|
||||
import {GiftInventoryNagbar} from '@app/features/app/components/layout/app_layout/nagbars/GiftInventoryNagbar';
|
||||
import {GuildMembershipCtaNagbar} from '@app/features/app/components/layout/app_layout/nagbars/GuildMembershipCtaNagbar';
|
||||
@@ -153,6 +154,14 @@ export const NagbarContainer: React.FC<NagbarContainerProps> = observer(({nagbar
|
||||
data-flx="app.app-layout.nagbar-container.desktop-download-nagbar"
|
||||
/>
|
||||
);
|
||||
case NagbarType.DESKTOP_UPDATE_READY:
|
||||
return (
|
||||
<DesktopUpdateReadyNagbar
|
||||
key={nagbar.type}
|
||||
isMobile={mobileLayout.enabled}
|
||||
data-flx="app.app-layout.nagbar-container.desktop-update-ready-nagbar"
|
||||
/>
|
||||
);
|
||||
case NagbarType.GUILD_MEMBERSHIP_CTA:
|
||||
return (
|
||||
<GuildMembershipCtaNagbar
|
||||
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {Nagbar} from '@app/features/app/components/layout/Nagbar';
|
||||
import {NagbarButton} from '@app/features/app/components/layout/NagbarButton';
|
||||
import {NagbarContent} from '@app/features/app/components/layout/NagbarContent';
|
||||
import {NAGBAR_TONES, NagbarToneKind} from '@app/features/app/components/layout/NagbarTones';
|
||||
import {PRODUCT_NAME} from '@app/features/app/config/I18nDisplayConstants';
|
||||
import Updater from '@app/features/app/state/Updater';
|
||||
import {
|
||||
DESKTOP_VERSION_HAS_BEEN_DOWNLOADED_DESCRIPTOR,
|
||||
RESTART_FLUXER_DESCRIPTOR,
|
||||
THE_DESKTOP_UPDATE_HAS_BEEN_DOWNLOADED_DESCRIPTOR,
|
||||
} from '@app/features/updater/commands/UpdaterModalCommands';
|
||||
import {useLingui} from '@lingui/react/macro';
|
||||
import {observer} from 'mobx-react-lite';
|
||||
|
||||
export const DesktopUpdateReadyNagbar = observer(({isMobile}: {isMobile: boolean}) => {
|
||||
const {i18n} = useLingui();
|
||||
const version = Updater.updateInfo.native.version;
|
||||
return (
|
||||
<Nagbar
|
||||
isMobile={isMobile}
|
||||
backgroundColor={NAGBAR_TONES[NagbarToneKind.BRAND].backgroundColor}
|
||||
textColor={NAGBAR_TONES[NagbarToneKind.BRAND].textColor}
|
||||
dismissible
|
||||
onDismiss={Updater.dismissUpdateReadyNagbar}
|
||||
data-flx="app.app-layout.nagbars.desktop-update-ready-nagbar.nagbar"
|
||||
>
|
||||
<NagbarContent
|
||||
isMobile={isMobile}
|
||||
onDismiss={Updater.dismissUpdateReadyNagbar}
|
||||
message={
|
||||
version
|
||||
? i18n._(DESKTOP_VERSION_HAS_BEEN_DOWNLOADED_DESCRIPTOR, {version, productName: PRODUCT_NAME})
|
||||
: i18n._(THE_DESKTOP_UPDATE_HAS_BEEN_DOWNLOADED_DESCRIPTOR, {productName: PRODUCT_NAME})
|
||||
}
|
||||
actions={
|
||||
<NagbarButton
|
||||
isMobile={isMobile}
|
||||
onClick={() => void Updater.applyUpdate()}
|
||||
data-flx="app.app-layout.nagbars.desktop-update-ready-nagbar.restart-button"
|
||||
>
|
||||
{i18n._(RESTART_FLUXER_DESCRIPTOR, {productName: PRODUCT_NAME})}
|
||||
</NagbarButton>
|
||||
}
|
||||
data-flx="app.app-layout.nagbars.desktop-update-ready-nagbar.nagbar-content"
|
||||
/>
|
||||
</Nagbar>
|
||||
);
|
||||
});
|
||||
@@ -3,6 +3,7 @@
|
||||
import * as Modal from '@app/features/app/components/dialogs/Modal';
|
||||
import styles from '@app/features/app/components/setup/SelfHostedSetupWizardGate.module.css';
|
||||
import {
|
||||
classifySetupUnauthorized,
|
||||
fetchInstanceConfig,
|
||||
type SetupBrandingAssetKind,
|
||||
testSmtpConfig,
|
||||
@@ -55,6 +56,7 @@ import {fileToBase64} from '@app/features/user/utils/AvatarUtils';
|
||||
import * as FormUtils from '@app/lib/forms';
|
||||
import {type ThemeType, ThemeTypes} from '@fluxer/constants/src/UserConstants';
|
||||
import type {InstanceConfigResponse} from '@fluxer/schema/src/domains/admin/AdminSchemas';
|
||||
import type {MessageDescriptor} from '@lingui/core';
|
||||
import {msg} from '@lingui/core/macro';
|
||||
import {useLingui} from '@lingui/react/macro';
|
||||
import {ArrowLeftIcon, ArrowRightIcon, CheckIcon, WrenchIcon} from '@phosphor-icons/react';
|
||||
@@ -92,6 +94,11 @@ const LOAD_ERROR_DESCRIPTOR = msg({
|
||||
message: 'Could not load the instance configuration. Try reloading the page.',
|
||||
comment: 'Error shown when the setup wizard fails to load the instance configuration.',
|
||||
});
|
||||
const ORIGIN_MISMATCH_DESCRIPTOR = msg({
|
||||
message:
|
||||
'The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload.',
|
||||
comment: 'Error shown when the setup wizard cannot load because the API origin differs from the page origin.',
|
||||
});
|
||||
const ASSET_UPLOAD_ERROR_DESCRIPTOR = msg({
|
||||
message: 'That image could not be used. Try a different file.',
|
||||
comment: 'Error shown when a branding image fails to upload in the setup wizard.',
|
||||
@@ -425,7 +432,7 @@ export const SelfHostedSetupWizardGate = observer(() => {
|
||||
const stepNavigationUnlockTimerRef = useRef<number | null>(null);
|
||||
|
||||
const [config, setConfig] = useState<InstanceConfigResponse | null>(null);
|
||||
const [loadError, setLoadError] = useState(false);
|
||||
const [loadError, setLoadError] = useState<MessageDescriptor | null>(null);
|
||||
const [submitting, setSubmitting] = useState(false);
|
||||
const [submitError, setSubmitError] = useState<string | null>(null);
|
||||
const [stepNavigationLocked, setStepNavigationLocked] = useState(false);
|
||||
@@ -531,11 +538,11 @@ export const SelfHostedSetupWizardGate = observer(() => {
|
||||
}, [authStoreAuthenticated, forceUnauthenticatedSetup]);
|
||||
|
||||
const resetStaleSetupSession = useCallback(async () => {
|
||||
logger.warn('Instance config fetch returned 401 during setup; clearing stale local setup session');
|
||||
logger.warn('The setup session token was rejected. Clearing the stale local setup session.');
|
||||
setForceUnauthenticatedSetup(true);
|
||||
registerFormDraftsRef.current.clear();
|
||||
setConfig(null);
|
||||
setLoadError(false);
|
||||
setLoadError(null);
|
||||
setSubmitError(null);
|
||||
setSubmitting(false);
|
||||
setWizardSnapshot(createSetupWizardSnapshot());
|
||||
@@ -605,7 +612,7 @@ export const SelfHostedSetupWizardGate = observer(() => {
|
||||
useEffect(() => {
|
||||
if (!isAuthenticated || config) return;
|
||||
let cancelled = false;
|
||||
setLoadError(false);
|
||||
setLoadError(null);
|
||||
void (async () => {
|
||||
try {
|
||||
const next = await fetchInstanceConfig();
|
||||
@@ -613,12 +620,15 @@ export const SelfHostedSetupWizardGate = observer(() => {
|
||||
hydrateFromConfig(next);
|
||||
} catch (error) {
|
||||
if (cancelled) return;
|
||||
if (error instanceof HttpError && error.status === 401) {
|
||||
const cause =
|
||||
error instanceof HttpError && error.status === 401 ? await classifySetupUnauthorized() : 'unknown';
|
||||
if (cancelled) return;
|
||||
if (cause === 'stale_session') {
|
||||
await resetStaleSetupSession();
|
||||
return;
|
||||
}
|
||||
logger.error('Failed to load instance configuration', error);
|
||||
setLoadError(true);
|
||||
setLoadError(cause === 'origin_mismatch' ? ORIGIN_MISMATCH_DESCRIPTOR : LOAD_ERROR_DESCRIPTOR);
|
||||
}
|
||||
})();
|
||||
return () => {
|
||||
@@ -868,7 +878,7 @@ export const SelfHostedSetupWizardGate = observer(() => {
|
||||
role="alert"
|
||||
data-flx="app.self-hosted-setup-wizard-gate.load-error"
|
||||
>
|
||||
{i18n._(LOAD_ERROR_DESCRIPTOR)}
|
||||
{i18n._(loadError)}
|
||||
</p>
|
||||
</div>
|
||||
) : (
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {Endpoints} from '@app/features/app/constants/Endpoints';
|
||||
import SessionManager from '@app/features/platform/state/AuthSession';
|
||||
import {http} from '@app/features/platform/transport/RestTransport';
|
||||
import {Logger} from '@app/features/platform/utils/AppLogger';
|
||||
import type {
|
||||
BrandingAssetUploadRequest,
|
||||
InstanceConfigResponse,
|
||||
@@ -10,6 +12,8 @@ import type {
|
||||
InstanceEmailSmtpTestResponse,
|
||||
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
|
||||
|
||||
const logger = new Logger('SetupWizardClient');
|
||||
|
||||
export type SetupBrandingAssetKind = BrandingAssetUploadRequest['kind'];
|
||||
|
||||
export async function fetchInstanceConfig(): Promise<InstanceConfigResponse> {
|
||||
@@ -35,3 +39,17 @@ export async function testSmtpConfig(body: InstanceEmailSmtpTestRequest): Promis
|
||||
const response = await http.post<InstanceEmailSmtpTestResponse>(Endpoints.ADMIN_INSTANCE_CONFIG_SMTP_TESTS, {body});
|
||||
return response.body;
|
||||
}
|
||||
|
||||
export type SetupUnauthorizedCause = 'stale_session' | 'origin_mismatch' | 'unknown';
|
||||
|
||||
export async function classifySetupUnauthorized(): Promise<SetupUnauthorizedCause> {
|
||||
if (!SessionManager.token) return 'unknown';
|
||||
if (!http.carriesAuthorization()) return 'origin_mismatch';
|
||||
try {
|
||||
const response = await http.get(Endpoints.USER_ME, {mode: 'silent'});
|
||||
return response.status === 401 ? 'stale_session' : 'unknown';
|
||||
} catch (error) {
|
||||
logger.warn('Could not confirm whether the setup session is still valid', error);
|
||||
return 'unknown';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
// @vitest-environment happy-dom
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {installVoiceMenuTestBootstrap} from '@app/features/ui/action_menu/items/__fixtures__/VoiceMenuTestBootstrap';
|
||||
import type {UpdaterEvent} from '@app/types/electron.d';
|
||||
import {afterEach, describe, expect, test, vi} from 'vitest';
|
||||
|
||||
const {pushUpdateReadyModal} = vi.hoisted(() => ({pushUpdateReadyModal: vi.fn()}));
|
||||
|
||||
vi.mock('@app/features/updater/commands/UpdaterModalCommands', () => ({
|
||||
pushDesktopUpdateDownloadFailedModal: vi.fn(),
|
||||
pushDesktopUpdateInstallFailedModal: vi.fn(),
|
||||
pushManualUpdateAvailableModal: vi.fn(),
|
||||
pushUnsupportedUpdateModal: vi.fn(),
|
||||
pushUpdateAvailableModal: vi.fn(),
|
||||
pushUpdateCheckFailedModal: vi.fn(),
|
||||
pushUpdateReadyModal,
|
||||
pushUpToDateModal: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('@lingui/core/macro', () => ({
|
||||
msg: (descriptor: {message: string}) => descriptor,
|
||||
}));
|
||||
|
||||
vi.mock('@app/features/platform/utils/ClientInfo', () => ({
|
||||
getClientInfo: () =>
|
||||
Promise.resolve({desktopVersion: '1.0.0', desktopChannel: 'canary', desktopArch: 'x64', arch: 'x64'}),
|
||||
}));
|
||||
|
||||
installVoiceMenuTestBootstrap();
|
||||
|
||||
let nativeEventListener: ((event: UpdaterEvent) => void) | null = null;
|
||||
let onUpdaterCheck: (() => void) | null = null;
|
||||
let loadedUpdater: {dispose: () => void} | null = null;
|
||||
|
||||
function installElectronApi(): void {
|
||||
nativeEventListener = null;
|
||||
onUpdaterCheck = null;
|
||||
(window as unknown as {electron: unknown}).electron = {
|
||||
platform: 'win32',
|
||||
buildChannel: 'canary',
|
||||
onUpdaterEvent: (listener: (event: UpdaterEvent) => void) => {
|
||||
nativeEventListener = listener;
|
||||
return () => {
|
||||
nativeEventListener = null;
|
||||
};
|
||||
},
|
||||
updaterCheck: () => {
|
||||
onUpdaterCheck?.();
|
||||
return Promise.resolve();
|
||||
},
|
||||
updaterDownload: () => Promise.resolve(),
|
||||
updaterInstall: () => Promise.resolve(),
|
||||
};
|
||||
}
|
||||
|
||||
function emit(event: UpdaterEvent): void {
|
||||
if (!nativeEventListener) throw new Error('Updater never subscribed to native updater events');
|
||||
nativeEventListener(event);
|
||||
}
|
||||
|
||||
async function loadUpdater() {
|
||||
vi.resetModules();
|
||||
installElectronApi();
|
||||
const {default: Updater} = await import('@app/features/app/state/Updater');
|
||||
loadedUpdater = Updater;
|
||||
await vi.waitFor(() => {
|
||||
expect(nativeEventListener).not.toBeNull();
|
||||
expect(Updater.lastCheckedAt).not.toBeNull();
|
||||
});
|
||||
pushUpdateReadyModal.mockClear();
|
||||
return Updater;
|
||||
}
|
||||
|
||||
function emitUserDownloadCompletion(version: string): void {
|
||||
emit({type: 'available', context: 'user', version, downloadSize: 1000, downloadStarted: true});
|
||||
emit({type: 'downloaded', context: 'user', version});
|
||||
}
|
||||
|
||||
afterEach(() => {
|
||||
loadedUpdater?.dispose();
|
||||
loadedUpdater = null;
|
||||
});
|
||||
|
||||
describe('updater update-ready surface', () => {
|
||||
test('does not push a blocking modal when a user-initiated download finishes outside a check', async () => {
|
||||
const Updater = await loadUpdater();
|
||||
emitUserDownloadCompletion('2.0.0');
|
||||
expect(Updater.nativeUpdateReady).toBe(true);
|
||||
expect(pushUpdateReadyModal).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
test('announces the ready update through a dismissible nagbar instead', async () => {
|
||||
const Updater = await loadUpdater();
|
||||
expect(Updater.shouldShowUpdateReadyNagbar).toBe(false);
|
||||
emitUserDownloadCompletion('2.0.0');
|
||||
expect(Updater.shouldShowUpdateReadyNagbar).toBe(true);
|
||||
Updater.dismissUpdateReadyNagbar();
|
||||
expect(Updater.shouldShowUpdateReadyNagbar).toBe(false);
|
||||
emit({type: 'downloaded', context: 'background', version: '2.1.0'});
|
||||
expect(Updater.shouldShowUpdateReadyNagbar).toBe(true);
|
||||
});
|
||||
|
||||
test('still answers a user-initiated check with the update ready modal', async () => {
|
||||
const Updater = await loadUpdater();
|
||||
emitUserDownloadCompletion('2.0.0');
|
||||
pushUpdateReadyModal.mockClear();
|
||||
onUpdaterCheck = () => emit({type: 'available', context: 'user', version: '2.0.0', downloadStarted: false});
|
||||
await Updater.checkForUpdates(true, true);
|
||||
expect(pushUpdateReadyModal).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
@@ -131,6 +131,7 @@ class Updater {
|
||||
private backgroundCheckInterval: number | null = null;
|
||||
private backgroundCheckCleanups: Array<() => void> = [];
|
||||
private unsubscribeNativeEvents: (() => void) | null = null;
|
||||
private updateReadyNagbarDismissedVersion: string | null = null;
|
||||
|
||||
constructor() {
|
||||
makeAutoObservable(this, {}, {autoBind: true});
|
||||
@@ -193,6 +194,18 @@ class Updater {
|
||||
return this.updateInfo.native.available && this.updateInfo.native.downloaded;
|
||||
}
|
||||
|
||||
get shouldShowUpdateReadyNagbar(): boolean {
|
||||
return (
|
||||
this.nativeUpdateReady &&
|
||||
!this.updateInfo.native.installing &&
|
||||
this.updateReadyNagbarDismissedVersion !== this.updateReadyNagbarVersionKey
|
||||
);
|
||||
}
|
||||
|
||||
private get updateReadyNagbarVersionKey(): string {
|
||||
return this.updateInfo.native.version ?? 'unknown';
|
||||
}
|
||||
|
||||
get nativeDownloadInFlight(): boolean {
|
||||
return this.updateInfo.native.downloading && !this.updateInfo.native.downloaded;
|
||||
}
|
||||
@@ -348,9 +361,6 @@ class Updater {
|
||||
break;
|
||||
}
|
||||
this.transition({type: 'native.downloaded', version: event.version ?? null});
|
||||
if (shouldShowImmediateUserResult) {
|
||||
this.showCurrentUpdateState();
|
||||
}
|
||||
break;
|
||||
case 'progress':
|
||||
if (!shouldSurfaceNativeDesktopUpdate || !this.nativeDownloadProgressSupported) {
|
||||
@@ -661,6 +671,10 @@ class Updater {
|
||||
}
|
||||
}
|
||||
|
||||
dismissUpdateReadyNagbar(): void {
|
||||
this.updateReadyNagbarDismissedVersion = this.updateReadyNagbarVersionKey;
|
||||
}
|
||||
|
||||
reset(): void {
|
||||
this.transition({type: 'reset'});
|
||||
}
|
||||
|
||||
+1
@@ -83,6 +83,7 @@ const EMAIL_VALIDATION_CODES = new Set<string>([
|
||||
ValidationErrorCodes.INVALID_EMAIL_FORMAT,
|
||||
ValidationErrorCodes.INVALID_EMAIL_LOCAL_PART,
|
||||
ValidationErrorCodes.INVALID_EMAIL_ADDRESS,
|
||||
ValidationErrorCodes.EMAIL_DOMAIN_CANNOT_RECEIVE_MAIL,
|
||||
]);
|
||||
const CODE_SESSION_VALIDATION_CODES = new Set<string>([
|
||||
ValidationErrorCodes.EMAIL_TOKEN_EXPIRED,
|
||||
|
||||
@@ -99,9 +99,10 @@ export const DiscoveryPage = observer(function DiscoveryPage() {
|
||||
return Math.min(SKELETON_DISCOVERY_MAX_COLUMNS, Math.max(1, columnsThatFit));
|
||||
}, [containerWidth, zoomLevel]);
|
||||
const guilds = Discovery.guilds;
|
||||
const loadedCount = Discovery.loadedCount;
|
||||
const searchActive = Discovery.query.length > 0;
|
||||
const rowCount = columns > 0 ? Math.ceil(guilds.length / columns) : 0;
|
||||
const hasMore = guilds.length < Discovery.total;
|
||||
const hasMore = loadedCount < Discovery.total;
|
||||
const virtualizer = useVirtualizer({
|
||||
count: rowCount,
|
||||
getScrollElement: () => scrollerRef.current?.getViewportElement() ?? null,
|
||||
@@ -114,10 +115,10 @@ export const DiscoveryPage = observer(function DiscoveryPage() {
|
||||
return;
|
||||
}
|
||||
void Discovery.search({
|
||||
offset: guilds.length,
|
||||
offset: loadedCount,
|
||||
limit: PAGE_SIZE,
|
||||
});
|
||||
}, [guilds.length, hasMore]);
|
||||
}, [loadedCount, hasMore]);
|
||||
useEffect(() => {
|
||||
const items = virtualizer.getVirtualItems();
|
||||
const lastItem = items[items.length - 1];
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import type {DiscoveryGuild, DiscoverySearchResponse} from '@app/features/discovery/commands/DiscoveryCommands';
|
||||
import * as DiscoveryCommands from '@app/features/discovery/commands/DiscoveryCommands';
|
||||
import {beforeEach, describe, expect, test, vi} from 'vitest';
|
||||
|
||||
import Discovery from './Discovery';
|
||||
|
||||
vi.mock('@app/features/discovery/commands/DiscoveryCommands', () => ({
|
||||
searchGuilds: vi.fn(),
|
||||
getCategories: vi.fn(),
|
||||
}));
|
||||
|
||||
function guild(id: string, memberCount: number): DiscoveryGuild {
|
||||
return {
|
||||
id,
|
||||
name: `Guild ${id}`,
|
||||
icon: null,
|
||||
banner: null,
|
||||
description: null,
|
||||
category_type: 0,
|
||||
primary_language: null,
|
||||
custom_tags: [],
|
||||
member_count: memberCount,
|
||||
online_count: 0,
|
||||
features: [],
|
||||
verification_level: 0,
|
||||
};
|
||||
}
|
||||
|
||||
function page(guilds: Array<DiscoveryGuild>, total: number): DiscoverySearchResponse {
|
||||
return {guilds, total, categoryCounts: null};
|
||||
}
|
||||
|
||||
describe('Discovery.search', () => {
|
||||
beforeEach(() => {
|
||||
vi.mocked(DiscoveryCommands.searchGuilds).mockReset();
|
||||
Discovery.reset();
|
||||
});
|
||||
|
||||
test('does not append a guild that a previous page already returned', async () => {
|
||||
vi.mocked(DiscoveryCommands.searchGuilds)
|
||||
.mockResolvedValueOnce(page([guild('1', 50), guild('2', 40)], 4))
|
||||
.mockResolvedValueOnce(page([guild('2', 40), guild('3', 30)], 4));
|
||||
await Discovery.search({limit: 2, offset: 0});
|
||||
await Discovery.search({limit: 2, offset: Discovery.loadedCount});
|
||||
expect(Discovery.guilds.map((entry) => entry.id)).toEqual(['1', '2', '3']);
|
||||
});
|
||||
|
||||
test('advances the pagination offset by what the server returned, not by what survived deduping', async () => {
|
||||
vi.mocked(DiscoveryCommands.searchGuilds)
|
||||
.mockResolvedValueOnce(page([guild('1', 50), guild('2', 40)], 4))
|
||||
.mockResolvedValueOnce(page([guild('2', 40), guild('3', 30)], 4));
|
||||
await Discovery.search({limit: 2, offset: 0});
|
||||
await Discovery.search({limit: 2, offset: Discovery.loadedCount});
|
||||
expect(Discovery.loadedCount).toBe(4);
|
||||
});
|
||||
});
|
||||
@@ -8,6 +8,7 @@ const DEFAULT_DISCOVERY_PAGE_SIZE = 36;
|
||||
|
||||
class Discovery {
|
||||
guilds: Array<DiscoveryGuild> = [];
|
||||
loadedCount = 0;
|
||||
total = 0;
|
||||
loading = false;
|
||||
error = false;
|
||||
@@ -53,6 +54,7 @@ class Discovery {
|
||||
this.error = false;
|
||||
if (offset === 0 && searchModeChanged) {
|
||||
this.guilds = [];
|
||||
this.loadedCount = 0;
|
||||
this.total = 0;
|
||||
}
|
||||
this.query = query;
|
||||
@@ -78,8 +80,10 @@ class Discovery {
|
||||
if (offset === 0) {
|
||||
this.guilds = result.guilds;
|
||||
} else {
|
||||
this.guilds = [...this.guilds, ...result.guilds];
|
||||
const seen = new Set(this.guilds.map((guild) => guild.id));
|
||||
this.guilds = [...this.guilds, ...result.guilds.filter((guild) => !seen.has(guild.id))];
|
||||
}
|
||||
this.loadedCount = offset + result.guilds.length;
|
||||
this.total = result.total;
|
||||
this.categoryCounts = result.categoryCounts;
|
||||
this.loading = false;
|
||||
@@ -136,6 +140,7 @@ class Discovery {
|
||||
reset(): void {
|
||||
this.activeSearchToken += 1;
|
||||
this.guilds = [];
|
||||
this.loadedCount = 0;
|
||||
this.total = 0;
|
||||
this.categoryCounts = null;
|
||||
this.loading = false;
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# إشارة مرجعية} few {# إشارات مر
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# مجتمع تم العثور عليه} other {# مجتمعات تم العثور عليها}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# مجموعة غير متاحة مؤقتًا بسبب عطل في مكثف التدفق.} other {# مجموعات غير متاحة مؤقتًا بسبب عطل في مكثف التدفق.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# مجتمع مشترك} other {# مجتمعات م
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# آخر} other {# آخرين}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# مشارك في المكالمة} other {# مشاركين في المكالمة}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {توسيع (# سطر)} other {توسيع (# أسط
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {توسيع (# صف)} other {توسيع (# صفوف)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {توسيع جهاز آخر} other {توسيع # أجهزة أخرى}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {في مكالمة} other {# في مكالمة}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {الانضمام لمكالمة الفيديو (# مشارك)} other {الانضمام لمكالمة الفيديو (# مشاركين)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {متابعة مشاهدة بث واحد وإضافة هذا البث} other {متابعة مشاهدة # بثوث وإضافة هذا البث}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "إجراءات"
|
||||
msgid "Active"
|
||||
msgstr "نشط"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "الحساب النشط"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "بالخارج حاليًا"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "العودة إلى الملصق"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "العودة إلى القناة الصوتية"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "طي موضوع القناة"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "طي الأجهزة"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "متصل بالمحادثة الصوتية"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "جارٍ الاتصال..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "تمت إزالة الاتصال"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "إحصائيات الاتصال"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "تم النسخ"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "تم نسخ إحصائيات JSON إلى الحافظة"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "تم نسخ الرابط إلى الحافظة"
|
||||
msgid "Copy"
|
||||
msgstr "نسخ"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "نسخ كـ JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "نسخ رابط البانر"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "نسخ معلومات الإصدار"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "انسخ مفتاح الإعداد"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "نسخ تتبع المكدس"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "نسخ إحصائيات JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "انسخ مفتاح الإعداد في تطبيق المصادقة الخاص بك."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "نسخ معرّف المستخدم"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "نسخ الفيديو"
|
||||
msgid "Copy video link"
|
||||
msgstr "نسخ رابط الفيديو"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "نسخ تشخيصات الصوت"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "تعذر فك ترميز ملف الصوت هذا."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "تعذر تحميل إعدادات المثيل. حاول إعادة تحميل الصفحة."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "قطع اتصال المقبس"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "غير متصل"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "تعديل أو حذف الرموز التعبيرية والملصقا
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "تعديل التجاوزات للأدوار والأعضاء في هذه القناة."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "أدخل الرمز"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "دخول وضع ملء الشاشة"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "الشاشة بأكملها"
|
||||
msgid "Entire system"
|
||||
msgstr "النظام بأكمله"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "صوت النظام بالكامل"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "خروج"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "الخروج من وضع ملء الشاشة"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "أكمل إعداد الحساب أولاً"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "إنهاء الإعداد"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "في وضع \"نظام التشغيل\"، تكون القواميس ال
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "في المتصفح، لا تعمل ميزة الضغط والتحدث إلا عندما تكون علامة تبويب {PRODUCT_NAME} في التركيز. ثبّت تطبيق سطح المكتب لاستخدام ميزة الضغط والتحدث على مستوى النظام."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "في مكالمة"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "جارٍ تحميل الوجهات…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "جارٍ تحميل إعدادات المثيل"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "برامج ضارة، أو سرقة بيانات اعتماد، أو م
|
||||
msgid "Manage"
|
||||
msgstr "إدارة"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "إدارة الحسابات"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "الأحدث أولاً"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "الرموز التعبيرية غير المتحركة ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "بلا"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "أُعيد الاتصال بنجاح. اختر شاشة مرة أخرى إذا أردت استئناف بثك السابق."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "جارٍ إعادة الاتصال..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "تم نسخ المرجع."
|
||||
msgid "Referral parameters"
|
||||
msgstr "معلمات الإحالة"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "تحديث مصادر الصوت"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "إيذاء النفس أو الانتحار"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "إعداد الاستضافة الذاتية"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "الجلسات"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "تم تعيين {fieldNode} إلى {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "تعيين حالة مخصصة"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "هل تريد تأجيل هذا التحقق؟"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "إعداد {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "السويدية"
|
||||
msgid "Switch account"
|
||||
msgstr "تبديل الحساب"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "تبديل الحسابات"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "طلب الصداقة هذا لم يعد متاحًا. حدّث الصفحة وحاول مرة أخرى."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "لم يمكن استخدام هذه الصورة. جرب ملفًا مختلفًا."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "هذا كل ما في الأمر."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "علامة #0000 محجوزة لمشتركي Visionary. لم يعد Visionary متاحًا للشراء."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "صفحة الإعداد لا يمكن تحميلها لأن مصدر واجهة برمجة التطبيقات مختلف عن مصدر هذه الصفحة. تحقق من المصدر العام والمنفذ الذي تم تكوين هذا المثيل به، ثم أعد التحميل."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "تعطل التطبيق"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "مستخدم غير معروف"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "مستخدم غير معروف"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "عرض المكالمة"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "عرض عناصر التحكم في المكالمة"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "لن تتمكن من حذف رسائلك المرسلة بعد حذف ح
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "لا يزال يتعين عليك إكمال خطوة البريد الإلكتروني."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "لن تتلقى إشعارات على سطح المكتب"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "ستظهر غير متصل"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# отметка} other {# отметки}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# общност намерена} other {# общности намерени}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# общност е временно недостъпна поради неизправност на флукс кондензатора.} other {# общности са временно недостъпни поради неизправност на флукс кондензатора.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# обща общност} other {# общи общ
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# друг} other {# други}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# участник в разговора} other {# участници в разговора}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Разгъване (1 ред)} other {Разгъв
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Разгънете (# ред)} other {Разгънете (# реда)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Разгъване на # друго устройство} other {Разгъване на # други устройства}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {В разговор} other {# в разговор}}
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Присъединяване към видео разговор (# участник)} other {Присъединяване към видео разговор (# участници)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Продължи да гледаш # поток и добави този} other {Продължи да гледаш # потока и добави този}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Действия"
|
||||
msgid "Active"
|
||||
msgstr "Активен"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Активен акаунт"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "В момента ме няма"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Обратно към стикера"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Обратно към гласовия канал"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Скрий темата на канала"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Свиване на устройствата"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Свързан към гласов чат"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Свързване..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Връзката е премахната"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Статистика на връзката"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Копирано"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Копирахте JSON на статистиката в клипборда"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL адресът е копиран в клипборда"
|
||||
msgid "Copy"
|
||||
msgstr "Копирай"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Копирай като JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Копирай URL на банер"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Копирай инфо за версията"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Копиране на ключа за настройка"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Копиране на стека от извиквания"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Копирай JSON на статистиките"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Копирайте ключа за настройка във вашето приложение за удостоверяване."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Копирай потребителски ID"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Копирай видеоклип"
|
||||
msgid "Copy video link"
|
||||
msgstr "Копиране на връзка към видеоклипа"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Копиране на гласова диагностика"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Не може да се декодира този аудиофайл."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Не успяхме да заредим конфигурацията на инстанцията. Опитайте да презаредите страницата."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Прекъсване на връзката"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Прекъсната връзка"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Редактиране или изтриване на емоджита
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Редактиране на отменяния за роли и членове в този канал."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Въвеждане на код"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "На цял екран"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Цял екран"
|
||||
msgid "Entire system"
|
||||
msgstr "Цялата система"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Целия системен звук"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Изход"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Изход от цял екран"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Първо завърши настройката на профила"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Завърши настройката"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "В режим \"Операционна система\" посочени
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "В браузър функцията \"натисни и говори\" работи само докато разделът на {PRODUCT_NAME} е активен. Инсталирайте настолното приложение за \"натисни и говори\" в цялата система."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "В разговор"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Зареждане на дестинации…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Зареждане на конфигурацията на инстанцията"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Зловреден софтуер, кражба на данни или
|
||||
msgid "Manage"
|
||||
msgstr "Управление"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Управление на профили"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Първо най-новите"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Неанимирани емоджита ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Няма"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Връзката е възстановена. Изберете екран отново, ако искате да продължите предишния си поток."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Повторно свързване..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Връзката е копирана."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Параметри за препоръка"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Обнови аудиоизточниците"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Самоувреждане или самоубийство"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Настройка за самостоятелно хостване"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Сесии"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Задайте {fieldNode} на {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Задаване на персонализиран статус"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Отложите ли тази проверка?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Настройване на {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Шведски"
|
||||
msgid "Switch account"
|
||||
msgstr "Превключване на профил"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Смени профила"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Тази покана за приятелство вече не е налична. Опреснете и опитайте отново."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Не може да се използва това изображение. Опитайте с друг файл."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Това е всичко."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Тагът #0000 е запазен за абонати на Visionary. Visionary вече не е наличен за закупуване."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API е на различен домейн от тази страница, така че заявките за настройка се изпращат без вашата сесия. Проверете публичния домейн и порт, с които е конфигуриран този екземпляр, след което презаредете."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Приложението срина"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "неизвестен потребител"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Неизвестен потребител"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Преглед на обаждането"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Вижте контролите на разговора"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Няма да можете да изтриете изпратените
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Ще трябва да завършите и стъпката с имейла."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Няма да получавате известия на компютъра си"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Ще изглеждате офлайн"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# záložka} few {# záložky} many {# záložek} o
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# komunita nalezena} other {# komunit nalezeno} few {# komunity nalezeny}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# komunita je dočasně nedostupná kvůli poruše \"flux kondenzátoru\".} few {# komunity jsou dočasně nedostupné kvůli poruše \"flux kondenzátoru\".} many {# komunit je dočasně nedostupných kvůli poruše \"flux kondenzátoru\".} other {# komunit je dočasně nedostupných kvůli poruše \"flux kondenzátoru\".}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# společná komunita} other {# společné komunity
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# další} few {# další} many {# dalších} other {# dalších}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# účastník hovoru} few {# účastníci hovoru} many {# účastníka hovoru} other {# účastníků hovoru}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Rozbalit (1 řádek)} few {Rozbalit (# řádky)} ma
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Rozbalit (# řádek)} other {Rozbalit (# řádky)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Rozbalit # další zařízení} other {Rozbalit # dalších zařízení}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {V hovoru} other {# v hovoru}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Připojit se k videohovoru (1 účastník)} few {Připojit se k videohovoru (# účastníci)} many {Připojit se k videohovoru (# účastníků)} other {Připojit se k videohovoru (# účastníků)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Sledovat # stream a přidat tento} other {Sledovat # streamy a přidat tento}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Akce"
|
||||
msgid "Active"
|
||||
msgstr "Aktivní"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktivní účet"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Momentálně pryč"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Zpět k nálepce"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Zpět do hlasového kanálu"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Sbalit téma kanálu"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Sbalit zařízení"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Připojeno k hlasovému chatu"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Připojování..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Spojení odebráno"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Statistiky připojení"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Zkopírováno"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statistiky JSON zkopírovány do schránky"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "Adresa URL zkopírována do schránky"
|
||||
msgid "Copy"
|
||||
msgstr "Kopírovat"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Kopírovat jako JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Kopírovat URL banneru"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Kopírovat informace o sestavení"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Zkopírovat klíč pro nastavení"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Kopírovat zásobník volání"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Kopírovat JSON statistik"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Zkopírujte klíč pro nastavení do vaší aplikace pro ověřování."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Kopírovat ID uživatele"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Kopírovat video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Kopírovat odkaz na video"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Kopírovat diagnostiku hlasu"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Tento zvukový soubor se nepodařilo dekódovat."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Nepodařilo se načíst konfiguraci instance. Zkuste znovu načíst stránku."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Odpojit socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Odpojeno"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Upravit nebo smazat emoji a nálepky vytvořené jinými členy."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Upravit přepsání pro role a členy v tomto kanálu."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Zadejte kód"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Přejít na celou obrazovku"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Celá obrazovka"
|
||||
msgid "Entire system"
|
||||
msgstr "Celý systém"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Celý zvuk systému"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Odejít"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Ukončit režim celé obrazovky"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Nejprve dokončete nastavení účtu"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Dokončit nastavení"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "V režimu \"Operační systém\" jsou výše uvedené slovníky pouze do
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "V prohlížeči funguje funkce push-to-talk pouze, když je karta {PRODUCT_NAME} aktivní. Nainstalujte si desktopovou aplikaci pro funkci push-to-talk v celém systému."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "V hovoru"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Načítání cílů…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Načítání konfigurace instance"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Malware, krádež přihlašovacích údajů nebo škodlivé soubory."
|
||||
msgid "Manage"
|
||||
msgstr "Spravovat"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Spravovat účty"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Nejnovější nahoře"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Neanimované emoji ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Žádné"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Opětovné připojení proběhlo úspěšně. Pokud chcete pokračovat v předchozím streamu, vyberte obrazovku znovu."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Opětovné připojování..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Odkaz zkopírován."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Parametry doporučení"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Obnovit zdroje zvuku"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Sebepoškozování nebo sebevražda"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Nastavení vlastního hostování"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Relace"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Nastaveno {fieldNode} na {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Nastavit vlastní status"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Odložit tuto kontrolu?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Nastavit {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Švédština"
|
||||
msgid "Switch account"
|
||||
msgstr "Přepnout účet"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Přepnout účty"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Tato žádost o přátelství již není k dispozici. Obnovte stránku a zkuste to znovu."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Tento obrázek nebylo možné použít. Zkuste jiný soubor."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "To je vše."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Tag #0000 je rezervován pro předplatitele Visionary. Visionary už není k dispozici k zakoupení."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API je na jiné doméně než tato stránka, takže žádosti o nastavení se odesílají bez vaší relace. Zkontrolujte veřejnou doménu a port, se kterými je tato instance nakonfigurována, a poté znovu načtěte."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Aplikace spadla"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "neznámý uživatel"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Neznámý uživatel"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Zobrazit hovor"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Zobrazit ovládání hovoru"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Odeslané zprávy po smazání účtu nebude možné odstranit"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Stále bude potřeba dokončit krok s e-mailem."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Na počítači nebudete dostávat oznámení"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Budete vypadat offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# bogmærke} other {# bogmærker}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# fællesskab fundet} other {# fællesskaber fundet}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# fællesskab er midlertidigt utilgængeligt på grund af en fejl i fluxkondensatoren.} other {# fællesskaber er midlertidigt utilgængelige på grund af en fejl i fluxkondensatoren.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# fælles fællesskab} other {# fælles fællesskab
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# anden} other {# andre}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# deltager i opkald} other {# deltagere i opkald}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Vis (# linje)} other {Vis (# linjer)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Vis (# række)} other {Vis (# rækker)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Udvid # anden enhed} other {Udvid # andre enheder}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {I opkald} other {# i opkald}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Deltag i videoopkald (# deltager)} other {Deltag i videoopkald (# deltagere)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "Fortsæt med at se # {count, plural, one {stream og tilføj denne} other {streams og tilføj denne}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Handlinger"
|
||||
msgid "Active"
|
||||
msgstr "Aktiv"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktiv konto"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Ikke til stede lige nu"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Tilbage til sticker"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Tilbage til talechat"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Skjul kanalemne"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Skjul enheder"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Forbundet til talechat"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Opretter forbindelse..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Forbindelse fjernet"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Forbindelsesstatistik"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Kopieret"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statistik-JSON kopieret til udklipsholder"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL kopieret til udklipsholder"
|
||||
msgid "Copy"
|
||||
msgstr "Kopiér"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Kopiér som JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Kopiér banner-URL"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Kopiér buildinfo"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Kopiér opsætelsesnøgle"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Kopiér staksporing"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Kopiér statistik (JSON)"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Kopiér opsætelsesnøglen ind i din autentifikationsapp."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Kopiér bruger-id"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Kopiér video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Kopiér videolink"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Kopiér stemmediagnostik"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Kunne ikke afkode denne lydfil."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Kunne ikke indlæse instanskonfigurationen. Prøv at genindlæse siden."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Afbryd forbindelse til socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Afbrudt"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Rediger eller slet emoji og stickers, der er oprettet af andre medlemmer
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Rediger tilsidesættelser for roller og medlemmer i denne kanal."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Indtast kode"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Vis i fuld skærm"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Hele skærmen"
|
||||
msgid "Entire system"
|
||||
msgstr "Hele systemet"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Hele systemets lyd"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Forlad"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Afslut fuldskærm"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Gør først kontoopsætningen færdig"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Afslut opsætning"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "I tilstanden \"Operativsystem\" er ordbøgerne ovenfor vejledende. {PROD
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "I en browser fungerer push-to-talk kun, når fanen {PRODUCT_NAME} er i fokus. Installer desktopappen for push-to-talk på hele systemet."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "I et opkald"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Indlæser destinationer…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Indlæser instanskonfiguration"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Malware, tyveri af loginoplysninger eller skadelige filer."
|
||||
msgid "Manage"
|
||||
msgstr "Administrer"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Administrer konti"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Nyeste først"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Ikke-animerede emojis ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Ingen"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Forbindelsen er genoprettet. Vælg en skærm igen, hvis du vil genoptage din tidligere stream."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Genopretter forbindelse..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Reference kopieret."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Henvisningsparametre"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Opdater lydkilder"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Selvskade eller selvmord"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Opsætning til selv-hosting"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sessioner"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Sæt {fieldNode} til {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Angiv en brugerdefineret status"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Gem denne kontrol til senere?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Opsæt {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Svensk"
|
||||
msgid "Switch account"
|
||||
msgstr "Skift konto"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Skift konto"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Den venneanmodning er ikke længere tilgængelig. Opdater og prøv igen."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Det billede kunne ikke bruges. Prøv en anden fil."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Det var alle sammen."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Tagget #0000 er reserveret til Visionary-abonnenter. Visionary kan ikke længere købes."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API'en er på et andet domæne end denne side, så opsætningsanmodninger sendes uden din session. Tjek det offentlige domæne og port, som denne instans er konfigureret med, og genindlæs derefter."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Appen gik ned"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "Ukendt bruger"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Ukendt bruger"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Se opkald"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Vis opkaldskontroller"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Du kan ikke slette dine sendte beskeder, efter din konto er blevet slett
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Du skal stadig afslutte e-mail-trinnet."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Du modtager ikke notifikationer på computeren"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Du vises som offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# Lesezeichen} other {# Lesezeichen}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# Community gefunden} other {# Communitys gefunden}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# Community ist aufgrund einer Fehlfunktion des Fluxkompensators vorübergehend nicht verfügbar.} other {# Communitys sind aufgrund einer Fehlfunktion des Fluxkompensators vorübergehend nicht verfügbar.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# gemeinsame Community} other {# gemeinsame Communi
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# andere} other {# andere}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# Teilnehmer im Anruf} other {#Teilnehmer im Anruf}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Erweitern (# Zeile)} other {Erweitern (# Zeilen)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Erweitern (# Zeile)} other {Erweitern (# Zeilen)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Einen weiteren Teilnehmer einblenden} other {# weitere Teilnehmer einblenden}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {Im Anruf} other {# im Anruf}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Videoanruf beitreten (# Teilnehmer)} other {Videoanruf beitreten (# Teilnehmer)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Behalte # Stream im Auge und füge diesen hinzu} other {Behalte # Streams im Auge und füge diesen hinzu}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Aktionen"
|
||||
msgid "Active"
|
||||
msgstr "Aktiv"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktiver Account"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Gerade abwesend"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Zurück zum Sticker"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Zurück zum Sprachkanal"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Kanalthema einklappen"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Geräte einklappen"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Mit Sprachkanal verbunden"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Verbindung wird hergestellt..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Verbindung entfernt"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Verbindungsstatistik"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Kopiert"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statistik-JSON in die Zwischenablage kopiert"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL in Zwischenablage kopiert"
|
||||
msgid "Copy"
|
||||
msgstr "Kopieren"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Als JSON kopieren"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Banner-URL kopieren"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Build-Info kopieren"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Schlüssel zum Einrichten kopieren"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Stack-Trace kopieren"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Statistik-JSON kopieren"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Kopiere den Schlüssel in deine Authentifizierungs-App."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Nutzer-ID kopieren"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Video kopieren"
|
||||
msgid "Copy video link"
|
||||
msgstr "Videolink kopieren"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Sprachdiagnose kopieren"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Audiodatei konnte nicht dekodiert werden."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Die Instanzkonfiguration konnte nicht geladen werden. Versuche, die Seite neu zu laden."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Socket trennen"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Verbindung getrennt"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Emojis und Sticker bearbeiten oder löschen, die von anderen Mitgliedern
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Berechtigungen für Rollen und Mitglieder in diesem Kanal bearbeiten."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Code eingeben"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Vollbildmodus aktivieren"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Gesamter Bildschirm"
|
||||
msgid "Entire system"
|
||||
msgstr "Gesamtes System"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Gesamtes System-Audio"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Verlassen"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Vollbild verlassen"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Schließe zuerst die Accounteinrichtung ab"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Einrichtung abschließen"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "Im Modus \"Betriebssystem\" sind die oben aufgeführten Wörterbücher b
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "Im Browser funktioniert Push-to-Talk nur, wenn der Tab \"{PRODUCT_NAME}\" im Fokus ist. Installiere die Desktop-App für systemweites Push-to-Talk."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Im Anruf"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Ziele werden geladen …"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Instanzkonfiguration wird geladen"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Malware, Zugangsdaten-Diebstahl oder schädliche Dateien."
|
||||
msgid "Manage"
|
||||
msgstr "Verwalten"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Accounts verwalten"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Neueste zuerst"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Nicht animierte Emojis ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Keine"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Wiederherstellung erfolgreich. Wähle erneut einen Bildschirm aus, wenn du deinen vorherigen Stream fortsetzen möchtest."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Verbindung wird wiederhergestellt..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referenz kopiert."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Empfehlungsparameter"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Audioquellen aktualisieren"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Selbstverletzung oder Suizid"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Einrichtung für selbst gehostete Installationen"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sitzungen"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "{fieldNode} auf {0} gesetzt."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Einen eigenen Status festlegen"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Diese Prüfung beiseitelegen?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "{productName} einrichten"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Schwedisch"
|
||||
msgid "Switch account"
|
||||
msgstr "Konto wechseln"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Accounts wechseln"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Diese Freundschaftsanfrage ist nicht mehr verfügbar. Aktualisiere die Seite und versuche es erneut."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Dieses Bild konnte nicht verwendet werden. Versuche eine andere Datei."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Das waren alle."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Der Tag #0000 ist für Visionary-Abonnenten reserviert. Visionary kann nicht mehr erworben werden."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "Die API hat einen anderen Ursprung als diese Seite, daher werden Setup-Anfragen ohne deine Sitzung gesendet. Überprüfe den öffentlichen Ursprung und Port, mit dem diese Instanz konfiguriert ist, und lade dann neu."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Die App ist abgestürzt"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "Unbekannter Nutzer"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Unbekannter Nutzer"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Anruf ansehen"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Anrufsteuerung anzeigen"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Gesendete Nachrichten können nach dem Löschen deines Accounts nicht me
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Du musst den E-Mail-Schritt noch abschließen."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Du erhältst keine Benachrichtigungen auf dem Desktop"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Du bist offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# σελιδοδείκτη} other {# σελιδοδ
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# κοινότητα βρέθηκε} other {# κοινότητες βρέθηκαν}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# κοινότητα είναι προσωρινά μη διαθέσιμη λόγω δυσλειτουργίας του πυκνωτή ροής.} other {# κοινότητες είναι προσωρινά μη διαθέσιμες λόγω δυσλειτουργίας του πυκνωτή ροής.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# κοινή κοινότητα} other {# κοιν
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# άλλος} other {# άλλοι}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# συμμετέχων στην κλήση} other {# συμμετέχοντες στην κλήση}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Ανάπτυξη (# γραμμή)} other {Ανάπ
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Εμφάνιση (# γραμμής)} other {Εμφάνιση (# γραμμών)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Ανάπτυξη # άλλης συσκευής} other {Ανάπτυξη # άλλων συσκευών}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {Σε κλήση} other {# σε κλήση}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Συμμετοχή σε βιντεοκλήση (# συμμετέχων)} other {Συμμετοχή σε βιντεοκλήση (# συμμετέχοντες)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Συνέχισε να παρακολουθείς # ροή και πρόσθεσε αυτήν} other {Συνέχισε να παρακολουθείς # ροές και πρόσθεσε αυτήν}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Ενέργειες"
|
||||
msgid "Active"
|
||||
msgstr "Ενεργό"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Ενεργός λογαριασμός"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Εκτός τώρα"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Επιστροφή στο αυτοκόλλητο"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Επιστροφή στο κανάλι φωνής"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Σύμπτυξη θέματος καναλιού"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Σύμπτυξη συσκευών"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Συνδεδεμένοι στην ομιλία"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Σύνδεση..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Η σύνδεση καταργήθηκε"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Στατιστικά σύνδεσης"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Αντιγράφηκε"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Αντιγράφηκαν τα στατιστικά JSON στο πρόχειρο"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "Αντιγράφηκε η διεύθυνση URL στο πρόχειρο
|
||||
msgid "Copy"
|
||||
msgstr "Αντιγραφή"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Αντιγραφή ως JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Αντιγραφή URL banner"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Αντιγραφή πληροφοριών έκδοσης"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Αντιγραφή κλειδιού εγκατάστασης"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Αντιγραφή ίχνους στοίβας"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Αντιγραφή στατιστικών JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Αντιγράψτε το κλειδί εγκατάστασης στην εφαρμογή ελέγχου ταυτότητας."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Αντιγραφή αναγνωριστικού χρήστη"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Αντιγραφή βίντεο"
|
||||
msgid "Copy video link"
|
||||
msgstr "Αντιγραφή συνδέσμου βίντεο"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Αντιγραφή διαγνωστικών φωνής"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Δεν ήταν δυνατή η αποκωδικοποίηση αυτού του αρχείου ήχου."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Δεν ήταν δυνατή η φόρτωση της διαμόρφωσης της παρουσίας. Δοκιμάστε να ανανεώσετε τη σελίδα."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Αποσύνδεση socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Αποσυνδέθηκε"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Επεξεργασία ή διαγραφή emoji και αυτοκόλλ
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Επεξεργασία εξαιρέσεων για ρόλους και μέλη σε αυτό το κανάλι."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Εισαγωγή κωδικού"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Πλήρης οθόνη"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Ολόκληρη η οθόνη"
|
||||
msgid "Entire system"
|
||||
msgstr "Ολόκληρο το σύστημα"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Ήχος ολόκληρου του συστήματος"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Έξοδος"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Έξοδος από πλήρη οθόνη"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Ολοκλήρωσε πρώτα τη ρύθμιση του λογαρι
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Ολοκλήρωση ρύθμισης"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "Στη λειτουργία \"Λειτουργικό σύστημα\",
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "Σε ένα πρόγραμμα περιήγησης, η λειτουργία push-to-talk λειτουργεί μόνο όταν η καρτέλα {PRODUCT_NAME} είναι ενεργή. Εγκαταστήστε την εφαρμογή υπολογιστή για push-to-talk σε όλο το σύστημα."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Σε κλήση"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Φόρτωση προορισμών…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Φόρτωση διαμόρφωσης παρουσίας"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Κακόβουλο λογισμικό, κλοπή διαπιστευτη
|
||||
msgid "Manage"
|
||||
msgstr "Διαχείριση"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Διαχείριση λογαριασμών"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Πιο πρόσφατα πρώτα"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Μη κινούμενα emoji ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Καμία"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Η επανασύνδεση ήταν επιτυχής. Επιλέξτε ξανά μια οθόνη, αν θέλετε να συνεχίσετε την προηγούμενη ροή σας."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Επανασύνδεση..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Αντιγράφηκε η αναφορά."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Παράμετροι παραπομπής"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Ανανέωση πηγών ήχου"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Αυτοτραυματισμός ή αυτοκτονία"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Ρύθμιση αυτόνομης φιλοξενίας"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Συνδέσεις"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Ορίστηκε το {fieldNode} σε {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Ορισμός προσαρμοσμένης κατάστασης"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Αναβολή αυτού του ελέγχου;"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Ρύθμιση του {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Σουηδικά"
|
||||
msgid "Switch account"
|
||||
msgstr "Αλλαγή λογαριασμού"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Εναλλαγή λογαριασμών"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Αυτό το αίτημα φιλίας δεν είναι πλέον διαθέσιμο. Ανανεώστε και δοκιμάστε ξανά."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Αυτή η εικόνα δεν μπορούσε να χρησιμοποιηθεί. Δοκιμάστε ένα διαφορετικό αρχείο."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Αυτά ήταν όλα."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Το tag #0000 είναι δεσμευμένο για τους συνδρομητές Visionary. Το Visionary δεν είναι πλέον διαθέσιμο για αγορά."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "Το API βρίσκεται σε διαφορετική προέλευση από αυτήν τη σελίδα, οπότε τα αιτήματα ρύθμισης αποστέλλονται χωρίς τη συνεδρία σας. Ελέγξτε την δημόσια προέλευση και τη θύρα με την οποία έχει ρυθμιστεί αυτή η παρουσία, και στη συνέχεια κάντε επανεκκίνηση."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Η εφαρμογή έκλεισε απροσδόκητα"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "άγνωστος χρήστης"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Άγνωστος χρήστης"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Προβολή κλήσης"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Προβολή στοιχείων κλήσης"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Δεν θα μπορείτε να διαγράψετε τα απεστα
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Θα χρειαστεί να ολοκληρώσεις ακόμα το βήμα του email."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Δεν θα λαμβάνεις ειδοποιήσεις στην επιφάνεια εργασίας"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Θα εμφανίζεστε εκτός σύνδεσης"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# bookmark} other {# bookmarks}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# community found} other {# communities found}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# mutual community} other {# mutual communities}}"
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# other} other {# others}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Expand (# line)} other {Expand (# lines)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {In call} other {# in call}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Actions"
|
||||
msgid "Active"
|
||||
msgstr "Active"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Active account"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Away right now"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Back to sticker"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Back to voice channel"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Collapse channel topic"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Collapse devices"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Connected to voice"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Connecting..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Connection removed"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Connection stats"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Copied"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Copied stats JSON to clipboard"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL copied to clipboard"
|
||||
msgid "Copy"
|
||||
msgstr "Copy"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Copy as JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Copy banner URL"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Copy build info"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Copy setup key"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Copy stack trace"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Copy stats JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Copy the setup key into your authenticator app."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Copy user ID"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Copy video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Copy video link"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Copy voice diagnostics"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Could not decode this audio file."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Could not load the instance configuration. Try reloading the page."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Disconnect socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Disconnected"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Edit or delete emoji and stickers created by other members."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Edit overwrites for roles and members in this channel."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Enter code"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Enter full screen"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Entire screen"
|
||||
msgid "Entire system"
|
||||
msgstr "Entire system"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Entire system audio"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Exit"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Exit full screen"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Finish account setup first"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Finish setup"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "In \"Operating system\" mode, the dictionaries listed above are advisory
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "In a call"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Loading destinations…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Loading instance configuration"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Malware, credential theft, or harmful files."
|
||||
msgid "Manage"
|
||||
msgstr "Manage"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Manage accounts"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Newest first"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Non-animated emoji ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "None"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Reconnect successful. Pick a screen again if you want to resume your previous stream."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Reconnecting..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Reference copied."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Referral parameters"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Refresh audio sources"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Self-harm or suicide"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Self-host setup"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sessions"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Set {fieldNode} to {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Set a custom status"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Set this check aside?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Set up {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Swedish"
|
||||
msgid "Switch account"
|
||||
msgstr "Switch account"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Switch accounts"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "That friend request is no longer available. Refresh and try again."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "That image could not be used. Try a different file."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "That's all of them."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "The API is on a different origin to this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "The app crashed"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "Unknown user"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Unknown user"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "View call"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "View call controls"
|
||||
|
||||
@@ -37219,7 +37219,6 @@ msgstr "With error"
|
||||
msgid "Withdraw"
|
||||
msgstr "Withdraw"
|
||||
|
||||
# auto-i18n: reviewed unchanged
|
||||
#. Permission description in the channel-scoped permissions editor for the Use Voice Activity permission. Explains the inverse: without it, the user must use push-to-talk in this voice channel.
|
||||
#: src/features/permissions/utils/PermissionLabelDescriptors.ts:295
|
||||
msgid "Without this permission, push-to-talk is required in this channel."
|
||||
@@ -37929,12 +37928,12 @@ msgstr "You won't be able to delete your sent messages after your account is del
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "You'll still need to finish the email step."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "You won't get notifications on desktop"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "You'll appear offline"
|
||||
|
||||
@@ -356,7 +356,7 @@ msgstr "{count, plural, one {# bookmark} other {# bookmarks}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# community found} other {# communities found}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
|
||||
@@ -405,7 +405,7 @@ msgstr "{count, plural, one {# mutual community} other {# mutual communities}}"
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# other} other {# others}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
|
||||
@@ -451,7 +451,7 @@ msgstr "{count, plural, one {Expand (# line)} other {Expand (# lines)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
|
||||
@@ -472,7 +472,7 @@ msgstr "{count, plural, one {In call} other {# in call}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
|
||||
@@ -2183,7 +2183,7 @@ msgstr "Actions"
|
||||
msgid "Active"
|
||||
msgstr "Active"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Active account"
|
||||
@@ -4579,7 +4579,7 @@ msgstr "Away right now"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4643,7 +4643,7 @@ msgid "Back to sticker"
|
||||
msgstr "Back to sticker"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Back to voice channel"
|
||||
|
||||
@@ -7498,7 +7498,7 @@ msgstr "Collapse channel topic"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Collapse devices"
|
||||
|
||||
@@ -8158,7 +8158,7 @@ msgstr "Connected to voice"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Connecting..."
|
||||
|
||||
@@ -8219,7 +8219,7 @@ msgid "Connection removed"
|
||||
msgstr "Connection removed"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Connection stats"
|
||||
|
||||
@@ -8467,7 +8467,7 @@ msgid "Copied"
|
||||
msgstr "Copied"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Copied stats JSON to clipboard"
|
||||
|
||||
@@ -8500,11 +8500,6 @@ msgstr "Copied URL to clipboard"
|
||||
msgid "Copy"
|
||||
msgstr "Copy"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Copy as JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8541,7 +8536,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Copy banner URL"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Copy build info"
|
||||
@@ -8744,8 +8739,8 @@ msgstr "Copy setup key"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Copy stack trace"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Copy stats JSON"
|
||||
|
||||
@@ -8773,7 +8768,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Copy the setup key into your authenticator app."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Copy user ID"
|
||||
@@ -8798,7 +8793,7 @@ msgstr "Copy video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Copy video link"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Copy voice diagnostics"
|
||||
|
||||
@@ -8828,7 +8823,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Could not decode this audio file."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Could not load the instance configuration. Try reloading the page."
|
||||
|
||||
@@ -11425,7 +11420,7 @@ msgstr "Disconnect socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Disconnected"
|
||||
|
||||
@@ -12257,7 +12252,7 @@ msgstr "Edit or delete emoji and stickers created by other members."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Edit overwrites for roles and members in this channel."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13110,7 +13105,7 @@ msgstr "Enter code"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Enter fullscreen"
|
||||
|
||||
@@ -13278,7 +13273,7 @@ msgstr "Entire screen"
|
||||
msgid "Entire system"
|
||||
msgstr "Entire system"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Entire system audio"
|
||||
|
||||
@@ -13479,7 +13474,7 @@ msgstr "Exit"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Exit fullscreen"
|
||||
|
||||
@@ -14388,7 +14383,7 @@ msgstr "Finish account setup first"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Finish setup"
|
||||
@@ -16831,7 +16826,7 @@ msgstr "In \"Operating system\" mode, dictionaries listed above are advisory. {P
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "In a call"
|
||||
|
||||
@@ -18593,7 +18588,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Loading destinations…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Loading instance configuration"
|
||||
|
||||
@@ -18886,7 +18881,7 @@ msgstr "Malware, credential theft, or harmful files."
|
||||
msgid "Manage"
|
||||
msgstr "Manage"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Manage accounts"
|
||||
@@ -21124,7 +21119,7 @@ msgstr "Newest first"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21800,7 +21795,7 @@ msgstr "Non-animated emoji ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "None"
|
||||
|
||||
@@ -24957,7 +24952,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Reconnect succeeded. Pick a screen again if you want to resume your previous stream."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Reconnecting..."
|
||||
|
||||
@@ -25098,7 +25093,7 @@ msgstr "Reference copied."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Referral parameters"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Refresh audio sources"
|
||||
|
||||
@@ -27872,7 +27867,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Self-harm or suicide"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Self-host setup"
|
||||
|
||||
@@ -28221,7 +28216,7 @@ msgstr "Sessions"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Set {fieldNode} to {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Set a custom status"
|
||||
@@ -28420,7 +28415,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Set this check aside?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Set up {productName}"
|
||||
|
||||
@@ -30930,7 +30925,7 @@ msgstr "Swedish"
|
||||
msgid "Switch account"
|
||||
msgstr "Switch account"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Switch accounts"
|
||||
|
||||
@@ -31587,7 +31582,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "That friend request is no longer available. Refresh and try again."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "That image could not be used. Try a different file."
|
||||
|
||||
@@ -31618,6 +31613,11 @@ msgstr "That's all of them."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "The app crashed"
|
||||
@@ -34050,7 +34050,7 @@ msgstr "unknown user"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Unknown user"
|
||||
@@ -35962,7 +35962,7 @@ msgid "View call"
|
||||
msgstr "View call"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "View call controls"
|
||||
|
||||
@@ -37929,12 +37929,12 @@ msgstr "You will not be able to delete your sent messages after your account is
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "You will still need to finish the email step."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "You won't receive notifications on desktop"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "You'll appear offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# marcador} other {# marcadores}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# comunidad encontrada} other {# comunidades encontradas}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# comunidad no está disponible temporalmente debido a una falla en el condensador de flujo.} other {# comunidades no están disponibles temporalmente debido a una falla en el condensador de flujo.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# comunidad en común} other {# comunidades en com
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# más} other {# más}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# participante en la llamada} other {# participantes en la llamada}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Expandir (# línea)} other {Expandir (# líneas)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Mostrar (# fila)} other {Mostrar (# filas)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Expandir # otro dispositivo} other {Expandir # otros dispositivos}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {En llamada} other {# en llamada}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Unirse a videollamada (# participante)} other {Unirse a videollamada (# participantes)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {seguir viendo # transmisión y agregar esta} other {seguir viendo # transmisiones y agregar esta}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Acciones"
|
||||
msgid "Active"
|
||||
msgstr "Activa"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Cuenta activa"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Ausente en este momento"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Volver al sticker"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Volver al canal de voz"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Contraer tema del canal"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Contraer dispositivos"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Conectado a la llamada"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Conectando..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Conexión eliminada"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Estadísticas de conexión"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Copiado"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Se copió el JSON de estadísticas al portapapeles"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL copiada al portapapeles"
|
||||
msgid "Copy"
|
||||
msgstr "Copiar"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Copiar como JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Copiar URL del banner"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Copiar información de la versión"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Copiar clave de configuración"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Copiar seguimiento de pila"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Copiar JSON de estadísticas"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Copia la clave de configuración en tu aplicación de autenticación."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Copiar ID de usuario"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Copiar video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Copiar enlace del video"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Copiar diagnóstico de voz"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "No se pudo decodificar este archivo de audio."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "No se pudo cargar la configuración de la instancia. Intenta recargar la página."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Desconectar socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Desconectado"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Editar o eliminar emojis y stickers creados por otros miembros."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Edita los permisos de roles y miembros en este canal."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Ingresa el código"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Entrar a pantalla completa"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Toda la pantalla"
|
||||
msgid "Entire system"
|
||||
msgstr "Sistema completo"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Audio de todo el sistema"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Salir"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Salir de pantalla completa"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Termina de configurar tu cuenta primero"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Finalizar configuración"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "En el modo \"Sistema operativo\", los diccionarios que se muestran arrib
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "En un navegador, la función pulsar para hablar solo funciona mientras la pestaña de {PRODUCT_NAME} esté activa. Instala la aplicación de escritorio para usar pulsar para hablar en todo el sistema."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "En una llamada"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Cargando destinos…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Cargando configuración de la instancia"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Malware, robo de credenciales o archivos dañinos."
|
||||
msgid "Manage"
|
||||
msgstr "Administrar"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Administrar cuentas"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Más recientes primero"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Emojis no animados ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Ninguno"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Reconexión exitosa. Elige una pantalla de nuevo si quieres reanudar tu transmisión anterior."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Reconectando..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referencia copiada."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Parámetros de referencia"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Actualizar fuentes de audio"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Autolesiones o suicidio"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Configuración de autoalojamiento"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sesiones"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Establecer {fieldNode} en {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Establecer un estado personalizado"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "¿Dejar esta verificación en espera?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Configura {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Sueco"
|
||||
msgid "Switch account"
|
||||
msgstr "Cambiar de cuenta"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Cambiar de cuenta"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Esa solicitud de amistad ya no está disponible. Actualiza y vuelve a intentarlo."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Esa imagen no se pudo usar. Intenta con otro archivo."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Eso es todo."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "La etiqueta #0000 está reservada para suscriptores Visionary. Visionary ya no está disponible para comprar."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "La API está en un origen diferente al de esta página, por lo que las solicitudes de configuración se envían sin tu sesión. Verifica el origen público y el puerto con los que está configurada esta instancia, y luego recarga."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "La aplicación falló"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "usuario desconocido"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Usuario desconocido"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Ver llamada"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Ver controles de llamada"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "No podrás eliminar los mensajes que enviaste después de que se elimine
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Aún necesitarás completar el paso del correo electrónico."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "No recibirás notificaciones en la computadora"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Aparecerás como desconectado"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# marcador} other {# marcadores}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# comunidad encontrada} other {# comunidades encontradas}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# comunidad no está disponible temporalmente debido a un fallo en el condensador de flujo.} other {# comunidades no están disponibles temporalmente debido a un fallo en el condensador de flujo.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# comunidad en común} other {# comunidades en com
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# más} other {# más}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# participante en la llamada} other {# participantes en la llamada}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Expandir (# línea)} other {Expandir (# líneas)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Mostrar (# fila)} other {Mostrar (# filas)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Expandir # otro dispositivo} other {Expandir # otros dispositivos}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {En llamada} other {# en llamada}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Unirse a la videollamada (# participante)} other {Unirse a la videollamada (# participantes)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Seguir viendo # retransmisión y añadir esta} other {Seguir viendo # retransmisiones y añadir esta}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Acciones"
|
||||
msgid "Active"
|
||||
msgstr "Activa"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Cuenta activa"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Ausente ahora mismo"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Volver al sticker"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Volver al canal de voz"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Contraer tema del canal"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Contraer dispositivos"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Conectado a la voz"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Conectando..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Conexión eliminada"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Estadísticas de conexión"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Copiado"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "JSON de estadísticas copiado al portapapeles"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL copiada al portapapeles"
|
||||
msgid "Copy"
|
||||
msgstr "Copiar"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Copiar como JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Copiar URL del banner"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Copiar información de la compilación"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Copiar la clave de configuración"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Copiar seguimiento de pila"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Copiar JSON de estadísticas"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Copia la clave de configuración en tu aplicación de autenticación."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Copiar ID de usuario"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Copiar vídeo"
|
||||
msgid "Copy video link"
|
||||
msgstr "Copiar enlace del vídeo"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Copiar diagnóstico de voz"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "No se pudo descodificar este archivo de audio."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "No se ha podido cargar la configuración de la instancia. Intenta recargar la página."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Desconectar socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Desconectado"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Editar o eliminar emojis y stickers creados por otros miembros."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Edita las anulaciones para roles y miembros en este canal."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Introducir código"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Entrar en pantalla completa"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Toda la pantalla"
|
||||
msgid "Entire system"
|
||||
msgstr "Todo el sistema"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Audio de todo el sistema"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Salir"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Salir de pantalla completa"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Termina primero de configurar la cuenta"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Finalizar configuración"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "En el modo \"Sistema operativo\", los diccionarios indicados anteriormen
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "En un navegador, la función pulsar para hablar solo funciona si la pestaña de {PRODUCT_NAME} está activa. Instala la aplicación de escritorio para usar la función pulsar para hablar en todo el sistema."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "En una llamada"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Cargando destinos…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Cargando configuración de la instancia"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Malware, robo de credenciales o archivos dañinos."
|
||||
msgid "Manage"
|
||||
msgstr "Administrar"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Gestionar cuentas"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Más recientes primero"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Emojis no animados ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Ninguno"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Reconexión correcta. Elige una pantalla de nuevo si quieres reanudar tu transmisión anterior."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Reconectando..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referencia copiada."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Parámetros de referencia"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Actualizar fuentes de audio"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Autolesiones o suicidio"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Configuración de autoalojamiento"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sesiones"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Establecer {fieldNode} en {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Establecer un estado personalizado"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "¿Dejar esta verificación en suspenso?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Configura {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Sueco"
|
||||
msgid "Switch account"
|
||||
msgstr "Cambiar de cuenta"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Cambiar de cuenta"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Esa solicitud de amistad ya no está disponible. Actualiza y vuelve a intentarlo."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Esa imagen no se ha podido usar. Prueba con otro archivo."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Eso es todo."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "La etiqueta #0000 está reservada para los suscriptores Visionary. Visionary ya no está disponible para su compra."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "La API está en un origen diferente al de esta página, por lo que las solicitudes de configuración se envían sin tu sesión. Comprueba el origen público y el puerto con los que está configurada esta instancia y, a continuación, recarga."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "La aplicación se ha bloqueado"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "usuario desconocido"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Usuario desconocido"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Ver llamada"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Ver controles de llamada"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "No podrás eliminar los mensajes que hayas enviado después de que se el
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Todavía tendrás que completar el paso del correo electrónico."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "No recibirás notificaciones en el ordenador"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Aparecerás como desconectado"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# kirjanmerkki} other {# kirjanmerkkiä}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# yhteisö löytyi} other {# yhteisöä löytyi}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# yhteisö on tilapäisesti pois käytöstä toimintahäiriön vuoksi.} other {# yhteisöä on tilapäisesti pois käytöstä toimintahäiriön vuoksi.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# yhteinen yhteisö} other {# yhteistä yhteisöä}
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# muu} other {# muuta}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# osallistuja puhelussa} other {# osallistujaa puhelussa}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Laajenna (1 rivi)} other {Laajenna (# riviä)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Näytä lisää (# rivi)} other {Näytä lisää (# riviä)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Laajenna # muu laite} other {Laajenna # muuta laitetta}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {Puhelussa} other {# puhelussa}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Liity videopuheluun (1 osallistuja)} other {Liity videopuheluun (# osallistujaa)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "Jatka # {count, plural, one {striimin} other {striimien}} katsomista ja lisää tämä"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Toiminnot"
|
||||
msgid "Active"
|
||||
msgstr "Aktiivinen"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktiivinen tili"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Poissa juuri nyt"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Takaisin tarraan"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Takaisin äänikanavalle"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Tiivistä kanavan aihe"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Tiivistä laitteet"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Yhdistetty puheluun"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Yhdistetään..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Yhteys poistettu"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Yhteyden tila"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Kopioitu"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Tilastojen JSON-tiedot kopioitu leikepöydälle"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL kopioitu leikepöydälle"
|
||||
msgid "Copy"
|
||||
msgstr "Kopioi"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Kopioi JSON-muodossa"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Kopioi bannerin URL-osoite"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Kopioi koontiversion tiedot"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Kopioi asennusavain"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Kopioi pinon jäljitys"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Kopioi tilastojen JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Kopioi asennusavain autentikointisovellukseesi."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Kopioi käyttäjätunnus"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Kopioi video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Kopioi videolinkki"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Kopioi puhediagnostiikka"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Äänitiedoston dekoodaus epäonnistui."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Konfiguraatiota ei voitu ladata. Yritä ladata sivu uudelleen."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Katkaise yhteys"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Yhteys katkaistu"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Muokkaa tai poista muiden jäsenten luomia emojeita ja tarroja."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Muokkaa roolien ja jäsenten ohituksia tällä kanavalla."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Syötä koodi"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Koko näyttö"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Koko näyttö"
|
||||
msgid "Entire system"
|
||||
msgstr "Koko järjestelmä"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Koko järjestelmän ääni"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Poistu"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Poistu koko näytöstä"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Viimeistele ensin tilin määritys"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Viimeistele asennus"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "Käyttöjärjestelmä-tilassa yllä luetellut sanakirjat ovat ohjeellisi
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "Selaimessa paina ja puhu -toiminto toimii vain, kun {PRODUCT_NAME}-välilehti on aktiivinen. Asenna työpöytäsovellus, jos haluat käyttää paina ja puhu -toimintoa koko järjestelmässä."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Puhelussa"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Ladataan kohteita…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Ladataan instanssin asetuksia"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Haittaohjelmat, tunnusten kalastelu tai haitalliset tiedostot."
|
||||
msgid "Manage"
|
||||
msgstr "Hallitse"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Hallinnoi tilejä"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Uusimmat ensin"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Ei-animoidut emojit ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Ei mitään"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Yhteys palautettu. Valitse näyttö uudelleen, jos haluat jatkaa edellistä lähetystäsi."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Yhdistetään uudelleen..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Viite kopioitu."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Suositusparametrit"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Päivitä äänilähteet"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Itsensä vahingoittaminen tai itsemurha"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Itseisännöinnin asennus"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Istunnot"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "{fieldNode} asetettu arvoon {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Aseta mukautettu tila"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Siirretäänkö tämä tarkistus sivuun?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Määritä {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "ruotsi"
|
||||
msgid "Switch account"
|
||||
msgstr "Vaihda tiliä"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Vaihda tiliä"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Ystäväpyyntö ei ole enää saatavilla. Päivitä sivu ja yritä uudelleen."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Kuvaa ei voitu käyttää. Kokeile toista tiedostoa."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Siinä kaikki."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Tunniste #0000 on varattu Visionary-tilaajille. Visionary ei ole enää ostettavissa."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API on eri alkuperää kuin tämä sivu, joten asetuspyynnöt lähetetään ilman istuntoasi. Tarkista tämän instanssin julkinen alkuperä ja portti, ja lataa sitten uudelleen."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Sovellus kaatui"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "tuntematon käyttäjä"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Tuntematon käyttäjä"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Näytä puhelu"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Näytä puhelun hallinta"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Et voi poistaa lähettämiäsi viestejä tilin poistamisen jälkeen"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Sinun täytyy vielä suorittaa sähköpostivaihe."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Et saa ilmoituksia työpöytäsovellukseen"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Näytät offline-tilassa"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# signet} other {# signets}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# communauté trouvée} other {# communautés trouvées}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# communauté est temporairement indisponible en raison d'un dysfonctionnement du condensateur de flux.} other {# communautés sont temporairement indisponibles en raison d'un dysfonctionnement du condensateur de flux.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# communauté en commun} other {# communautés en c
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# autre} other {# autres}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# participant à l'appel} other {# participants à l'appel}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Développer (# ligne)} other {Développer (# lignes
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Afficher (# ligne)} other {Afficher (# lignes)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Afficher # autre appareil} other {Afficher # autres appareils}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {En appel} other {# en appel}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Rejoindre l'appel vidéo (1 participant)} other {Rejoindre l'appel vidéo (# participants)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Continuer à regarder # stream et ajouter celui-ci} other {Continuer à regarder # streams et ajouter celui-ci}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Actions"
|
||||
msgid "Active"
|
||||
msgstr "Actif"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Compte actif"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Absent(e) pour le moment"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Retour à l’autocollant"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Retour à l'appel vocal"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Réduire le sujet du salon"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Réduire les appareils"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Connecté à l'audio"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Connexion..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Connexion supprimée"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Statistiques de connexion"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Copié"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "JSON des statistiques copié dans le presse-papiers"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL copiée dans le presse-papiers"
|
||||
msgid "Copy"
|
||||
msgstr "Copier"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Copier au format JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Copier l'URL de la bannière"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Copier les infos de build"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Copier la clé de configuration"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Copier la trace de la pile"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Copier les statistiques JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Copiez la clé de configuration dans votre application d’authentification."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Copier l'identifiant de l'utilisateur"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Copier la vidéo"
|
||||
msgid "Copy video link"
|
||||
msgstr "Copier le lien de la vidéo"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Copier les diagnostics vocaux"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Impossible de décoder ce fichier audio."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Impossible de charger la configuration de l'instance. Essayez de recharger la page."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Déconnecter le socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Déconnecté"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Modifier ou supprimer les émojis et autocollants créés par d'autres m
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Modifier les remplacements pour les rôles et les membres dans ce salon."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Saisir le code"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Passer en plein écran"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Écran entier"
|
||||
msgid "Entire system"
|
||||
msgstr "Tout le système"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Audio du système entier"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Quitter"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Quitter le mode plein écran"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Terminez d'abord la configuration du compte"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Terminer la configuration"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "En mode \" Système d'exploitation \", les dictionnaires listés ci-dess
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "Dans un navigateur, la fonction \" Appuyer pour parler \" ne fonctionne que lorsque l'onglet {PRODUCT_NAME} est actif. Installez l'application de bureau pour utiliser cette fonction à l'échelle du système."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "En appel"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Chargement des destinations…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Chargement de la configuration de l'instance"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Logiciels malveillants, vol d'identifiants ou fichiers nuisibles."
|
||||
msgid "Manage"
|
||||
msgstr "Gérer"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Gérer les comptes"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Du plus récent au plus ancien"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Émojis non animés ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Aucun"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Reconnexion réussie. Choisissez un écran à nouveau si vous souhaitez reprendre votre précédent flux."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Reconnexion..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Référence copiée."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Paramètres de parrainage"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Actualiser les sources audio"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Automutilation ou suicide"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Configuration auto-hébergée"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sessions"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Définir {fieldNode} sur {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Définir un statut personnalisé"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Mettre cette vérification de côté ?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Configurer {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Suédois"
|
||||
msgid "Switch account"
|
||||
msgstr "Changer de compte"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Changer de compte"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Cette demande d’ami n’est plus disponible. Actualisez la page et réessayez."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Cette image n'a pas pu être utilisée. Essayez un autre fichier."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "C'est tout."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Le tag #0000 est réservé aux abonnés Visionary. L'abonnement Visionary n'est plus disponible à l'achat."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "L'API est sur une origine différente de celle de cette page, les requêtes de configuration sont donc envoyées sans votre session. Vérifiez l'origine publique et le port configurés pour cette instance, puis rechargez."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "L'application a planté"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "utilisateur inconnu"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Utilisateur inconnu"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Voir l'appel"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Afficher les commandes d'appel"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Vous ne pourrez plus supprimer les messages envoyés après la suppressi
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Vous devrez toujours terminer l'étape de l'e-mail."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Vous ne recevrez pas de notifications sur ordinateur"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Vous apparaîtrez hors ligne"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# סימנייה} other {# סימניות}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# קהילה נמצאה} other {# קהילות נמצאו}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# קהילה אינה זמינה באופן זמני עקב תקלה בקבלן השטף.} other {# קהילות אינן זמינות באופן זמני עקב תקלה בקבלן השטף.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# קהילה משותפת} other {# קהילות מ
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# אחר} other {# אחרים}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# משתתף בשיחה} other {# משתתפים בשיחה}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {הרחב (שורה אחת)} other {הרחב (# שו
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {הצג (# שורה)} other {הצג (# שורות)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {הרחב מכשיר אחד נוסף} other {הרחב # מכשירים נוספים}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {בשיחה} other {# בשיחה}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {הצטרף לשיחת וידאו (משתתף אחד)} other {הצטרף לשיחת וידאו (# משתתפים)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {המשך/המשיכי לצפות בסטרים # והוסף/הוסיפי את זה} other {המשך/המשיכי לצפות בסטרימים # והוסף/הוסיפי את זה}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "פעולות"
|
||||
msgid "Active"
|
||||
msgstr "פעיל"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "חשבון פעיל"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "מחוץ למשרד כרגע"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "חזרה למדבקה"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "חזרה לערוץ הקולי"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "כיווץ נושא הערוץ"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "כיווץ מכשירים"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "מחובר לשיחה הקולית"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "מתחבר..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "החיבור הוסר"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "נתוני חיבור"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "הועתק"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "נתוני JSON הועתקו ללוח הגזירים"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "הקישור הועתק ללוח"
|
||||
msgid "Copy"
|
||||
msgstr "העתקה"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "העתקה כ-JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "העתקת כתובת ה-URL של הבאנר"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "העתקת פרטי בנייה"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "העתק את מפתח ההגדרה"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "העתקת מעקב מחסנית"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "העתקת נתוני JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "העתק את מפתח ההגדרה לאפליקציית האימות שלך."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "העתקת מזהה משתמש"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "העתק סרטון"
|
||||
msgid "Copy video link"
|
||||
msgstr "העתקת קישור לסרטון"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "העתקת אבחון קולי"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "לא ניתן לפענח את קובץ השמע הזה."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "לא ניתן לטעון את תצורת המופע. נסה לטעון מחדש את הדף."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "נתק שקע"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "מנותק"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "עריכה או מחיקה של אימוג'י ומדבקות שנוצר
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "ערוך עקיפות עבור תפקידים וחברים בערוץ זה."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "הזן קוד"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "הצג במסך מלא"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "כל המסך"
|
||||
msgid "Entire system"
|
||||
msgstr "כל המערכת"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "כל צלילי המערכת"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "יציאה"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "יציאה ממסך מלא"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "יש לסיים קודם את הגדרת החשבון"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "סיים הגדרה"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "במצב \"מערכת הפעלה\", המילונים המפורטים ל
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "בדפדפן, דיבור בלחיצה (push-to-talk) פועל רק כשהכרטיסייה של {PRODUCT_NAME} ממוקדת. התקן את אפליקציית המחשב כדי להשתמש בדיבור בלחיצה בכל המערכת."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "בשיחה"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "טוען יעדים…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "טוען את הגדרות המופע"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "תוכנות זדוניות, גניבת פרטי כניסה או קבצ
|
||||
msgid "Manage"
|
||||
msgstr "נהל"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "ניהול חשבונות"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "החדשים ביותר ראשונים"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "אמוג׳י לא מונפשים ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "ללא"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "החיבור מחדש הצליח. בחר/י מסך שוב אם ברצונך להמשיך את השידור הקודם שלך."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "מתחבר מחדש..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "ההפניה הועתקה."
|
||||
msgid "Referral parameters"
|
||||
msgstr "פרמטרים של הפניה"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "רענון מקורות שמע"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "פגיעה עצמית או התאבדות"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "הגדרת אירוח עצמי"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "הפעלות"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "הגדר/י את {fieldNode} ל- {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "הגדר סטטוס מותאם אישית"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "להניח לבדיקה זו בצד?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "הגדרת {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "שוודית"
|
||||
msgid "Switch account"
|
||||
msgstr "החלף חשבון"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "החלף חשבונות"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "בקשת החברות הזו כבר לא זמינה. רענן ונסה שוב."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "התמונה הזו לא ניתנת לשימוש. נסה קובץ אחר."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "זה הכל."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "התגית #0000 שמורה למנויי Visionary. מינוי Visionary אינו זמין עוד לרכישה."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "ה-API נמצא במקור שונה מהדף הזה, לכן בקשות ההגדרה נשלחות ללא הסשן שלך. בדוק את המקור והפורט הציבוריים שהאינסטנס הזה מוגדר איתם, ואז טען מחדש."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "האפליקציה קרסה"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "משתמש לא ידוע"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "משתמש לא ידוע"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "הצגת שיחה"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "הצגת פקדי שיחה"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "לא תוכל/י למחוק את ההודעות ששלחת לאחר מח
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "עדיין תצטרך להשלים את שלב האימייל."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "לא תקבל התראות בשולחן העבודה"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "תופיע/י במצב לא מקוון"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# बुकमार्क} other {# बुकम
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# समुदाय मिला} other {# समुदाय मिले}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# समुदाय फ्लक्स कैपेसिटर में खराबी के कारण अस्थायी रूप से अनुपलब्ध है।} other {# समुदाय फ्लक्स कैपेसिटर में खराबी के कारण अस्थायी रूप से अनुपलब्ध हैं।}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# साझा समुदाय} other {# सा
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# अन्य} other {# अन्य}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# प्रतिभागी कॉल में है} other {# प्रतिभागी कॉल में हैं}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {विस्तार करें (# लाइन)
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {# पंक्तियाँ खोलें} other {# पंक्तियों को खोलें}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {अन्य # डिवाइस को बड़ा करें} other {अन्य # डिवाइस को बड़ा करें}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {कॉल पर} other {# लोग कॉल प
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {वीडियो कॉल में शामिल हों (# प्रतिभागी)} other {वीडियो कॉल में शामिल हों (# प्रतिभागी)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {# स्ट्रीम देखना जारी रखें और इसे जोड़ें} other {# स्ट्रीम देखना जारी रखें और इसे जोड़ें}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "कार्यवाहियां"
|
||||
msgid "Active"
|
||||
msgstr "सक्रिय"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "सक्रिय खाता"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "अभी दूर हैं"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "स्टिकर पर वापस जाएँ"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "वॉइस चैनल पर वापस जाएँ"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "चैनल विषय छोटा करें"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "डिवाइसों को छोटा करें"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "वॉइस से कनेक्ट किया गया"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "कनेक्ट हो रहा है..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "कनेक्शन हटाया गया"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "कनेक्शन के आँकड़े"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "कॉपी किया गया"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "आँकड़ों का JSON क्लिपबोर्ड पर कॉपी किया गया"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "यूआरएल क्लिपबोर्ड पर कॉपी
|
||||
msgid "Copy"
|
||||
msgstr "कॉपी करें"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "JSON के रूप में कॉपी करें"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "बैनर यूआरएल कॉपी करें"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "बिल्ड की जानकारी कॉपी करें"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "सेटअप कुंजी कॉपी करें"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "स्टैक ट्रेस कॉपी करें"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "आँकड़ों का JSON कॉपी करें"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "अपनी ऑथेंटिकेटर ऐप में सेटअप कुंजी कॉपी करें।"
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "यूज़र आईडी कॉपी करें"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "वीडियो कॉपी करें"
|
||||
msgid "Copy video link"
|
||||
msgstr "वीडियो लिंक कॉपी करें"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "वॉइस डाइग्नोस्टिक्स कॉपी करें"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "इस ऑडियो फ़ाइल को डीकोड नहीं किया जा सका."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "इंस्टेंस कॉन्फ़िगरेशन लोड नहीं हो सका। पेज को रीलोड करने का प्रयास करें।"
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "सॉकेट डिस्कनेक्ट करें"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "डिस्कनेक्ट किया गया"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "दूसरे सदस्यों द्वारा बनाए
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "इस चैनल में भूमिकाओं और सदस्यों के लिए ओवरराइट संपादित करें।"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "कोड डालें"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "फ़ुलस्क्रीन पर जाएं"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "पूरी स्क्रीन"
|
||||
msgid "Entire system"
|
||||
msgstr "पूरा सिस्टम"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "पूरे सिस्टम की ऑडियो"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "बाहर निकलें"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "फ़ुलस्क्रीन से बाहर निकलें"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "पहले अकाउंट सेटअप पूरा करे
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "सेटअप पूरा करें"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "\"ऑपरेटिंग सिस्टम\" मोड में, ऊ
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "ब्राउज़र में, पुश-टू-टॉक तभी काम करता है जब {PRODUCT_NAME} टैब फ़ोकस में हो। सिस्टम-वाइड पुश-टू-टॉक के लिए डेस्कटॉप ऐप इंस्टॉल करें।"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "कॉल पर हैं"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "गंतव्य लोड हो रहे हैं…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "इंस्टेंस कॉन्फ़िगरेशन लोड हो रहा है"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "मैलवेयर, क्रेडेंशियल चोरी
|
||||
msgid "Manage"
|
||||
msgstr "प्रबंधित करें"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "खाते प्रबंधित करें"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "सबसे नया पहले"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "गैर-एनिमेटेड इमोजी ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "कोई नहीं"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "फिर से कनेक्ट हो गया है। अगर आप अपनी पिछली स्ट्रीम फिर से शुरू करना चाहते हैं, तो कोई दूसरी स्क्रीन चुनें।"
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "फिर से कनेक्ट हो रहा है..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "रेफरेंस कॉपी किया गया."
|
||||
msgid "Referral parameters"
|
||||
msgstr "रेफरल पैरामीटर"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "ऑडियो स्रोत रीफ़्रेश करें"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "खुद को नुकसान पहुँचाना या आत्महत्या"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "सेल्फ-होस्ट सेटअप"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "सेशन"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "{fieldNode} को {0} पर सेट करें।"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "कस्टम स्टेटस सेट करें"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "इस जाँच को अलग रख दें?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "{productName} सेट अप करें"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "स्वीडिश"
|
||||
msgid "Switch account"
|
||||
msgstr "खाता बदलें"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "खाते बदलें"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "वह फ्रेंड रिक्वेस्ट अब उपलब्ध नहीं है। रीफ़्रेश करें और फिर से कोशिश करें।"
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "वह इमेज इस्तेमाल नहीं की जा सकी। कोई दूसरी फ़ाइल आज़माएँ।"
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "बस इतना ही था।"
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "#0000 टैग विजनरी सब्सक्राइबर के लिए रिज़र्व है। विजनरी अब खरीदने के लिए उपलब्ध नहीं है।"
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API इस पेज से अलग ओरिजिन पर है, इसलिए सेटअप अनुरोध आपके सेशन के बिना भेजे जा रहे हैं। इस इंस्टेंस के लिए कॉन्फ़िगर किए गए पब्लिक ओरिजिन और पोर्ट की जाँच करें, फिर रीलोड करें।"
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "ऐप क्रैश हो गया"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "अज्ञात यूज़र"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "अज्ञात यूज़र"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "कॉल देखें"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "कॉल नियंत्रण देखें"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "आपका अकाउंट डिलीट होने के ब
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "आपको अभी भी ईमेल वाला चरण पूरा करना होगा।"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "आपको डेस्कटॉप पर सूचनाएं नहीं मिलेंगी"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "आप ऑफ़लाइन दिखेंगे"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# oznaka} other {# oznake}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# zajednica pronađena} few {# zajednice pronađene} other {# zajednica pronađeno}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# zajednica privremeno nije dostupna zbog kvara na protočnom kondenzatoru.} other {# zajednice privremeno nisu dostupne zbog kvara na protočnom kondenzatoru.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# zajednička zajednica} other {# zajedničke zajed
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# drugi} other {# ostalih}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# sudionik u pozivu} few {# sudionika u pozivu} other {# sudionika u pozivu}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Proširi (# redak)} other {Proširi (# redaka)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Prikaži (# red)} other {Prikaži (# redova)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Proširi # drugi uređaj} other {Proširi # druga uređaja}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {U pozivu} other {# u pozivu}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Pridruži se videopozivu (# sudionik)} other {Pridruži se videopozivu (# sudionika)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Nastavi gledati # stream i dodaj ovaj} other {Nastavi gledati # streama i dodaj ovaj}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Radnje"
|
||||
msgid "Active"
|
||||
msgstr "Aktivno"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktivan račun"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Trenutno odsutan"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Natrag na naljepnicu"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Natrag na glasovni kanal"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Sažmi temu kanala"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Sažmi uređaje"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Povezano s glasovnim chatom"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Povezivanje..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Veza uklonjena"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Statistika veze"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Kopirano"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statistike JSON kopirane u međuspremnik"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL kopiran u međuspremnik"
|
||||
msgid "Copy"
|
||||
msgstr "Kopiraj"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Kopiraj kao JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Kopiraj URL naslovne slike"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Kopiraj podatke o verziji"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Kopiraj ključ za postavljanje"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Kopiraj trag stoga"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Kopiraj JSON statistike"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Kopirajte ključ za postavljanje u svoju aplikaciju za autentifikaciju."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Kopiraj korisnički ID"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Kopiraj videozapis"
|
||||
msgid "Copy video link"
|
||||
msgstr "Kopiraj poveznicu videozapisa"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Kopiraj dijagnostiku glasa"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Nije moguće dekodirati ovu audio datoteku."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Nije moguće učitati konfiguraciju instance. Pokušajte ponovno učitati stranicu."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Prekini vezu sa socketom"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Prekinuto"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Uređivanje ili brisanje emojija i naljepnica koje su izradili drugi čl
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Uredite nadjačavanja za uloge i članove u ovom kanalu."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Unesite kod"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Prikaz preko cijelog zaslona"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Cijeli zaslon"
|
||||
msgid "Entire system"
|
||||
msgstr "Cijeli sustav"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Zvuk cijelog sustava"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Izlaz"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Izađi iz prikaza preko cijelog zaslona"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Prvo dovršite postavljanje računa"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Završi postavljanje"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "U načinu rada \"Operativni sustav\" gore navedeni rječnici su savjetod
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "U pregledniku, pritisni za razgovor radi samo dok je kartica {PRODUCT_NAME} aktivna. Instalirajte desktop aplikaciju za pritisni za razgovor na cijelom sustavu."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "U pozivu"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Učitavanje odredišta…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Učitavanje konfiguracije instance"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Zlonamjerni softver, krađa vjerodajnica ili štetne datoteke."
|
||||
msgid "Manage"
|
||||
msgstr "Upravljanje"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Upravljanje računima"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Prvo najnovije"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Neanimirani emotikoni ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Ništa"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Ponovno povezivanje uspješno. Ponovno odaberite zaslon ako želite nastaviti prethodni prijenos."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Ponovno povezivanje..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referenca kopirana."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Parametri preporuke"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Osvježi izvore zvuka"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Samoozljeđivanje ili samoubojstvo"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Postavljanje samostalnog hostinga"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sesije"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Postavljeno {fieldNode} na {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Postavi prilagođeni status"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Ostaviti ovu provjeru po strani?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Postavite {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Švedski"
|
||||
msgid "Switch account"
|
||||
msgstr "Prebaci račun"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Promijeni račun"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Taj zahtjev za prijateljstvo više nije dostupan. Osvježite i pokušajte ponovno."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Ta se slika nije mogla koristiti. Isprobajte drugu datoteku."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "To je sve."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Oznaka #0000 rezervirana je za pretplatnike Visionary. Visionary više nije dostupan za kupnju."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API je na drugom podrijetlu od ove stranice, pa se zahtjevi za postavljanje šalju bez vaše sesije. Provjerite javno podrijetlo i priključak s kojima je ova instanca konfigurirana, a zatim ponovno učitajte."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Aplikacija se srušila"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "nepoznat korisnik"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Nepoznat korisnik"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Prikaži poziv"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Prikaži kontrole poziva"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Nećete moći izbrisati poslane poruke nakon što izbrišete račun"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Još uvijek ćete morati dovršiti korak s e-poštom."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Nećete primati obavijesti na računalu"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Prikazivat ćete se izvan mreže"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# könyvjelző} other {# könyvjelző}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# közösség található} other {# közösség található}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# közösség átmenetileg nem elérhető egy \"fluxuskondenzátor\" meghibásodása miatt.} other {# közösség átmenetileg nem elérhető egy \"fluxuskondenzátor\" meghibásodása miatt.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# közös közösség} other {# közös közösség
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# másik} other {# többiek}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# résztvevő a hívásban} other {# résztvevő a hívásban}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Kibontás (# sor)} other {Kibontás (# sor)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Bontsd ki (# sor)} other {Bontsd ki (# sorok)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Kibontás: # további eszköz} other {Kibontás: # további eszköz}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {Hívásban} other {#-en hívásban}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Csatlakozás videóhíváshoz (1 résztvevő)} other {Csatlakozás videóhíváshoz (# résztvevő)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Folytasd a(z) # stream nézését, és add hozzá ezt} other {Folytasd a(z) # stream nézését, és add hozzá ezt}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Műveletek"
|
||||
msgid "Active"
|
||||
msgstr "Aktív"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktív fiók"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Jelenleg távol"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Vissza a matricához"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Vissza a hangcsatornára"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Csatornatéma összecsukása"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Eszközök összecsukása"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Csatlakozva a hangcsevegéshez"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Kapcsolódás..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Kapcsolat eltávolítva"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Kapcsolat statisztikái"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Másolva"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "A statisztikai JSON kimásolva a vágólapra"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL kimásolva a vágólapra"
|
||||
msgid "Copy"
|
||||
msgstr "Másolás"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Másolás JSON-ként"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Banner URL másolása"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Buildinformációk másolása"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Másold a beállítási kulcsot"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Veremkövetés másolása"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Statisztika JSON másolása"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Másold a beállítási kulcsot az autentikátor alkalmazásodba."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Felhasználói azonosító másolása"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Videó másolása"
|
||||
msgid "Copy video link"
|
||||
msgstr "Videólink másolása"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Hangdiagnosztika másolása"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Nem sikerült dekódolni ezt a hangfájlt."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Nem sikerült betölteni az instanciakonfigurációt. Próbáld meg újra betölteni az oldalt."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Szétkapcsolás"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Kapcsolat megszakadt"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Más tagok által létrehozott hangulatjelek és matricák szerkesztése
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "A szerepkörök és tagok felülírásainak szerkesztése ebben a csatornában."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Kód megadása"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Teljes képernyőre váltás"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Teljes képernyő"
|
||||
msgid "Entire system"
|
||||
msgstr "Teljes rendszer"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Teljes rendszerhang"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Kilépés"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Kilépés a teljes képernyős módból"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Előbb fejezd be a fiók beállítását"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "A beállítás befejezése"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "\"Operációs rendszer\" módban a fent felsorolt szótárak tájékozta
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "Böngészőben a nyomva tartva beszélés csak akkor működik, ha a {PRODUCT_NAME} lap aktív. Telepítse az asztali alkalmazást a rendszer egészére kiterjedő nyomva tartva beszéléshez."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Hívásban"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Célok betöltése…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Példánykonfiguráció betöltése"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Kártevő, hitelesítő adatok lopása vagy káros fájlok."
|
||||
msgid "Manage"
|
||||
msgstr "Kezelés"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Fiókok kezelése"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Legújabb elöl"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Nem animált hangulatjelek ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Nincs"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Az újracsatlakozás sikeres. Ha folytatni szeretnéd az előző streamet, válassz újra egy képernyőt."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Újracsatlakozás..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Hivatkozás másolva."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Ajánlási paraméterek"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Hangforrások frissítése"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Önsértés vagy öngyilkosság"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Önkiszolgáló beállítás"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Munkamenetek"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "{fieldNode} beállítása {0} értékre."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Egyéni állapot beállítása"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Elhalasztod ezt az ellenőrzést?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Állítsd be a(z) {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "svéd"
|
||||
msgid "Switch account"
|
||||
msgstr "Fiók váltása"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Fiókváltás"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Ez a barátkérelem már nem elérhető. Frissítsd az oldalt, és próbáld újra."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Nem sikerült felhasználni ezt a képet. Próbálkozzon egy másik fájllal."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Ennyi volt az összes."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "A #0000 címke a Visionary előfizetők számára van fenntartva. A Visionary már nem vásárolható meg."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "Az API és ez az oldal eltérő eredetűek, ezért a beállítási kérések a munkameneted nélkül kerülnek elküldésre. Ellenőrizd az ehhez az instanciához konfigurált nyilvános eredetet és portot, majd töltsd újra az oldalt."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Az alkalmazás összeomlott"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "ismeretlen felhasználó"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Ismeretlen felhasználó"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Hívás megtekintése"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Hívásvezérlők megtekintése"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Fiókja törlése után már nem tudja törölni az elküldött üzenete
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Még be kell fejezned az e-mail lépést."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Nem fogsz értesítéseket kapni az asztali gépen"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Offline állapotban fogsz megjelenni"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# markah} other {# markah}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# komunitas ditemukan} other {# komunitas ditemukan}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# komunitas sementara tidak tersedia karena kerusakan kapasitor fluks.} other {# komunitas sementara tidak tersedia karena kerusakan kapasitor fluks.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# komunitas bersama} other {# komunitas bersama}}"
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# lainnya} other {# lainnya}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# peserta dalam panggilan} other {# peserta dalam panggilan}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Perluas (# baris)} other {Perluas (# baris)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Tampilkan (# baris)} other {Tampilkan (# baris)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Perluas # perangkat lain} other {Perluas # perangkat lain}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {Dalam panggilan} other {# dalam panggilan}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Gabung panggilan video (# peserta)} other {Gabung panggilan video (# peserta)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Tetap tonton # stream dan tambahkan yang ini} other {Tetap tonton # stream dan tambahkan yang ini}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Tindakan"
|
||||
msgid "Active"
|
||||
msgstr "Aktif"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Akun aktif"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Sedang tidak di tempat"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Kembali ke stiker"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Kembali ke saluran suara"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Ciutkan topik saluran"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Ciutkan perangkat"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Terhubung ke obrolan suara"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Menghubungkan..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Koneksi dihapus"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Statistik koneksi"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Disalin"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statistik JSON disalin ke papan klip"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL disalin ke papan klip"
|
||||
msgid "Copy"
|
||||
msgstr "Salin"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Salin sebagai JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Salin URL banner"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Salin info build"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Salin kunci pengaturan"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Salin jejak tumpukan"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Salin statistik JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Salin kunci pengaturan ke aplikasi autentikator Anda."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Salin ID pengguna"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Salin video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Salin tautan video"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Salin diagnostik suara"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Tidak dapat mendekode file audio ini."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Konfigurasi instance tidak dapat dimuat. Coba muat ulang halaman."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Putuskan sambungan soket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Terputus"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Edit atau hapus emoji dan stiker yang dibuat oleh anggota lain."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Edit penimpaan untuk peran dan anggota di saluran ini."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Masukkan kode"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Masuk mode layar penuh"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Seluruh layar"
|
||||
msgid "Entire system"
|
||||
msgstr "Seluruh sistem"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Seluruh audio sistem"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Keluar"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Keluar dari layar penuh"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Selesaikan penyiapan akun dulu"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Selesaikan penyiapan"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "Dalam mode \"Sistem operasi\", kamus yang tercantum di atas bersifat sar
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "Di browser, push-to-talk hanya berfungsi saat tab {PRODUCT_NAME} sedang aktif. Instal aplikasi desktop untuk push-to-talk di seluruh sistem."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Dalam panggilan"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Memuat tujuan…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Memuat konfigurasi instance"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Malware, pencurian kredensial, atau file berbahaya."
|
||||
msgid "Manage"
|
||||
msgstr "Kelola"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Kelola akun"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Terbaru dulu"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Emoji non-animasi ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Tidak ada"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Sambung ulang berhasil. Pilih layar lagi jika Anda ingin melanjutkan streaming sebelumnya."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Menghubungkan ulang..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referensi disalin."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Parameter rujukan"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Segarkan sumber audio"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Melukai diri sendiri atau bunuh diri"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Penyiapan hosting mandiri"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sesi"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Atur {fieldNode} ke {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Atur status kustom"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Singkirkan pemeriksaan ini?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Siapkan {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Swedia"
|
||||
msgid "Switch account"
|
||||
msgstr "Ganti akun"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Ganti akun"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Permintaan pertemanan itu tidak lagi tersedia. Segarkan dan coba lagi."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Gambar itu tidak dapat digunakan. Coba file lain."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Itu saja semuanya."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Tag #0000 dicadangkan untuk pelanggan Visionary. Visionary tidak lagi tersedia untuk pembelian."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API berada di origin yang berbeda dari halaman ini, sehingga permintaan penyiapan dikirim tanpa sesi Anda. Periksa origin publik dan port yang dikonfigurasi untuk instance ini, lalu muat ulang."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Aplikasi mengalami error"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "pengguna tidak dikenal"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Pengguna tidak dikenal"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Lihat panggilan"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Lihat kontrol panggilan"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Anda tidak akan bisa menghapus pesan terkirim setelah akun Anda dihapus"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Anda masih perlu menyelesaikan langkah email."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Anda tidak akan menerima notifikasi di desktop"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Anda akan terlihat offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# segnalibro} other {# segnalibri}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# community trovata} other {# community trovate}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# community è temporaneamente non disponibile a causa di un malfunzionamento del condensatore di flusso.} other {# community sono temporaneamente non disponibili a causa di un malfunzionamento del condensatore di flusso.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# community in comune} other {# community in comune
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# altro} other {# altri}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# partecipante alla chiamata} other {# partecipanti alla chiamata}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Espandi (# riga)} other {Espandi (# righe)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Espandi (# riga)} other {Espandi (# righe)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Espandi # altro dispositivo} other {Espandi # altri dispositivi}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {In chiamata} other {# in chiamata}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Partecipa alla videochiamata (# partecipante)} other {Partecipa alla videochiamata (# partecipanti)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Continua a guardare # stream e aggiungi questo} other {Continua a guardare # stream e aggiungi questo}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Azioni"
|
||||
msgid "Active"
|
||||
msgstr "Attiva"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Account attivo"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Assente in questo momento"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Torna all'adesivo"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Torna al canale vocale"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Comprimi l'argomento del canale"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Comprimi dispositivi"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Connesso alla chat vocale"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Connessione..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Connessione rimossa"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Statistiche connessione"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Copiato"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statistiche JSON copiate negli appunti"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL copiato negli appunti"
|
||||
msgid "Copy"
|
||||
msgstr "Copia"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Copia come JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Copia URL banner"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Copia info build"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Copia la chiave di configurazione"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Copia stack trace"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Copia JSON statistiche"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Copia la chiave di configurazione nell'app di autenticazione."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Copia ID utente"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Copia video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Copia link video"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Copia diagnostica vocale"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Impossibile decodificare questo file audio."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Impossibile caricare la configurazione dell'istanza. Riprova a ricaricare la pagina."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Disconnetti socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Disconnesso"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Modifica o elimina emoji e sticker creati da altri membri."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Modifica le sovrascritture per ruoli e membri in questo canale."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Inserisci codice"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Attiva schermo intero"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Schermo intero"
|
||||
msgid "Entire system"
|
||||
msgstr "Intero sistema"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Audio di sistema"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Esci"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Esci dalla modalità a schermo intero"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Completa prima la configurazione dell'account"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Completa la configurazione"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "In modalità \"Sistema operativo\", i dizionari elencati sopra sono indi
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "In un browser, la funzione \"Premi per parlare\" funziona solo quando la scheda di {PRODUCT_NAME} è attiva. Installa l'app desktop per usare la funzione \"Premi per parlare\" a livello di sistema."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "In chiamata"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Caricamento destinazioni…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Caricamento configurazione istanza"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Malware, furto di credenziali o file dannosi."
|
||||
msgid "Manage"
|
||||
msgstr "Gestisci"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Gestisci account"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Più recenti prima"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Emoji non animate ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Nessuno"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Riconnessione riuscita. Scegli di nuovo uno schermo se vuoi riprendere il tuo stream precedente."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Riconnessione..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Riferimento copiato."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Parametri di riferimento"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Aggiorna sorgenti audio"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Autolesionismo o suicidio"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Configurazione self-hosted"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sessioni"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Imposta {fieldNode} su {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Imposta uno stato personalizzato"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Mettere da parte questo controllo?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Configura {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Svedese"
|
||||
msgid "Switch account"
|
||||
msgstr "Cambia account"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Cambia account"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "La richiesta di amicizia non è più disponibile. Aggiorna e riprova."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Impossibile utilizzare quell'immagine. Prova con un file diverso."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Questo è tutto."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Il tag #0000 è riservato agli abbonati Visionary. Visionary non è più disponibile per l'acquisto."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "L'API si trova su un'origine diversa da questa pagina, quindi le richieste di configurazione vengono inviate senza la tua sessione. Controlla l'origine pubblica e la porta con cui è configurata questa istanza, quindi ricarica."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "L'app si è bloccata"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "utente sconosciuto"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Utente sconosciuto"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Visualizza chiamata"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Mostra i controlli della chiamata"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Non potrai eliminare i messaggi inviati dopo l'eliminazione del tuo acco
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Dovrai comunque completare il passaggio dell'email."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Non riceverai notifiche sul desktop"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Risulterai offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {#件のブックマーク} other {#件のブック
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {#件のコミュニティが見つかりました} other {#件のコミュニティが見つかりました}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {#件のコミュニティはフラックスキャパシタの不具合により一時的に利用できません。} other {#件のコミュニティはフラックスキャパシタの不具合により一時的に利用できません。}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {#つの共通コミュニティ} other {#つの共
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {#人} other {#人}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {#人が通話中} other {#人が通話中}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {展開(#行)} other {展開(#行)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {#行を展開} other {#行を展開}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {#件の他のデバイスを展開} other {#件の他のデバイスを展開}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {通話中} other {#人が通話中}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {ビデオ通話に参加(#人)} other {ビデオ通話に参加(#人)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {#件のストリームを視聴し続け、これを追加} other {#件のストリームを視聴し続け、これを追加}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "アクション"
|
||||
msgid "Active"
|
||||
msgstr "有効"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "使用中のアカウント"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "現在離席中"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "ステッカーに戻る"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "音声チャンネルに戻る"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "チャンネルのトピックを折りたたむ"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "デバイスを折りたたむ"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "ボイスに接続中"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "接続中..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "接続を削除しました"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "接続状況"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "コピーしました"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "統計情報JSONをクリップボードにコピーしました"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URLをクリップボードにコピーしました"
|
||||
msgid "Copy"
|
||||
msgstr "コピー"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "JSONとしてコピー"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "バナーURLをコピー"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "ビルド情報をコピー"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "設定キーをコピー"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "スタックトレースをコピー"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "統計情報をJSONでコピー"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "認証アプリに設定キーをコピーしてください。"
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "ユーザーIDをコピー"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "動画をコピー"
|
||||
msgid "Copy video link"
|
||||
msgstr "動画のリンクをコピー"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "音声診断をコピー"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "この音声ファイルをデコードできませんでした。"
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "インスタンスの設定を読み込めませんでした。ページを再読み込みしてください。"
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "ソケットを切断"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "切断されました"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "他のメンバーが作成した絵文字やスタンプを編集また
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "このチャンネルでのロールとメンバーの上書き設定を編集."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "コードを入力"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "全画面表示"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "画面全体"
|
||||
msgid "Entire system"
|
||||
msgstr "システム全体"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "システム全体の音声"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "終了"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "フルスクリーンを終了"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "まずアカウント設定を完了してください"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "セットアップを完了"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "「OSの設定に従う」モードでは、上記の辞書は推奨と
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "ブラウザでは、プッシュトゥトークは{PRODUCT_NAME}タブがフォーカスされている間のみ機能します。システム全体でプッシュトゥトークを使用するには、デスクトップアプリをインストールしてください。"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "通話中"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "送信先を読み込み中…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "インスタンス設定を読み込み中"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "マルウェア、認証情報窃盗、または有害なファイル。
|
||||
msgid "Manage"
|
||||
msgstr "管理"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "アカウントを管理"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "新しい順"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "非アニメーション絵文字 ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "なし"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "再接続しました。以前のストリームを再開したい場合は、もう一度画面を選択してください。"
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "再接続中..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "参照をコピーしました。"
|
||||
msgid "Referral parameters"
|
||||
msgstr "紹介パラメーター"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "音声ソースを更新"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "自傷行為または自殺"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "セルフホスト設定"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "セッション"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "{fieldNode}を{0}に設定."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "カスタムステータスを設定"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "このチェックをスキップしますか?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "{productName} を設定する"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "スウェーデン語"
|
||||
msgid "Switch account"
|
||||
msgstr "アカウントを切り替える"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "アカウントを切り替える"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "この友達リクエストは利用できなくなりました。画面を更新してもう一度お試しください。"
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "その画像は使用できませんでした。別のファイルをお試しください。"
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "ブックマークは以上です。"
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "#0000タグはVisionary登録者専用です。Visionaryは現在購入できません。"
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "APIがこのページと異なるオリジンにあるため、セットアップリクエストはセッションなしで送信されます。このインスタンスで設定されているパブリックオリジンとポートを確認してから、再読み込みしてください。"
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "アプリがクラッシュしました"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "不明なユーザー"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "不明なユーザー"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "通話を表示"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "通話コントロールを表示"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "アカウント削除後、送信済みのメッセージを削除する
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "メールでの確認も完了させる必要があります。"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "デスクトップでは通知を受け取りません"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "オフラインと表示されます"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {#개 북마크} other {#개 북마크}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {#개 커뮤니티 찾음} other {#개 커뮤니티 찾음}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {#개 커뮤니티가 플럭스 캐패시터 오작동으로 인해 일시적으로 이용할 수 없습니다.} other {#개 커뮤니티가 플럭스 캐패시터 오작동으로 인해 일시적으로 이용할 수 없습니다.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {#개의 공통 커뮤니티} other {#개의 공통
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {#명 외} other {#명 외}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {#명 통화 중} other {#명 통화 중}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {펼치기 (#줄)} other {펼치기 (#줄)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {# 행 확장} other {# 행 확장}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {#개의 다른 기기 확장} other {#개의 다른 기기 확장}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {통화 중} other {#명 통화 중}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {영상 통화 참여 (참여자 #명)} other {영상 통화 참여 (참여자 #명)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {#개의 스트림을 계속 시청하고 이 스트림을 추가합니다} other {#개의 스트림을 계속 시청하고 이 스트림을 추가합니다}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "작업"
|
||||
msgid "Active"
|
||||
msgstr "활성"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "사용 중인 계정"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "지금은 부재중"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "스티커로 돌아가기"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "음성 채널로 돌아가기"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "채널 주제 접기"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "기기 접기"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "음성 연결됨"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "연결 중..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "연결 삭제됨"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "연결 상태"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "복사됨"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "통계 JSON을 클립보드에 복사했습니다"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL이 클립보드에 복사되었습니다"
|
||||
msgid "Copy"
|
||||
msgstr "복사"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "JSON으로 복사"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "배너 URL 복사"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "빌드 정보 복사"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "설정 키 복사"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "스택 트레이스 복사"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "통계 JSON 복사"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "인증 앱에 설정 키를 복사하세요."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "사용자 ID 복사"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "동영상 복사"
|
||||
msgid "Copy video link"
|
||||
msgstr "동영상 링크 복사"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "음성 진단 복사"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "이 오디오 파일을 디코딩할 수 없습니다."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "인스턴스 구성을 불러올 수 없습니다. 페이지를 새로고침해 보세요."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "소켓 연결 해제"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "연결 끊김"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "다른 멤버가 만든 이모티콘 및 스티커를 수정하거나
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "이 채널의 역할 및 멤버 권한을 수정합니다."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "코드 입력"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "전체 화면으로 보기"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "전체 화면"
|
||||
msgid "Entire system"
|
||||
msgstr "시스템 전체"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "시스템 오디오 전체"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "나가기"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "전체 화면 종료"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "먼저 계정 설정을 완료하세요"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "설정 완료"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "'운영체제' 모드에서는 위에 나열된 사전은 권장 사항
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "브라우저에서는 {PRODUCT_NAME} 탭이 활성화된 경우에만 PTT(Push-to-Talk)가 작동합니다. 시스템 전체에서 PTT를 사용하려면 데스크톱 앱을 설치하세요."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "통화 중"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "대상 불러오는 중…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "인스턴스 구성을 불러오는 중"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "악성코드, 개인 정보 도용 또는 유해 파일."
|
||||
msgid "Manage"
|
||||
msgstr "관리"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "계정 관리"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "최신순"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "움직이지 않는 이모티콘 ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "없음"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "재연결되었습니다. 이전 스트림을 다시 시작하려면 화면을 다시 선택하세요."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "다시 연결 중..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "참조가 복사되었습니다."
|
||||
msgid "Referral parameters"
|
||||
msgstr "추천 매개변수"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "오디오 소스 새로고침"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "자해 또는 자살"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "셀프 호스팅 설정"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "세션"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "{fieldNode}을(를) {0}(으)로 설정했습니다."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "맞춤 상태 설정"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "이 확인을 건너뛸까요?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "{productName} 설정"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "스웨덴어"
|
||||
msgid "Switch account"
|
||||
msgstr "계정 전환"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "계정 전환"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "친구 요청을 더 이상 사용할 수 없습니다. 새로고침 후 다시 시도해 주세요."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "해당 이미지를 사용할 수 없습니다. 다른 파일을 시도해 보세요."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "모두 불러왔습니다."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "#0000 태그는 Visionary 구독자 전용입니다. Visionary는 더 이상 구매할 수 없습니다."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API가 이 페이지와 다른 출처에 있으므로 세션 없이 설정 요청이 전송됩니다. 구성된 공개 출처 및 포트를 확인한 후 새로고침하세요."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "앱이 비정상적으로 종료되었습니다"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "알 수 없는 사용자"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "알 수 없는 사용자"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "통화 보기"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "통화 제어 보기"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "계정 삭제 후에는 보낸 메시지를 삭제할 수 없습니다"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "이메일 단계를 완료해야 합니다."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "데스크톱에서는 알림을 받지 않습니다"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "오프라인으로 표시됩니다"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# žymė} other {# žymės}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# bendrija rasta} other {# bendrijų rasta}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# bendruomenė laikinai nepasiekiama dėl srauto kondensatoriaus gedimo.} other {# bendruomenės laikinai nepasiekiamos dėl srauto kondensatoriaus gedimo.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# bendra bendruomenė} other {# bendros bendruomen
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# kitas} other {# kiti}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# dalyvis skambutyje} other {# dalyviai skambutyje}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Išskleisti (# eilutę)} other {Išskleisti (# eilu
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Rodyti (# eilutę)} other {Rodyti (# eilutes)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Išskleisti # kitą įrenginį} other {Išskleisti # kitus įrenginius}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {skambina} other {# skambina}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Prisijungti prie vaizdo skambučio (# dalyvis)} other {Prisijungti prie vaizdo skambučio (# dalyviai)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Toliau žiūrėti # srautą ir pridėti šį} other {Toliau žiūrėti # srautus ir pridėti šį}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Veiksmai"
|
||||
msgid "Active"
|
||||
msgstr "Aktyvus"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktyvi paskyra"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Šiuo metu nesu prie kompiuterio"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Grįžti prie lipduko"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Grįžti į balso kanalą"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Sutraukti kanalo temą"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Sutraukti įrenginius"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Prisijungta prie balso pokalbio"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Jungiamasi..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Ryšys pašalintas"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Ryšio statistika"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Nukopijuota"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statistikos JSON nukopijuotas į iškarpinę"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL nukopijuotas į iškarpinę"
|
||||
msgid "Copy"
|
||||
msgstr "Kopijuoti"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Kopijuoti kaip JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Kopijuoti reklamjuostės URL"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Kopijuoti versijos informaciją"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Nukopijuokite nustatymo raktą"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Kopijuoti steko atsekimą"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Kopijuoti statistikos JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Nukopijuokite nustatymo raktą į savo autentifikavimo programėlę."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Kopijuoti vartotojo ID"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Kopijuoti vaizdo įrašą"
|
||||
msgid "Copy video link"
|
||||
msgstr "Kopijuoti vaizdo įrašo nuorodą"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Kopijuoti balso diagnostiką"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Nepavyko iššifruoti šio garso failo."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Nepavyko įkelti instancijos konfigūracijos. Pabandykite perkrauti puslapį."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Atjungti lizdą"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Atjungta"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Redaguoti arba ištrinti kitų narių sukurtus jaustukus ir lipdukus."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Redaguoti šio kanalo vaidmenų ir narių perrašymus."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Įvesti kodą"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Įjungti viso ekrano režimą"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Visas ekranas"
|
||||
msgid "Entire system"
|
||||
msgstr "Visa sistema"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Visos sistemos garsas"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Išeiti"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Išeiti iš viso ekrano režimo"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Pirmiausia užbaikite paskyros nustatymą"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Baigti sąranką"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "\"Operacinės sistemos\" režimu aukščiau išvardyti žodynai yra pata
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "Naršyklėje \"push-to-talk\" veikia tik tada, kai \"{PRODUCT_NAME}\" skirtukas yra aktyvus. Įdiekite darbalaukio programą, kad \"push-to-talk\" veiktų visoje sistemoje."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Skambučio metu"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Įkeliamos paskirties vietos…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Įkeliama instancijos konfigūracija"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Kenkėjiškos programos, prisijungimo duomenų vagystė arba žalingi fa
|
||||
msgid "Manage"
|
||||
msgstr "Tvarkyti"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Tvarkyti paskyras"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Pirmiausia naujausi"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Neanimuoti jaustukai ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Nėra"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Prisijungimas sėkmingas. Jei norite tęsti ankstesnę transliaciją, pasirinkite ekraną dar kartą."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Jungiamasi iš naujo..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Nuoroda nukopijuota."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Nuorodos parametrai"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Atnaujinti garso šaltinius"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Savižala ar savižudybė"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Savarankiško prieglobos sąranka"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Seansai"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Nustatyti \"{fieldNode}\" į \"{0}\"."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Nustatyti pasirinktinę būseną"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Atidėti šį patikrinimą?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Nustatykite {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "švedų"
|
||||
msgid "Switch account"
|
||||
msgstr "Perjungti paskyrą"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Keisti paskyras"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Šis draugo užklausimas nebegalimas. Atnaujinkite ir bandykite dar kartą."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Šio paveikslėlio naudoti nepavyko. Pabandykite kitą."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Tai viskas."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Žyma #0000 yra rezervuota \"Visionary\" prenumeratoriams. \"Visionary\" nebepasiekiama įsigyti."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API yra kitos kilmės nei šis puslapis, todėl sąrankos užklausos siunčiamos be jūsų sesijos. Patikrinkite viešąją kilmę ir prievadą, su kuriais sukonfigūruota ši instancija, tada perkraukite."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Programa sudužo"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "nežinomas naudotojas"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Nežinomas naudotojas"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Peržiūrėti skambutį"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Peržiūrėti skambučio valdiklius"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Ištrynus paskyrą, išsiųstų žinučių ištrinti nebegalėsite"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Vis tiek turėsite užbaigti el. pašto patvirtinimą."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Pranešimų darbalaukyje negausite"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Atrodysite neprisijungęs"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# bladwijzer} other {# bladwijzers}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# community gevonden} other {# communities gevonden}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# community is tijdelijk niet beschikbaar door een storing in de fluxcondensator.} other {# communities zijn tijdelijk niet beschikbaar door een storing in de fluxcondensator.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# gemeenschappelijke community} other {# gemeenscha
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# ander} other {# anderen}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# deelnemer aan gesprek} other {# deelnemers aan gesprek}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Uitvouwen (# regel)} other {Uitvouwen (# regels)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Toon (# rij)} other {Toon (# rijen)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Vouw # ander apparaat uit} other {Vouw # andere apparaten uit}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {In gesprek} other {# in gesprek}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Deelnemen aan videogesprek (# deelnemer)} other {Deelnemen aan videogesprek (# deelnemers)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Blijf # stream bekijken en voeg deze toe} other {Blijf # streams bekijken en voeg deze toe}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Acties"
|
||||
msgid "Active"
|
||||
msgstr "Actief"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Actief account"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Nu afwezig"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Terug naar sticker"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Terug naar spraakkanaal"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Kanaalonderwerp inklappen"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Apparaten samenvouwen"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Verbonden met spraak"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Verbinden..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Verbinding verwijderd"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Verbindingsstatistieken"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Gekopieerd"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statistieken-JSON naar klembord gekopieerd"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL gekopieerd naar klembord"
|
||||
msgid "Copy"
|
||||
msgstr "Kopiëren"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Kopiëren als JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Banner-URL kopiëren"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Buildinformatie kopiëren"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Kopieer de installatiecode"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Stacktrace kopiëren"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Statistieken-JSON kopiëren"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Kopieer de installatiecode naar je authenticatie-app."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Gebruikers-ID kopiëren"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Video kopiëren"
|
||||
msgid "Copy video link"
|
||||
msgstr "Videolink kopiëren"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Spraakdiagnose kopiëren"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Kan dit audiobestand niet decoderen."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Kon de instantieconfiguratie niet laden. Probeer de pagina opnieuw te laden."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Socket verbreken"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Verbinding verbroken"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Emoji en stickers bewerken of verwijderen die door andere leden zijn gem
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Overschrijvingen voor rollen en leden in dit kanaal bewerken."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Code invoeren"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Volledig scherm"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Hele scherm"
|
||||
msgid "Entire system"
|
||||
msgstr "Hele systeem"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Volledige systeemaudio"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Verlaten"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Volledig scherm afsluiten"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Maak eerst je account aan"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Setup voltooien"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "In de modus \"Besturingssysteem\" zijn de hierboven vermelde woordenboek
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "In een browser werkt push-to-talk alleen als het tabblad van {PRODUCT_NAME} actief is. Installeer de desktop-app voor push-to-talk voor het hele systeem."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "In gesprek"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Bestemmingen laden…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Instanceconfiguratie laden"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Malware, diefstal van inloggegevens of schadelijke bestanden."
|
||||
msgid "Manage"
|
||||
msgstr "Beheren"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Accounts beheren"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Nieuwste eerst"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Niet-geanimeerde emoji ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Geen"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Opnieuw verbinden gelukt. Kies opnieuw een scherm als je je vorige stream wilt hervatten."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Opnieuw verbinden..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referentie gekopieerd."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Verwijzingsparameters"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Audiobronnen vernieuwen"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Zelfbeschadiging of zelfmoord"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Zelf hosten instellen"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sessies"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "{fieldNode} ingesteld op {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Aangepaste status instellen"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Zet deze controle opzij?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Stel {productName} in"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Zweeds"
|
||||
msgid "Switch account"
|
||||
msgstr "Ander account"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Van account wisselen"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Dat vriendschapsverzoek is niet meer beschikbaar. Vernieuw de pagina en probeer het opnieuw."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Die afbeelding kon niet worden gebruikt. Probeer een ander bestand."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Dat waren ze allemaal."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "De tag #0000 is gereserveerd voor Visionary-abonnees. Visionary is niet langer beschikbaar voor aankoop."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "De API bevindt zich op een ander domein dan deze pagina, dus setup-verzoeken worden zonder je sessie verzonden. Controleer het openbare domein en de poort waarmee dit exemplaar is geconfigureerd, en laad vervolgens opnieuw."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "De app is gecrasht"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "onbekende gebruiker"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Onbekende gebruiker"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Oproep bekijken"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Oproepbediening bekijken"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Verzonden berichten kunnen niet meer worden verwijderd nadat je account
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Je moet de e-mailstap nog steeds afronden."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Je ontvangt geen meldingen op je desktop"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Je verschijnt als offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# bokmerke} other {# bokmerker}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# fellesskap funnet} other {# fellesskap funnet}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# fellesskap er midlertidig utilgjengelig på grunn av en feil i flukskondensatoren.} other {# fellesskap er midlertidig utilgjengelige på grunn av en feil i flukskondensatoren.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# felles fellesskap} other {# felles fellesskap}}"
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# annen} other {# andre}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# deltaker i samtalen} other {# deltakere i samtalen}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Vis (# linje)} other {Vis (# linjer)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Vis flere (# rad)} other {Vis flere (# rader)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Vis # annen enhet} other {Vis # andre enheter}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {I samtale} other {# i samtale}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Bli med i videosamtale (# deltaker)} other {Bli med i videosamtale (# deltakere)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Fortsett å se # strøm og legg til denne} other {Fortsett å se # strømmer og legg til denne}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Handlinger"
|
||||
msgid "Active"
|
||||
msgstr "Aktiv"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktiv konto"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Borte akkurat nå"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Tilbake til klistremerke"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Tilbake til talekanal"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Skjul kanalemne"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Skjul enheter"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Koblet til tale"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Kobler til..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Tilkobling fjernet"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Tilkoblingsstatistikk"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Kopiert"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statistikk-JSON kopiert til utklippstavlen"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL kopiert til utklippstavlen"
|
||||
msgid "Copy"
|
||||
msgstr "Kopier"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Kopier som JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Kopier banner-URL"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Kopier byggeinformasjon"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Kopier oppsett-nøkkelen"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Kopier stakksporing"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Kopier statistikk (JSON)"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Kopier oppsett-nøkkelen inn i autentiseringsappen din."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Kopier bruker-ID"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Kopier video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Kopier videolenke"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Kopier talediagnostikk"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Kunne ikke dekode denne lydfilen."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Kunne ikke laste inn instanskonfigurasjonen. Prøv å laste inn siden på nytt."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Koble fra socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Frakoblet"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Rediger eller slett emojier og klistremerker som er laget av andre medle
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Rediger overstyringer for roller og medlemmer i denne kanalen."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Skriv inn kode"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Gå til fullskjerm"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Hele skjermen"
|
||||
msgid "Entire system"
|
||||
msgstr "Hele systemet"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Hele systemlyden"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Avslutt"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Avslutt fullskjerm"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Fullfør kontooppsettet først"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Fullfør oppsett"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "I \"Operativsystem\"-modus er ordbøkene ovenfor veiledende. {PRODUCT_NA
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "I en nettleser fungerer push-to-talk bare når {PRODUCT_NAME}-fanen er fokusert. Installer skrivebordsappen for push-to-talk på hele systemet."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "I en samtale"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Laster destinasjoner …"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Laster inn instanskonfigurasjon"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Skadelig programvare, stjeling av innloggingsinformasjon eller skadelige
|
||||
msgid "Manage"
|
||||
msgstr "Administrer"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Administrer kontoer"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Nyeste først"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Ikke-animert emoji ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Ingen"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Tilkoblingen er gjenopprettet. Velg en skjerm på nytt hvis du vil fortsette den forrige strømmen din."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Kobler til på nytt..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referanse kopiert."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Henvisningsparametere"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Oppdater lydkilder"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Selvskading eller selvmord"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Selv-vert-oppsett"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Økter"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Satte {fieldNode} til {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Angi en egendefinert status"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Legg denne sjekken til side?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Sett opp {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Svensk"
|
||||
msgid "Switch account"
|
||||
msgstr "Bytt konto"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Bytt konto"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Den venneforespørselen er ikke lenger tilgjengelig. Oppdater og prøv igjen."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Det bildet kunne ikke brukes. Prøv en annen fil."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Det var alle."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Taggen #0000 er reservert for Visionary-abonnenter. Visionary er ikke lenger tilgjengelig for kjøp."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API-en er på et annet opprinnelsessted enn denne siden, så oppsettsforespørsler sendes uten økten din. Sjekk det offentlige opprinnelsesstedet og porten denne instansen er konfigurert med, og last deretter inn på nytt."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Appen krasjet"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "ukjent bruker"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Ukjent bruker"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Vis samtale"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Vis samtalekontroller"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Du kan ikke slette sendte meldinger etter at kontoen din er slettet"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Du må fortsatt fullføre e-poststeget."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Du mottar ikke varsler på datamaskinen"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Du vises som frakoblet"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# zakładka} few {# zakładki} many {# zakładek} o
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# społeczność znaleziona} few {# społeczności znalezione} many {# społeczności znalezionych} other {# społeczności znalezionych}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# społeczność jest tymczasowo niedostępna z powodu awarii \"kondensatora strumienia\".} few {# społeczności są tymczasowo niedostępne z powodu awarii \"kondensatora strumienia\".} many {# społeczności jest tymczasowo niedostępnych z powodu awarii \"kondensatora strumienia\".} other {# społeczności są tymczasowo niedostępne z powodu awarii \"kondensatora strumienia\".}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# wspólna społeczność} few {# wspólne społecz
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# inna osoba} few {# inne osoby} many {# innych osób} other {# innych osób}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# uczestnik w rozmowie} few {# uczestników w rozmowie} many {# uczestników w rozmowie} other {# uczestnika w rozmowie}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Rozwiń (1 wiersz)} few {Rozwiń (# wiersze)} many
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Rozwiń (# wiersz)} other {Rozwiń (# wiersze)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Rozwiń # inne urządzenie} other {Rozwiń # inne urządzenia}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {W rozmowie} few {# w rozmowie} many {# w rozmowie}
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Dołącz do rozmowy wideo (# uczestnik)} few {Dołącz do rozmowy wideo (# uczestników)} many {Dołącz do rozmowy wideo (# uczestników)} other {Dołącz do rozmowy wideo (# uczestników)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "Kontynuuj oglądanie {count, plural, one {# transmisji} few {# transmisji} many {# transmisji} other {# transmisji}} i dodaj tę"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Działania"
|
||||
msgid "Active"
|
||||
msgstr "Aktywna"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktywne konto"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Teraz jestem niedostępny(-a)"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Wróć do naklejki"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Wróć do kanału głosowego"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Zwiń temat kanału"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Zwiń urządzenia"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Połączono z czatem głosowym"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Łączenie..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Połączenie usunięte"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Statystyki połączenia"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Skopiowano"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Skopiowano statystyki JSON do schowka"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "Skopiowano URL do schowka"
|
||||
msgid "Copy"
|
||||
msgstr "Kopiuj"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Kopiuj jako JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Kopiuj URL banera"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Kopiuj informacje o kompilacji"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Skopiuj klucz konfiguracji"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Kopiuj ślad stosu"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Kopiuj statystyki JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Skopiuj klucz konfiguracji do aplikacji uwierzytelniającej."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Kopiuj ID użytkownika"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Kopiuj wideo"
|
||||
msgid "Copy video link"
|
||||
msgstr "Kopiuj link do wideo"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Kopiuj diagnostykę głosową"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Nie można zdekodować tego pliku audio."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Nie udało się załadować konfiguracji instancji. Spróbuj ponownie załadować stronę."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Odłącz gniazdo"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Rozłączono"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Edytuj lub usuwaj emoji i naklejki utworzone przez innych członków."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Edytuj nadpisania dla ról i członków na tym kanale."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Wpisz kod"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Przejdź do trybu pełnoekranowego"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Cały ekran"
|
||||
msgid "Entire system"
|
||||
msgstr "Cały system"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Dźwięk z całego systemu"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Wyjdź"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Wyjdź z trybu pełnoekranowego"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Najpierw dokończ konfigurację konta"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Zakończ konfigurację"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "W trybie \"System operacyjny\" słowniki wymienione powyżej mają chara
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "W przeglądarce funkcja \"naciśnij i mów\" działa tylko wtedy, gdy karta {PRODUCT_NAME} jest aktywna. Zainstaluj aplikację komputerową, aby korzystać z funkcji \"naciśnij i mów\" w całym systemie."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Na rozmowie"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Ładowanie miejsc docelowych…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Ładowanie konfiguracji instancji"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Złośliwe oprogramowanie, kradzież danych uwierzytelniających lub szk
|
||||
msgid "Manage"
|
||||
msgstr "Zarządzaj"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Zarządzaj kontami"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Najpierw najnowsze"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Nieruchome emoji ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Brak"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Ponowne połączenie udane. Wybierz ponownie ekran, jeśli chcesz wznowić poprzedni strumień."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Ponowne łączenie..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Skopiowano odniesienie."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Parametry polecenia"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Odśwież źródła dźwięku"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Samookaleczenie lub samobójstwo"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Konfiguracja samodzielnego hostingu"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sesje"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Ustawiono {fieldNode} na {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Ustaw status niestandardowy"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Odłożyć to sprawdzenie?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Skonfiguruj {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Szwedzki"
|
||||
msgid "Switch account"
|
||||
msgstr "Zmień konto"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Przełącz konta"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "To zaproszenie do znajomych jest już niedostępne. Odśwież i spróbuj ponownie."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Ten obraz nie mógł zostać użyty. Spróbuj użyć innego pliku."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "To już wszystkie."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Tag #0000 jest zarezerwowany dla subskrybentów Visionary. Subskrypcja Visionary nie jest już dostępna w sprzedaży."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API znajduje się w innej domenie niż ta strona, więc żądania konfiguracji są wysyłane bez Twojej sesji. Sprawdź publiczną domenę i port, z którymi skonfigurowano tę instancję, a następnie przeładuj."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Aplikacja uległa awarii"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "nieznany użytkownik"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Nieznany użytkownik"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Wyświetl połączenie"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Wyświetl elementy sterujące połączenia"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Nie będzie można usunąć wysłanych wiadomości po usunięciu konta"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Nadal musisz ukończyć krok z e-mailem."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Nie będziesz otrzymywać powiadomień na komputerze"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Będziesz widoczny(-a) jako offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# item salvo} other {# itens salvos}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# comunidade encontrada} other {# comunidades encontradas}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# comunidade está temporariamente indisponível devido a um defeito no capacitor de fluxo.} other {# comunidades estão temporariamente indisponíveis devido a um defeito no capacitor de fluxo.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# comunidade em comum} other {# comunidades em comu
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# outro} other {# outros}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# participante na chamada} other {# participantes na chamada}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Expandir (# linha)} other {Expandir (# linhas)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Expandir (# linha)} other {Expandir (# linhas)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Expandir mais # dispositivo} other {Expandir mais # dispositivos}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {Em chamada} other {# em chamada}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Entrar na chamada de vídeo (# participante)} other {Entrar na chamada de vídeo (# participantes)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Continuar assistindo a # transmissão e adicionar esta} other {Continuar assistindo a # transmissões e adicionar esta}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Ações"
|
||||
msgid "Active"
|
||||
msgstr "Ativa"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Conta ativa"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Ausente no momento"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Voltar para o sticker"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Voltar para o canal de voz"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Recolher tópico do canal"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Recolher dispositivos"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Conectado ao áudio"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Conectando..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Conexão removida"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Estatísticas da conexão"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Copiado"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "JSON de estatísticas copiado para a área de transferência"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL copiada para a área de transferência"
|
||||
msgid "Copy"
|
||||
msgstr "Copiar"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Copiar como JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Copiar URL do banner"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Copiar informações da versão"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Copiar chave de configuração"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Copiar rastreamento de pilha"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Copiar JSON de estatísticas"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Copie a chave de configuração para o seu aplicativo autenticador."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Copiar ID de usuário"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Copiar vídeo"
|
||||
msgid "Copy video link"
|
||||
msgstr "Copiar link do vídeo"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Copiar diagnóstico de voz"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Não foi possível decodificar este arquivo de áudio."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Não foi possível carregar a configuração da instância. Tente recarregar a página."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Desconectar socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Desconectado"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Editar ou apagar figurinhas e emojis criados por outros membros."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Editar permissões de cargos e membros neste canal."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Inserir código"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Entrar em tela cheia"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Tela inteira"
|
||||
msgid "Entire system"
|
||||
msgstr "Sistema inteiro"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Áudio do sistema inteiro"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Sair"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Sair da tela cheia"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Conclua a configuração da conta primeiro"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Concluir configuração"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "No modo \"Sistema operacional\", os dicionários listados acima são ape
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "No navegador, o push-to-talk só funciona enquanto a aba do {PRODUCT_NAME} estiver em foco. Instale o aplicativo para desktop para usar o push-to-talk em todo o sistema."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Em uma chamada"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Carregando destinos…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Carregando configuração da instância"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Malware, roubo de credenciais ou arquivos prejudiciais."
|
||||
msgid "Manage"
|
||||
msgstr "Gerenciar"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Gerenciar contas"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Mais recentes primeiro"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Emojis não animados ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Nenhum"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Reconexão bem-sucedida. Escolha uma tela novamente se quiser retomar sua transmissão anterior."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Reconectando..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referência copiada."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Parâmetros de indicação"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Atualizar fontes de áudio"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Automutilação ou suicídio"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Configuração de auto-hospedagem"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sessões"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Definir {fieldNode} como {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Definir um recado personalizado"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Adiar esta verificação?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Configurar {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Sueco"
|
||||
msgid "Switch account"
|
||||
msgstr "Mudar de conta"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Trocar de conta"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Essa solicitação de amizade não está mais disponível. Atualize e tente novamente."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Essa imagem não pôde ser usada. Tente um arquivo diferente."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "É tudo."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "A tag #0000 é reservada para assinantes Visionary. O Visionary não está mais disponível para compra."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "A API está em uma origem diferente desta página, então as solicitações de configuração são enviadas sem sua sessão. Verifique a origem pública e a porta com as quais esta instância está configurada e recarregue."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "O app travou"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "usuário desconhecido"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Usuário desconhecido"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Ver chamada"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Ver controles da chamada"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Você não poderá apagar as mensagens enviadas depois que sua conta for
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Você ainda precisará concluir a etapa do e-mail."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Você não receberá notificações no computador"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Você aparecerá offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# marcaj} other {# marcaje}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# comunitate găsită} other {# comunități găsite}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# comunitate este temporar indisponibilă din cauza unei defecțiuni a condensatorului de flux.} other {# comunități sunt temporar indisponibile din cauza unei defecțiuni a condensatorului de flux.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# comunitate comună} other {# comunități comune}
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# altul} other {# alții}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# participant în apel} other {# participanți în apel}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Extinde (o linie)} other {Extinde (# linii)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Extindeți (# rândul)} other {Extindeți (# rânduri)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Extinde încă un dispozitiv} other {Extinde încă # dispozitive}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {În apel} other {# în apel}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Alăturați-vă apelului video (un participant)} other {Alăturați-vă apelului video (# participanți)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Continuă să urmărești # stream și adaugă-l pe acesta} other {Continuă să urmărești # streamuri și adaugă-l pe acesta}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Acțiuni"
|
||||
msgid "Active"
|
||||
msgstr "Activ"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Cont activ"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Plecat(ă) acum"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Înapoi la sticker"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Înapoi la canalul vocal"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Restrânge subiectul canalului"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Restrânge dispozitivele"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Conectat la apelul vocal"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Se conectează..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Conexiune eliminată"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Statistici conexiune"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Copiat"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statisticile JSON au fost copiate în clipboard"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL copiat în clipboard"
|
||||
msgid "Copy"
|
||||
msgstr "Copiază"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Copiază ca JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Copiază adresa URL a bannerului"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Copiază informațiile despre versiune"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Copiază cheia de configurare"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Copiază istoricul erorilor"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Copiază statisticile JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Copiază cheia de configurare în aplicația ta de autentificare."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Copiază ID utilizator"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Copiază videoclipul"
|
||||
msgid "Copy video link"
|
||||
msgstr "Copiază linkul videoclipului"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Copiază diagnosticele vocale"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Fișierul audio nu a putut fi decodificat."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Nu am putut încărca configurația instanței. Încearcă să reîncarci pagina."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Deconectare socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Deconectat"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Editează sau șterge emoji și stickere create de alți membri."
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Editează suprascrierile pentru roluri și membri în acest canal."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Introdu codul"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Intră în ecran complet"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Întregul ecran"
|
||||
msgid "Entire system"
|
||||
msgstr "Întregul sistem"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Întregul sunet al sistemului"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Ieșire"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Ieși din ecran complet"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Finalizează mai întâi configurarea contului"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Finalizează configurarea"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "În modul \"Sistem de operare\", dicționarele enumerate mai sus sunt co
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "Într-un browser, funcția push-to-talk funcționează doar când fila {PRODUCT_NAME} este activă. Instalează aplicația desktop pentru push-to-talk la nivel de sistem."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Într-un apel"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Se încarcă destinațiile…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Se încarcă configurația instanței"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Programe malware, furt de date de conectare sau fișiere dăunătoare."
|
||||
msgid "Manage"
|
||||
msgstr "Gestionare"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Gestionează conturile"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Cele mai noi primele"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Emoji non-animate ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Niciunul"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Reconectare reușită. Alege din nou un ecran dacă vrei să reiei transmisiunea anterioară."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Se reconectează..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referință copiată."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Parametri de recomandare"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Reîmprospătați sursele audio"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Auto-vătămare sau sinucidere"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Configurare auto-găzduire"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sesiuni"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "S-a setat {fieldNode} la {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Setează o stare personalizată"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Pui deoparte această verificare?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Configurați {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Suedeză"
|
||||
msgid "Switch account"
|
||||
msgstr "Schimbă contul"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Schimbă conturile"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Această cerere de prietenie nu mai este disponibilă. Reîmprospătează și încearcă din nou."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Imaginea respectivă nu a putut fi utilizată. Încearcă un alt fișier."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Asta-i tot."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Eticheta #0000 este rezervată abonaților Visionary. Abonamentul Visionary nu mai este disponibil pentru achiziție."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API-ul este pe un alt domeniu decât această pagină, așa că cererile de configurare sunt trimise fără sesiunea ta. Verifică domeniul public și portul cu care este configurată această instanță, apoi reîncarcă."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Aplicația s-a închis neașteptat"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "utilizator necunoscut"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Utilizator necunoscut"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Vezi apelul"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Vezi comenzile apelului"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Nu vei putea șterge mesajele trimise după ce îți ștergi contul"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Va trebui în continuare să finalizezi pasul cu emailul."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Nu vei primi notificări pe desktop"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Vei apărea offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# закладка} few {# закладки} many {
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# сообщество найдено} few {# сообщества найдено} many {# сообществ найдено} other {# сообществ найдено}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# сообщество временно недоступно из-за неисправности потокового накопителя.} few {# сообщества временно недоступны из-за неисправности потокового накопителя.} many {# сообществ временно недоступны из-за неисправности потокового накопителя.} other {# сообществ временно недоступны из-за неисправности потокового накопителя.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# общее сообщество} few {# общи
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# другой} other {# других}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# участник звонка} few {# участника звонка} many {# участников звонка} other {# участника звонка}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Развернуть (# строка)} few {Раз
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Развернуть (# строку)} other {Развернуть (# строки)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Развернуть ещё # устройство} other {Развернуть ещё # устройства}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {В звонке} few {# в звонке} many {# в
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Присоединиться к видеозвонку (1 участник)} few {Присоединиться к видеозвонку ({count} участника)} many {Присоединиться к видеозвонку ({count} участников)} other {Присоединиться к видеозвонку ({count} участников)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Продолжить смотреть # трансляцию и добавить эту} few {Продолжить смотреть # трансляции и добавить эту} many {Продолжить смотреть # трансляций и добавить эту} other {Продолжить смотреть # трансляций и добавить эту}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Действия"
|
||||
msgid "Active"
|
||||
msgstr "Активна"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Активный аккаунт"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Сейчас нет на месте"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Назад к стикеру"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Вернуться в голосовой канал"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Свернуть тему канала"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Свернуть устройства"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Подключено к голосовому чату"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Подключение..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Соединение удалено"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Статистика соединения"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Скопировано"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Статистика JSON скопирована в буфер обмена"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "Ссылка скопирована"
|
||||
msgid "Copy"
|
||||
msgstr "Копировать"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Копировать как JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Скопировать ссылку баннера"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Скопировать информацию о сборке"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Скопировать ключ настройки"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Скопировать стек вызовов"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Копировать статистику (JSON)"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Скопируйте ключ настройки в приложение-аутентификатор."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Скопировать ID пользователя"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Скопировать видео"
|
||||
msgid "Copy video link"
|
||||
msgstr "Скопировать ссылку на видео"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Скопировать диагностику голоса"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Не удалось декодировать этот аудиофайл."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Не удалось загрузить конфигурацию экземпляра. Попробуйте перезагрузить страницу."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Отключить сокет"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Отключено"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Редактировать или удалять эмодзи и сти
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Изменить разрешения для ролей и участников в этом канале."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Ввести код"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "На весь экран"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Весь экран"
|
||||
msgid "Entire system"
|
||||
msgstr "Вся система"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Весь звук системы"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Выйти"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Выйти из полноэкранного режима"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Сначала завершите настройку аккаунта"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Завершить настройку"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "В режиме \"Операционная система\" перечи
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "В браузере функция \"Нажми и говори\" работает только тогда, когда вкладка {PRODUCT_NAME} активна. Установите десктопное приложение для использования функции \"Нажми и говори\" во всей системе."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "В звонке"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Загрузка получателей…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Загрузка конфигурации экземпляра"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Вредоносное ПО, кража учетных данных ил
|
||||
msgid "Manage"
|
||||
msgstr "Управление"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Управление аккаунтами"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Сначала новые"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Неанимированные эмодзи ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Нет"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Подключение восстановлено. Выберите экран ещё раз, если хотите возобновить предыдущую трансляцию."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Повторное подключение..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Ссылка скопирована."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Параметры приглашения"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Обновить источники звука"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Причинение вреда себе или суицид"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Настройка собственного сервера"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Сеансы"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Установить {fieldNode} на {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Задать свой статус"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Отложить эту проверку?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Настройте {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Шведский"
|
||||
msgid "Switch account"
|
||||
msgstr "Сменить аккаунт"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Сменить аккаунт"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Запрос на добавление в друзья больше недоступен. Обновите страницу и попробуйте снова."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Это изображение не удалось использовать. Попробуйте другой файл."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Это все."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Тег #0000 зарезервирован для подписчиков Visionary. Подписка Visionary больше недоступна для покупки."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API находится на другом домене, отличном от этого, поэтому запросы на настройку отправляются без вашей сессии. Проверьте общедоступный домен и порт, с которыми настроен этот экземпляр, затем перезагрузите страницу."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Приложение вылетело"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "неизвестный пользователь"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Неизвестный пользователь"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Посмотреть звонок"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Показать элементы управления вызовом"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Вы не сможете удалить отправленные соо
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Вам всё ещё нужно будет завершить шаг с электронной почтой."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Вы не будете получать уведомления на компьютере"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Вы будете отображаться офлайн"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# bokmärke} other {# bokmärken}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# community hittades} other {# communities hittades}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# community är tillfälligt otillgänglig på grund av ett fel i flödeskondensatorn.} other {# communities är tillfälligt otillgängliga på grund av ett fel i flödeskondensatorn.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# gemensam community} other {# gemensamma communiti
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# annan} other {# andra}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# deltagare i samtalet} other {# deltagare i samtalet}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Visa fler (# rad)} other {Visa fler (# rader)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Visa (# rad)} other {Visa (# rader)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Visa # annan enhet} other {Visa # andra enheter}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {I samtal} other {# i samtal}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Gå med i videosamtal (# deltagare)} other {Gå med i videosamtal (# deltagare)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "Fortsätt titta på {count, plural, one {# stream} other {# streams}} och lägg till den här"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Åtgärder"
|
||||
msgid "Active"
|
||||
msgstr "Aktiv"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktivt konto"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Borta just nu"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Tillbaka till klistermärket"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Tillbaka till röstkanalen"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Fäll ihop kanalämne"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Fäll ihop enheter"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Ansluten till röstsamtal"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Ansluter..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Anslutning borttagen"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Anslutningsstatistik"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Kopierat"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Statistik-JSON kopierad till urklipp"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL kopierad till urklipp"
|
||||
msgid "Copy"
|
||||
msgstr "Kopiera"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Kopiera som JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Kopiera banner-URL"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Kopiera bygginfo"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Kopiera installationsnyckeln"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Kopiera stackspårning"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Kopiera statistik-JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Kopiera installationsnyckeln till din autentiseringsapp."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Kopiera användar-ID"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Kopiera video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Kopiera videolänk"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Kopiera röstdiagnostik"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Kunde inte avkoda den här ljudfilen."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Kunde inte ladda instanskonfigurationen. Försök att ladda om sidan."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Koppla från socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Nedkopplad"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Redigera eller ta bort emoji och stickers som skapats av andra medlemmar
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Redigera åsidosättningar för roller och medlemmar i den här kanalen."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Ange kod"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Gå till helskärmsläge"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Hela skärmen"
|
||||
msgid "Entire system"
|
||||
msgstr "Hela systemet"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Hela systemljudet"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Avsluta"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Avsluta helskärm"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Slutför kontoinställningen först"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Slutför installationen"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "I läget \"Operativsystem\" är ordlistorna ovan vägledande. {PRODUCT_N
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "I en webbläsare fungerar push-to-talk bara när fliken {PRODUCT_NAME} är i fokus. Installera datorappen för push-to-talk i hela systemet."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "I ett samtal"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Laddar destinationer…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Laddar inställningskonfiguration"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Skadlig programvara, stöld av inloggningsuppgifter eller skadliga filer
|
||||
msgid "Manage"
|
||||
msgstr "Hantera"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Hantera konton"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Nyast först"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Icke-animerade emojier ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Ingen"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Återanslutningen lyckades. Välj en skärm igen om du vill återuppta din tidigare stream."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Återansluter..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referens kopierad."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Värvningsparametrar"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Uppdatera ljudkällor"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Självskadebeteende eller självmord"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Självhostningsinstallation"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Sessioner"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Ange {fieldNode} till {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Ange en anpassad status"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Lägg den här kontrollen åt sidan?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Konfigurera {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Svenska"
|
||||
msgid "Switch account"
|
||||
msgstr "Byt konto"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Byt konto"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Den vänförfrågan är inte längre tillgänglig. Uppdatera och försök igen."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Bilden kunde inte användas. Prova en annan fil."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Det var alla."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Taggen #0000 är reserverad för Visionary-prenumeranter. Visionary kan inte längre köpas."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API:et har en annan ursprung än den här sidan, så installationsbegäranden skickas utan din session. Kontrollera det publika ursprunget och porten som den här instansen är konfigurerad med, och ladda sedan om."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Appen kraschade"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "okänd användare"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Okänd användare"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Visa samtal"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Visa samtalskontroller"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Du kommer inte att kunna radera dina skickade meddelanden efter att ditt
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Du behöver fortfarande slutföra e-poststeget."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Du får inga aviseringar på datorn"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Du visas som offline"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, other {# รายการ}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# ชุมชนที่พบ} other {# ชุมชนที่พบ}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# ชุมชนไม่พร้อมใช้งานชั่วคราว เนื่องจากเครื่องฟลักซ์คาปาซิเตอร์ทำงานผิดปกติ} other {# ชุมชนไม่พร้อมใช้งานชั่วคราว เนื่องจากเครื่องฟลักซ์คาปาซิเตอร์ทำงานผิดปกติ}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# ชุมชนร่วมกัน} other {#
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# คนอื่น} other {# คนอื่น}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# คนในสาย} other {# คนในสาย}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {ขยาย (# บรรทัด)} other {ขย
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {ขยาย (# แถว)} other {ขยาย (# แถว)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {ขยายอุปกรณ์อื่น # เครื่อง} other {ขยายอุปกรณ์อื่น # เครื่อง}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {กำลังคุยสาย} other {# คน
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {เข้าร่วมวิดีโอคอล (# ผู้เข้าร่วม)} other {เข้าร่วมวิดีโอคอล (# ผู้เข้าร่วม)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "ดูสตรีม # {count, plural, one {} other {อื่นๆ }}ต่อไปและเพิ่มสตรีมนี้"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "การดำเนินการ"
|
||||
msgid "Active"
|
||||
msgstr "ใช้งานอยู่"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "บัญชีที่ใช้งานอยู่"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "ไม่อยู่ตอนนี้"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "กลับไปที่สติกเกอร์"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "กลับสู่ช่องเสียง"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "ยุบหัวข้อช่อง"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "ยุบอุปกรณ์"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "เชื่อมต่อกับเสียงแล้ว"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "กำลังเชื่อมต่อ..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "ลบการเชื่อมต่อแล้ว"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "สถานะการเชื่อมต่อ"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "คัดลอกแล้ว"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "คัดลอก JSON สถิติไปยังคลิปบอร์ดแล้ว"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "คัดลอก URL ไปยังคลิปบอร์ดแล
|
||||
msgid "Copy"
|
||||
msgstr "คัดลอก"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "คัดลอกเป็น JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "คัดลอก URL แบนเนอร์"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "คัดลอกข้อมูลบิลด์"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "คัดลอกคีย์สำหรับการตั้งค
|
||||
msgid "Copy stack trace"
|
||||
msgstr "คัดลอก Stack Trace"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "คัดลอก JSON สถิติ"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "คัดลอกคีย์สำหรับการตั้งค่าลงในแอปยืนยันตัวตนของคุณ"
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "คัดลอก ID ผู้ใช้"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "คัดลอกวิดีโอ"
|
||||
msgid "Copy video link"
|
||||
msgstr "คัดลอกลิงก์วิดีโอ"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "คัดลอกข้อมูลการวินิจฉัยเสียง"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "ไม่สามารถถอดรหัสไฟล์เสียงนี้ได้"
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "ไม่สามารถโหลดการกำหนดค่าอินสแตนซ์ได้ ลองโหลดหน้าใหม่"
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "ยกเลิกการเชื่อมต่อซ็อกเก
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "ตัดการเชื่อมต่อแล้ว"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "แก้ไขหรือลบอิโมจิและสติก
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "แก้ไขการตั้งค่าสำหรับบทบาทและสมาชิกในช่องนี้"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "ป้อนรหัส"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "เข้าสู่โหมดเต็มหน้าจอ"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "ทั้งหน้าจอ"
|
||||
msgid "Entire system"
|
||||
msgstr "ทั้งระบบ"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "เสียงทั้งระบบ"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "ออก"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "ออกจากโหมดเต็มหน้าจอ"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "ตั้งค่าบัญชีให้เสร็จก่อน
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "เสร็จสิ้นการตั้งค่า"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "ในโหมด \"ระบบปฏิบัติการ\" พจ
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "ในเบราว์เซอร์ การกดเพื่อพูดจะทำงานเมื่อแท็บ {PRODUCT_NAME} โฟกัสอยู่เท่านั้น ติดตั้งแอปเดสก์ท็อปเพื่อใช้การกดเพื่อพูดได้ทั่วทั้งระบบ"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "กำลังสนทนา"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "กำลังโหลดปลายทาง…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "กำลังโหลดการกำหนดค่าอินสแตนซ์"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "มัลแวร์, การขโมยข้อมูลประ
|
||||
msgid "Manage"
|
||||
msgstr "จัดการ"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "จัดการบัญชี"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "ใหม่สุดขึ้นก่อน"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "อิโมจิแบบไม่เคลื่อนไหว ({emo
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "ไม่มี"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "เชื่อมต่อสำเร็จ หากต้องการสตรีมต่อ ให้เลือกหน้าจออีกครั้ง"
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "กำลังเชื่อมต่อใหม่..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "คัดลอกข้อมูลอ้างอิงแล้ว"
|
||||
msgid "Referral parameters"
|
||||
msgstr "พารามิเตอร์การแนะนำ"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "รีเฟรชแหล่งเสียง"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "ทำร้ายตัวเองหรือฆ่าตัวตาย"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "ตั้งค่าโฮสต์เอง"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "เซสชัน"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "ตั้งค่า {fieldNode} เป็น {0}"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "ตั้งสถานะกำหนดเอง"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "พักการตรวจสอบนี้ไว้ก่อนไหม?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "ตั้งค่า {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "สวีเดน"
|
||||
msgid "Switch account"
|
||||
msgstr "สลับบัญชี"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "สลับบัญชี"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "คำขอเป็นเพื่อนนั้นไม่พร้อมใช้งานแล้ว โปรดรีเฟรชแล้วลองอีกครั้ง"
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "รูปภาพนั้นไม่สามารถใช้งานได้ ลองใช้ไฟล์อื่น"
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "ทั้งหมดมีเท่านี้"
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "แท็ก #0000 สงวนไว้สำหรับสมาชิก Visionary ซึ่ง Visionary ไม่มีให้ซื้อแล้ว"
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API อยู่คนละ origin กับหน้านี้ ทำให้คำขอตั้งค่าถูกส่งไปโดยไม่มีเซสชันของคุณ โปรดตรวจสอบ public origin และพอร์ตที่อินสแตนซ์นี้กำหนดค่าไว้ แล้วลองโหลดใหม่อีกครั้ง"
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "แอปขัดข้อง"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "ผู้ใช้ไม่ทราบชื่อ"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "ผู้ใช้ไม่รู้จัก"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "ดูการโทร"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "ดูการควบคุมการโทร"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "คุณจะไม่สามารถลบข้อความท
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "คุณยังต้องดำเนินการยืนยันอีเมลให้เสร็จสิ้น"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "คุณจะไม่ได้รับการแจ้งเตือนบนเดสก์ท็อป"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "คุณจะออฟไลน์"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# yer işareti} other {# yer işaretleri}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# topluluk bulundu} other {# topluluk bulundu}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# topluluk, bir \"flux kapasitörü\" arızası nedeniyle geçici olarak kullanılamıyor.} other {# topluluk, bir \"flux kapasitörü\" arızası nedeniyle geçici olarak kullanılamıyor.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# ortak topluluk} other {# ortak topluluk}}"
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# diğer} other {# diğerleri}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# katılımcı aramada} other {# katılımcı aramada}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Genişlet (# satır)} other {Genişlet (# satır)}}
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {(# satırı göster)} other {(# satırları göster)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Diğer cihazı genişlet} other {Diğer {count} cihazı genişlet}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {Aramada} other {# aramada}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Görüntülü aramaya katıl (1 katılımcı)} other {Görüntülü aramaya katıl (# katılımcı)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {# akışı izlemeye devam et ve bunu ekle} other {# akışı izlemeye devam et ve bunu ekle}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "İşlemler"
|
||||
msgid "Active"
|
||||
msgstr "Aktif"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Aktif hesap"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Şu an çevrimdışı"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Çıkartmaya geri dön"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Sesli kanala dön"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Kanal konusunu daralt"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Cihazları daralt"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Sese bağlandı"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Bağlanıyor..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Bağlantı kaldırıldı"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Bağlantı istatistikleri"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Kopyalandı"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "İstatistik JSON'ı panoya kopyalandı"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL panoya kopyalandı"
|
||||
msgid "Copy"
|
||||
msgstr "Kopyala"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "JSON olarak kopyala"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Banner URL'sini kopyala"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Derleme bilgilerini kopyala"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Kurulum anahtarını kopyala"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Yığın izini kopyala"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "İstatistik JSON'ını kopyala"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Kurulum anahtarını kimlik doğrulama uygulamanıza yapıştırın."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Kullanıcı kimliğini kopyala"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Videoyu kopyala"
|
||||
msgid "Copy video link"
|
||||
msgstr "Video bağlantısını kopyala"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Ses tanılama bilgilerini kopyala"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Bu ses dosyası çözülemedi."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Örnek yapılandırması yüklenemedi. Sayfayı yeniyi deneyin."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Soket bağlantısını kes"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Bağlantı kesildi"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Diğer üyeler tarafından oluşturulan emojileri ve çıkartmaları dü
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Bu kanaldaki roller ve üyeler için geçersiz kılmaları düzenle."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Kod girin"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Tam ekrana geç"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Tüm ekran"
|
||||
msgid "Entire system"
|
||||
msgstr "Tüm sistem"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Tüm sistem sesi"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Çık"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Tam ekrandan çık"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Önce hesap kurulumunu tamamla"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Kurulumu tamamla"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "\"İşletim sistemi\" modunda, yukarıda listelenen sözlükler tavsiye
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "Tarayıcıda bas-konuş özelliği yalnızca {PRODUCT_NAME} sekmesi odaklıyken çalışır. Sistem genelinde bas-konuş özelliğini kullanmak için masaüstü uygulamasını yükleyin."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Aramada"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Hedefler yükleniyor…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Örnek yapılandırması yükleniyor"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Kötü amaçlı yazılım, kimlik bilgisi hırsızlığı veya zararlı
|
||||
msgid "Manage"
|
||||
msgstr "Yönet"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Hesapları yönet"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "En yeni önce"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Animasyonsuz emojiler ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Yok"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Yeniden bağlanma başarılı. Önceki akışınıza devam etmek isterseniz lütfen tekrar bir ekran seçin."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Yeniden bağlanıyor..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Referans kopyalandı."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Yönlendirme parametreleri"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Ses kaynaklarını yenile"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Kendine zarar verme veya intihar"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Kendi kendine barındırma kurulumu"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Oturumlar"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "{fieldNode} şununla ayarlandı: {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Özel durum ayarla"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Bu denetimi erteleyelim mi?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "{productName} kurulumu"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "İsveççe"
|
||||
msgid "Switch account"
|
||||
msgstr "Hesap değiştir"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Hesap değiştir"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Bu arkadaşlık isteği artık mevcut değil. Sayfayı yenileyip tekrar dene."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Bu resim kullanılamadı. Farklı bir dosya deneyin."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Hepsi bu kadar."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "#0000 etiketi Visionary abonelerine özeldir. Visionary artık satın alınamaz."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API, bu sayfadan farklı bir kaynaktan, bu nedenle kurulum istekleri oturumunuz olmadan gönderiliyor. Yapılandırılmış genel kaynağı ve bağlantı noktasını kontrol edin, ardından yeniden yükleyin."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Uygulama çöktü"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "Bilinmeyen kullanıcı"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Bilinmeyen kullanıcı"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Aramayı görüntüle"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Arama kontrollerini görüntüle"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Hesabınız silindikten sonra gönderdiğiniz mesajları silemezsiniz"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "E-posta adımını da tamamlaman gerekecek."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Masaüstünde bildirim almazsın"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Çevrimdışı görünürsün"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# закладка} few {# закладки} many {
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# спільнота знайдена} few {# спільноти знайдені} many {# спільнот знайдено} other {# спільнот знайдено}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# спільнота тимчасово недоступна через несправність потокового накопичувача.} few {# спільноти тимчасово недоступні через несправність потокового накопичувача.} many {# спільнот тимчасово недоступні через несправність потокового накопичувача.} other {# спільнот тимчасово недоступні через несправність потокового накопичувача.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# спільна спільнота} few {# спі
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# інший} few {# інших} many {# інших} other {# інших}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# учасник у дзвінку} few {# учасники у дзвінку} many {# учасників у дзвінку} other {# учасника у дзвінку}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Розгорнути (# рядок)} few {Розг
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Розгорнути (# рядок)} other {Розгорнути (# рядки)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Розгорнути ще # пристрій} few {Розгорнути ще # пристрої} many {Розгорнути ще # пристроїв} other {Розгорнути ще # пристроїв}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {У дзвінку} other {# у дзвінку}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Приєднатися до відеодзвінка (# учасник)} few {Приєднатися до відеодзвінка (# учасники)} many {Приєднатися до відеодзвінка (# учасників)} other {Приєднатися до відеодзвінка (# учасників)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Продовжуйте дивитися # трансляцію та додайте цю} other {Продовжуйте дивитися # трансляції та додайте цю}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Дії"
|
||||
msgid "Active"
|
||||
msgstr "Активна"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Активний обліковий запис"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Зараз відсутній"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Назад до стікера"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Повернутися до голосового каналу"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Згорнути тему каналу"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Згорнути пристрої"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Підключено до голосового чату"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Підключення..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Звʼязок видалено"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Статистика з'єднання"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Скопійовано"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Статистику JSON скопійовано в буфер обміну"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "URL скопійовано в буфер обміну"
|
||||
msgid "Copy"
|
||||
msgstr "Копіювати"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Копіювати як JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Копіювати посилання на банер"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Копіювати інформацію про збірку"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Скопіювати ключ налаштування"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Копіювати трасування стека"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Копіювати статистику JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Скопіюйте ключ налаштування у ваш додаток для автентифікації."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Копіювати ID користувача"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Копіювати відео"
|
||||
msgid "Copy video link"
|
||||
msgstr "Копіювати посилання на відео"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Копіювати діагностику голосу"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Не вдалося декодувати цей аудіофайл."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Не вдалося завантажити конфігурацію інстансу. Спробуйте перезавантажити сторінку."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Відключити сокет"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Відключено"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Редагувати або видаляти емодзі та стік
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Редагувати дозволи для ролей і учасників у цьому каналі."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Введіть код"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "На весь екран"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Увесь екран"
|
||||
msgid "Entire system"
|
||||
msgstr "Уся система"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Весь системний звук"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Вийти"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Вийти з повноекранного режиму"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Спершу завершіть налаштування обліков
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Завершити налаштування"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "У режимі \"Операційна система\" наведені
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "У браузері функція \"Натисни і говори\" працює лише тоді, коли вкладка {PRODUCT_NAME} активна. Установіть десктопний застосунок для використання функції \"Натисни і говори\" в усій системі."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "На дзвінку"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Завантаження місць призначення…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Завантаження конфігурації інстансу"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Шкідливе програмне забезпечення, краді
|
||||
msgid "Manage"
|
||||
msgstr "Керувати"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Керувати обліковими записами"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Спершу новіші"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Неанімовані емодзі ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Немає"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Повторне підключення успішне. Виберіть екран ще раз, якщо хочете відновити попередню трансляцію."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Повторне підключення..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Посилання скопійовано."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Параметри запрошення"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Оновити джерела звуку"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Заподіяння собі шкоди або самогубство"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Налаштування самостійного розміщення"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Сесії"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Встановлено {fieldNode} на {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Встановити власний статус"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Відкласти цю перевірку?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Налаштуйте {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Шведська"
|
||||
msgid "Switch account"
|
||||
msgstr "Змінити обліковий запис"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Змінити обліковий запис"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Цей запит на додавання в друзі більше недоступний. Оновіть сторінку та спробуйте ще раз."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Цей файл не вдалося використати. Спробуйте інший."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Це всі повідомлення."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Тег #0000 зарезервовано для підписників Visionary. Підписка Visionary більше недоступна для придбання."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API знаходиться на іншому домені, ніж ця сторінка, тому запити на налаштування надсилаються без вашої сесії. Перевірте загальнодоступний домен і порт, з якими налаштовано цей екземпляр, а потім перезавантажте."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Сталася помилка в застосунку"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "невідомий користувач"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Невідомий користувач"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Переглянути дзвінок"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Переглянути елементи керування викликом"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Ви не зможете видалити надіслані повід
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Вам все ще потрібно буде завершити крок з електронною поштою."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Ви не отримуватимете сповіщення на комп'ютері"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Ви будете офлайн"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# dấu trang} other {# dấu trang}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# cộng đồng được tìm thấy} other {# cộng đồng được tìm thấy}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# cộng đồng hiện không khả dụng do lỗi bộ biến đổi dòng chảy.} other {# cộng đồng hiện không khả dụng do lỗi bộ biến đổi dòng chảy.}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# cộng đồng chung} other {# cộng đồng chu
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# người khác} other {# người khác}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# người tham gia cuộc gọi} other {# người tham gia cuộc gọi}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {Mở rộng (# dòng)} other {Mở rộng (# dòng)
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {Mở rộng (# hàng)} other {Mở rộng (# hàng)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {Mở rộng # thiết bị khác} other {Mở rộng # thiết bị khác}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {Đang gọi} other {# người đang gọi}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {Tham gia cuộc gọi video (# người tham gia)} other {Tham gia cuộc gọi video (# người tham gia)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {Tiếp tục xem # luồng và thêm luồng này} other {Tiếp tục xem # luồng và thêm luồng này}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "Thao tác"
|
||||
msgid "Active"
|
||||
msgstr "Đang hoạt động"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "Tài khoản đang hoạt động"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "Đang vắng mặt"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "Quay lại nhãn dán"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "Quay lại kênh thoại"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "Thu gọn chủ đề kênh"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "Thu gọn thiết bị"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "Đã kết nối thoại"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "Đang kết nối..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "Đã xóa kết nối"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "Thông số kết nối"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "Đã sao chép"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "Đã sao chép JSON thống kê vào bảng nhớ tạm"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "Đã sao chép URL vào bảng nhớ tạm"
|
||||
msgid "Copy"
|
||||
msgstr "Sao chép"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "Sao chép dưới dạng JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "Sao chép URL ảnh bìa"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "Sao chép thông tin bản dựng"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "Sao chép khóa thiết lập"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "Sao chép dấu vết ngăn xếp"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "Sao chép JSON thống kê"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "Sao chép khóa thiết lập vào ứng dụng xác thực của bạn."
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "Sao chép ID người dùng"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "Sao chép video"
|
||||
msgid "Copy video link"
|
||||
msgstr "Sao chép liên kết video"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "Sao chép chẩn đoán giọng nói"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "Không thể giải mã tệp âm thanh này."
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "Không thể tải cấu hình phiên bản. Hãy thử tải lại trang."
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "Ngắt kết nối socket"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "Đã ngắt kết nối"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "Chỉnh sửa hoặc xóa biểu tượng cảm xúc và nhãn dán do t
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "Chỉnh sửa quyền của vai trò và thành viên trong kênh này."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "Nhập mã"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "Vào chế độ toàn màn hình"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "Toàn bộ màn hình"
|
||||
msgid "Entire system"
|
||||
msgstr "Toàn bộ hệ thống"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "Toàn bộ âm thanh hệ thống"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "Thoát"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "Thoát chế độ toàn màn hình"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "Hoàn tất thiết lập tài khoản trước"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "Hoàn tất thiết lập"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "Ở chế độ \"Hệ điều hành\", các từ điển được liệ
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "Trong trình duyệt, tính năng nhấn để nói chỉ hoạt động khi tab {PRODUCT_NAME} đang được lấy nét. Hãy cài đặt ứng dụng dành cho máy tính để bàn để sử dụng tính năng nhấn để nói trên toàn hệ thống."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "Trong cuộc gọi"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "Đang tải điểm đến…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "Đang tải cấu hình phiên bản"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "Phần mềm độc hại, đánh cắp thông tin đăng nhập hoặc
|
||||
msgid "Manage"
|
||||
msgstr "Quản lý"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "Quản lý tài khoản"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "Mới nhất trước"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "Biểu tượng cảm xúc tĩnh ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "Không"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "Đã kết nối lại thành công. Chọn lại màn hình nếu bạn muốn tiếp tục luồng trước đó."
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "Đang kết nối lại..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "Đã sao chép liên kết."
|
||||
msgid "Referral parameters"
|
||||
msgstr "Thông số giới thiệu"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "Làm mới nguồn âm thanh"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "Tự làm hại bản thân hoặc tự tử"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "Thiết lập tự lưu trữ"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "Phiên hoạt động"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "Đặt {fieldNode} thành {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "Đặt trạng thái tùy chỉnh"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "Tạm hoãn kiểm tra này?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "Thiết lập {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "Tiếng Thụy Điển"
|
||||
msgid "Switch account"
|
||||
msgstr "Chuyển tài khoản"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "Chuyển tài khoản"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "Lời mời kết bạn đó không còn khả dụng. Hãy làm mới và thử lại."
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "Ảnh đó không thể sử dụng được. Hãy thử một tệp khác."
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "Đã hết tin nhắn lưu."
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "Thẻ #0000 được dành riêng cho người đăng ký Visionary. Visionary hiện không còn khả dụng để mua."
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API đang ở một nguồn khác với trang này, nên các yêu cầu thiết lập được gửi đi mà không có phiên của bạn. Hãy kiểm tra nguồn gốc và cổng công khai mà phiên bản này được cấu hình, sau đó tải lại."
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "Ứng dụng đã gặp sự cố"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "người dùng không xác định"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "Người dùng không xác định"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "Xem cuộc gọi"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "Xem điều khiển cuộc gọi"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "Bạn sẽ không thể xóa các tin nhắn đã gửi sau khi tài kho
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "Bạn vẫn cần hoàn thành bước email."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "Bạn sẽ không nhận được thông báo trên máy tính"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "Bạn sẽ hiện ở trạng thái ngoại tuyến"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# 条书签} other {# 条书签}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# 个社群} other {# 个社群}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# 个社群因时空穿梭器故障暂时不可用。} other {# 个社群因时空穿梭器故障暂时不可用。}}"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {#个共同社区} other {#个共同社区}}"
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# 位其他用户} other {# 位其他用户}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# 位参与者正在通话中} other {# 位参与者正在通话中}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {展开(# 行)} other {展开(# 行)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {展开(# 行)} other {展开(# 行)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {展开其他设备} other {展开其他设备}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {通话中} other {# 人正在通话}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {加入视频通话(#位参与者)} other {加入视频通话(#位参与者)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {继续观看 # 个直播并添加此直播} other {继续观看 # 个直播并添加此直播}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "操作"
|
||||
msgid "Active"
|
||||
msgstr "有效"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "当前账号"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "当前离开"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "返回贴纸"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "回到语音频道"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "收起频道话题"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "收起设备"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "已连接语音"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "正在连接..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "已移除连接"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "连接状态"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "已复制"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "已将统计数据 JSON 复制到剪贴板"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "已将网址复制到剪贴板"
|
||||
msgid "Copy"
|
||||
msgstr "复制"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "复制为 JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "复制横幅网址"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "复制版本信息"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "复制设置密钥"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "复制堆栈跟踪"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "复制统计数据 JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "将设置密钥复制到您的身份验证器应用程序中。"
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "复制用户ID"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "复制视频"
|
||||
msgid "Copy video link"
|
||||
msgstr "复制视频链接"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "复制语音诊断"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "无法解码此音频文件。"
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "无法加载实例配置。请尝试重新加载页面。"
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "断开连接"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "已断开连接"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "编辑或删除其他成员创建的表情和贴纸。"
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "编辑此频道中角色和成员的覆盖权限。"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "输入代码"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "进入全屏"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "整个屏幕"
|
||||
msgid "Entire system"
|
||||
msgstr "整个系统"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "整个系统音频"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "退出"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "退出全屏"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "请先完成账号设置"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "完成设置"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "在\"操作系统\"模式下,上方列出的词典仅供参考。如
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "在浏览器中,按住说话功能仅在 {PRODUCT_NAME} 标签页处于焦点时可用。请安装桌面应用以使用系统范围的按住说话功能。"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "通话中"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "正在加载目标…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "正在加载实例配置"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "恶意软件、凭据盗窃或有害文件。"
|
||||
msgid "Manage"
|
||||
msgstr "管理"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "管理帐号"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "最新优先"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "非动态表情 ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "无"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "重新连接成功。如需恢复之前的屏幕共享,请重新选择屏幕。"
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "正在重新连接..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "参考已复制."
|
||||
msgid "Referral parameters"
|
||||
msgstr "引荐参数"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "刷新音频设备"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "自残或自杀"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "自托管设置"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "会话"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "将 {fieldNode} 设置为 {0}."
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "设置自定义状态"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "暂不处理此检查?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "设置 {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "瑞典语"
|
||||
msgid "Switch account"
|
||||
msgstr "切换账号"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "切换账号"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "该好友请求已失效。请刷新后重试。"
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "该图片无法使用。请尝试其他文件。"
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "到底了。"
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "#0000 标签是 Visionary 订阅者专属。Visionary 已停止购买。"
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API 所在的域与此页面不同,因此设置请求将不带您的会话发送。请检查此实例配置的公共域和端口,然后重新加载。"
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "应用崩溃了"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "未知用户"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "未知用户"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "查看通话"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "查看通话控制"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "账号删除后,您将无法删除已发送的消息"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "您仍需完成邮箱验证步骤。"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "你不会在桌面端收到通知"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "你将显示为离线状态"
|
||||
|
||||
@@ -355,7 +355,7 @@ msgstr "{count, plural, one {# 個書籤} other {# 個書籤}}"
|
||||
msgid "{count, plural, one {# community found} other {# communities found}}"
|
||||
msgstr "{count, plural, one {# 個社群} other {# 個社群}}"
|
||||
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1950
|
||||
#: src/features/app/components/layout/GuildsLayout.tsx:1951
|
||||
msgid "{count, plural, one {# community is temporarily unavailable due to a flux capacitor malfunction.} other {# communities are temporarily unavailable due to a flux capacitor malfunction.}}"
|
||||
msgstr "{count, plural, one {# 個社群} other {# 個社群}}因時空電容器故障,暫時無法使用"
|
||||
|
||||
@@ -404,7 +404,7 @@ msgstr "{count, plural, one {# 個共同社群} other {# 個共同社群}}"
|
||||
msgid "{count, plural, one {# other} other {# others}}"
|
||||
msgstr "{count, plural, one {# 位} other {# 位}}"
|
||||
|
||||
#: src/features/voice/components/VoiceCallView.tsx:506
|
||||
#: src/features/voice/components/VoiceCallView.tsx:507
|
||||
msgid "{count, plural, one {# participant in call} other {# participants in call}}"
|
||||
msgstr "{count, plural, one {# 位參與者在通話中} other {# 位參與者在通話中}}"
|
||||
|
||||
@@ -450,7 +450,7 @@ msgstr "{count, plural, one {展開(# 行)} other {展開(# 行)}}"
|
||||
msgid "{count, plural, one {Expand (# row)} other {Expand (# rows)}}"
|
||||
msgstr "{count, plural, one {展開 (# 列)} other {展開 (# 列)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:311
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:315
|
||||
msgid "{count, plural, one {Expand # other device} other {Expand # other devices}}"
|
||||
msgstr "{count, plural, one {展開其他 {count} 個裝置} other {展開其他 {count} 個裝置}}"
|
||||
|
||||
@@ -471,7 +471,7 @@ msgstr "{count, plural, one {通話中} other {# 人通話中}}"
|
||||
msgid "{count, plural, one {Join video call (# participant)} other {Join video call (# participants)}}"
|
||||
msgstr "{count, plural, one {加入視訊通話(#位參與者)} other {加入視訊通話(#位參與者)}}"
|
||||
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:637
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:655
|
||||
msgid "{count, plural, one {Keep watching # stream and add this one} other {Keep watching # streams and add this one}}"
|
||||
msgstr "{count, plural, one {繼續觀看 # 個直播並新增這個} other {繼續觀看 # 個直播並新增這個}}"
|
||||
|
||||
@@ -2182,7 +2182,7 @@ msgstr "動作"
|
||||
msgid "Active"
|
||||
msgstr "啟用中"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:358
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:356
|
||||
#: src/features/auth/components/accounts/AccountRow.tsx:136
|
||||
msgid "Active account"
|
||||
msgstr "使用中的帳號"
|
||||
@@ -4578,7 +4578,7 @@ msgstr "目前不在線上"
|
||||
#. Button that moves to the previous setup wizard step.
|
||||
#. Footer button in the IAR modal that returns to the previous step.
|
||||
#. OAuth authorization secondary button. Returns to the previous carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:75
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:77
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/OAuthAuthorizeActions.tsx:14
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:150
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
@@ -4642,7 +4642,7 @@ msgid "Back to sticker"
|
||||
msgstr "返回貼圖"
|
||||
|
||||
#. Tooltip / aria label on the back button that returns from the call view to the voice channel view.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:114
|
||||
#: src/features/voice/components/VoiceCallView.tsx:115
|
||||
msgid "Back to voice channel"
|
||||
msgstr "返回語音頻道"
|
||||
|
||||
@@ -7497,7 +7497,7 @@ msgstr "收合頻道主題"
|
||||
#. Tooltip / aria label on a voice participant tile button that collapses expanded device tiles for one user.
|
||||
#. Voice menu action that collapses expanded device tiles back into a single tile.
|
||||
#: src/features/ui/action_menu/items/voice_participant_menu_data/shared.ts:122
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:173
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:176
|
||||
msgid "Collapse devices"
|
||||
msgstr "收合裝置"
|
||||
|
||||
@@ -8157,7 +8157,7 @@ msgstr "已連線到語音"
|
||||
#. Action label state in the DM channel header pill while the join request is in flight. Trailing ASCII ellipsis is intentional.
|
||||
#. Overlay status in the voice call view while joining. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/channel/components/channel_view/dm_channel_view/shared.ts:129
|
||||
#: src/features/voice/components/VoiceCallView.tsx:93
|
||||
#: src/features/voice/components/VoiceCallView.tsx:94
|
||||
msgid "Connecting..."
|
||||
msgstr "正在連線..."
|
||||
|
||||
@@ -8218,7 +8218,7 @@ msgid "Connection removed"
|
||||
msgstr "已移除連結"
|
||||
|
||||
#. Tooltip / aria label on the connection-stats button in the voice call header. Opens the voice connection status popout.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:118
|
||||
#: src/features/voice/components/VoiceCallView.tsx:119
|
||||
msgid "Connection stats"
|
||||
msgstr "連線狀態"
|
||||
|
||||
@@ -8466,7 +8466,7 @@ msgid "Copied"
|
||||
msgstr "已複製"
|
||||
|
||||
#. Toast shown after copying stats for nerds JSON to clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:13
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
msgid "Copied stats JSON to clipboard"
|
||||
msgstr "已將統計資料 JSON 複製到剪貼簿"
|
||||
|
||||
@@ -8499,11 +8499,6 @@ msgstr "已複製網址"
|
||||
msgid "Copy"
|
||||
msgstr "複製"
|
||||
|
||||
#. Aria label for a button that copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy as JSON"
|
||||
msgstr "複製為 JSON"
|
||||
|
||||
#. Developer-mode action that copies the attachment ID to the clipboard.
|
||||
#: src/features/ui/action_menu/MessageContextMenu.tsx:67
|
||||
msgid "Copy attachment ID"
|
||||
@@ -8540,7 +8535,7 @@ msgid "Copy banner URL"
|
||||
msgstr "複製封面圖片網址"
|
||||
|
||||
#. Tray menu item. Copies build / version diagnostics to the clipboard for bug reports.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:714
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:707
|
||||
#: src/features/platform/utils/DesktopLocaleBridge.ts:164
|
||||
msgid "Copy build info"
|
||||
msgstr "複製版本資訊"
|
||||
@@ -8743,8 +8738,8 @@ msgstr "複製設定金鑰"
|
||||
msgid "Copy stack trace"
|
||||
msgstr "複製堆疊追蹤"
|
||||
|
||||
#. Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:9
|
||||
#. Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.
|
||||
#: src/features/voice/components/StatsForNerdsCopyDescriptors.ts:5
|
||||
msgid "Copy stats JSON"
|
||||
msgstr "複製統計資料 JSON"
|
||||
|
||||
@@ -8772,7 +8767,7 @@ msgid "Copy the setup key into your authenticator app."
|
||||
msgstr "將設定金鑰複製到您的驗證器應用程式。"
|
||||
|
||||
#. Developer-mode action that copies a user snowflake/ID to the clipboard.
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:699
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:692
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:172
|
||||
msgid "Copy user ID"
|
||||
msgstr "複製使用者 ID"
|
||||
@@ -8797,7 +8792,7 @@ msgstr "複製影片"
|
||||
msgid "Copy video link"
|
||||
msgstr "複製影片連結"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:727
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:720
|
||||
msgid "Copy voice diagnostics"
|
||||
msgstr "複製語音診斷資訊"
|
||||
|
||||
@@ -8827,7 +8822,7 @@ msgid "Could not decode this audio file."
|
||||
msgstr "無法解碼此音訊檔案。"
|
||||
|
||||
#. Error shown when the setup wizard fails to load the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:91
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:93
|
||||
msgid "Could not load the instance configuration. Try reloading the page."
|
||||
msgstr "無法載入執行個體設定。請嘗試重新載入頁面。"
|
||||
|
||||
@@ -11424,7 +11419,7 @@ msgstr "中斷連線"
|
||||
#. Overlay status in the voice call view when not connected.
|
||||
#. Overlay status text in the compact / floating voice call tile when not connected.
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:15
|
||||
#: src/features/voice/components/VoiceCallView.tsx:102
|
||||
#: src/features/voice/components/VoiceCallView.tsx:103
|
||||
msgid "Disconnected"
|
||||
msgstr "已中斷連線"
|
||||
|
||||
@@ -12256,7 +12251,7 @@ msgstr "編輯或刪除其他成員建立的表情符號和貼圖。"
|
||||
msgid "Edit overwrites for roles and members in this channel."
|
||||
msgstr "編輯此頻道中身分組和成員的覆寫權限。"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:750
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:743
|
||||
#: src/features/app/components/pages/YouPage.tsx:157
|
||||
#: src/features/user/components/modals/UserProfileMobileSheet.tsx:682
|
||||
#: src/features/user/components/modals/UserProfileModal.tsx:587
|
||||
@@ -13109,7 +13104,7 @@ msgstr "輸入代碼"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (not in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:28
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:18
|
||||
#: src/features/voice/components/VoiceCallView.tsx:110
|
||||
#: src/features/voice/components/VoiceCallView.tsx:111
|
||||
msgid "Enter fullscreen"
|
||||
msgstr "進入全螢幕"
|
||||
|
||||
@@ -13277,7 +13272,7 @@ msgstr "整個畫面"
|
||||
msgid "Entire system"
|
||||
msgstr "整個系統"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:249
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:253
|
||||
msgid "Entire system audio"
|
||||
msgstr "整個系統音訊"
|
||||
|
||||
@@ -13478,7 +13473,7 @@ msgstr "離開"
|
||||
#. Tooltip / aria label on the fullscreen toggle in the voice call view (currently in fullscreen).
|
||||
#: src/features/voice/components/compact_voice_call_view/shared.ts:24
|
||||
#: src/features/voice/components/media_player/components/MediaFullscreenButton.tsx:14
|
||||
#: src/features/voice/components/VoiceCallView.tsx:106
|
||||
#: src/features/voice/components/VoiceCallView.tsx:107
|
||||
msgid "Exit fullscreen"
|
||||
msgstr "結束全螢幕"
|
||||
|
||||
@@ -14387,7 +14382,7 @@ msgstr "請先完成帳號設定"
|
||||
|
||||
#. Button that saves the configuration and completes the setup wizard.
|
||||
#. Setup wizard finish step title.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:83
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:85
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:327
|
||||
msgid "Finish setup"
|
||||
msgstr "完成設定"
|
||||
@@ -16830,7 +16825,7 @@ msgstr "在「作業系統」模式中,上方列出的字典僅供參考。如
|
||||
msgid "In a browser, push-to-talk only works while the {PRODUCT_NAME} tab is focused. Install the desktop app for system-wide push-to-talk."
|
||||
msgstr "在瀏覽器中,只有當「{PRODUCT_NAME}」分頁為焦點時,按下通話功能才能運作。請安裝桌面版應用程式以使用全系統的按下通話功能。"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:728
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:721
|
||||
msgid "In a call"
|
||||
msgstr "通話中"
|
||||
|
||||
@@ -18592,7 +18587,7 @@ msgid "Loading destinations…"
|
||||
msgstr "正在載入目的地…"
|
||||
|
||||
#. Accessible status while the setup wizard loads the instance configuration.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:87
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:89
|
||||
msgid "Loading instance configuration"
|
||||
msgstr "正在載入執行個體設定"
|
||||
|
||||
@@ -18885,7 +18880,7 @@ msgstr "惡意軟體、憑證竊盜或有害檔案。"
|
||||
msgid "Manage"
|
||||
msgstr "管理"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:398
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:396
|
||||
#: src/features/auth/components/accounts/AccountSwitcherModal.tsx:78
|
||||
msgid "Manage accounts"
|
||||
msgstr "管理帳號"
|
||||
@@ -21123,7 +21118,7 @@ msgstr "最新優先"
|
||||
#. Button that moves to the next setup wizard step.
|
||||
#. Generic primary or pagination action label that advances to the next step, page, or item.
|
||||
#. Primary button in the required-action modal. Moves to the next carousel step.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:79
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:81
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:154
|
||||
#: src/features/i18n/utils/CommonMessageDescriptors.ts:711
|
||||
msgid "Next"
|
||||
@@ -21799,7 +21794,7 @@ msgstr "非動態表情符號 ({emojiCount})"
|
||||
#: src/features/user/components/modals/tabs/components/EntranceSoundSection.tsx:143
|
||||
#: src/features/user/components/modals/tabs/privacy_safety_tab/data_request_modal/DataRequestModal.tsx:219
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:93
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:257
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:261
|
||||
msgid "None"
|
||||
msgstr "無"
|
||||
|
||||
@@ -24956,7 +24951,7 @@ msgid "Reconnect succeeded. Pick a screen again if you want to resume your previ
|
||||
msgstr "重新連線成功。如要繼續上次的串流,請再選取一次螢幕。"
|
||||
|
||||
#. Overlay status in the voice call view while reconnecting after a drop. Trailing ellipsis indicates in-progress.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:97
|
||||
#: src/features/voice/components/VoiceCallView.tsx:98
|
||||
msgid "Reconnecting..."
|
||||
msgstr "正在重新連線..."
|
||||
|
||||
@@ -25097,7 +25092,7 @@ msgstr "已複製參考資料。"
|
||||
msgid "Referral parameters"
|
||||
msgstr "推薦連結參數"
|
||||
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:301
|
||||
#: src/features/voice/components/AudioSourcePickerLinux.tsx:305
|
||||
msgid "Refresh audio sources"
|
||||
msgstr "重新整理音訊來源"
|
||||
|
||||
@@ -27871,7 +27866,7 @@ msgid "Self-harm or suicide"
|
||||
msgstr "自殘或自殺"
|
||||
|
||||
#. Accessible label for the self-host setup wizard carousel.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:67
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:69
|
||||
msgid "Self-host setup"
|
||||
msgstr "自行代管設定"
|
||||
|
||||
@@ -28220,7 +28215,7 @@ msgstr "已登入裝置"
|
||||
msgid "Set {fieldNode} to {0}."
|
||||
msgstr "將 {fieldNode} 設定為 {0}。"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:608
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:601
|
||||
#: src/features/app/components/shared/custom_status_display/CustomStatusDisplay.tsx:314
|
||||
msgid "Set a custom status"
|
||||
msgstr "設定自訂狀態"
|
||||
@@ -28419,7 +28414,7 @@ msgid "Set this check aside?"
|
||||
msgstr "暫停此檢查?"
|
||||
|
||||
#. Title for the self-host setup wizard modal.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:71
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:73
|
||||
msgid "Set up {productName}"
|
||||
msgstr "設定 {productName}"
|
||||
|
||||
@@ -30929,7 +30924,7 @@ msgstr "瑞典文"
|
||||
msgid "Switch account"
|
||||
msgstr "切換帳號"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:684
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:677
|
||||
msgid "Switch accounts"
|
||||
msgstr "切換帳號"
|
||||
|
||||
@@ -31586,7 +31581,7 @@ msgid "That friend request is no longer available. Refresh and try again."
|
||||
msgstr "該好友邀請已失效。請重新整理後再試一次。"
|
||||
|
||||
#. Error shown when a branding image fails to upload in the setup wizard.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:95
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:102
|
||||
msgid "That image could not be used. Try a different file."
|
||||
msgstr "該圖片無法使用。請嘗試其他檔案。"
|
||||
|
||||
@@ -31617,6 +31612,11 @@ msgstr "就這些了。"
|
||||
msgid "The #0000 tag is reserved for Visionary subscribers. Visionary is no longer available for purchase."
|
||||
msgstr "#0000 標籤保留給 Visionary 訂閱者。Visionary 已停止販售。"
|
||||
|
||||
#. Error shown when the setup wizard cannot load because the API origin differs from the page origin.
|
||||
#: src/features/app/components/setup/SelfHostedSetupWizardGate.tsx:97
|
||||
msgid "The API is on a different origin than this page, so setup requests are sent without your session. Check the public origin and port this instance is configured with, then reload."
|
||||
msgstr "API 的網域與此頁面不同,因此設定要求將不含您的會話資訊。請檢查此執行個體設定的公開網域和埠號,然後重新載入。"
|
||||
|
||||
#: src/features/app/components/ErrorFallback.tsx:120
|
||||
msgid "The app crashed"
|
||||
msgstr "應用程式當機了"
|
||||
@@ -34049,7 +34049,7 @@ msgstr "不明使用者"
|
||||
#: src/features/devtools/utils/CommandUtils.ts:27
|
||||
#: src/features/guild/components/modals/guild_tabs/GuildAuditLogTab.tsx:114
|
||||
#: src/features/voice/components/VoiceParticipantAvatarList.tsx:44
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:169
|
||||
#: src/features/voice/components/VoiceParticipantTile.tsx:172
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:30
|
||||
msgid "Unknown user"
|
||||
msgstr "不明使用者"
|
||||
@@ -35961,7 +35961,7 @@ msgid "View call"
|
||||
msgstr "檢視通話"
|
||||
|
||||
#. Aria label for the show-controls trigger when the call toolbar is auto-hidden.
|
||||
#: src/features/voice/components/VoiceCallView.tsx:123
|
||||
#: src/features/voice/components/VoiceCallView.tsx:124
|
||||
msgid "View call controls"
|
||||
msgstr "檢視通話控制選項"
|
||||
|
||||
@@ -37928,12 +37928,12 @@ msgstr "帳號刪除後,您將無法刪除已傳送的訊息"
|
||||
msgid "You will still need to finish the email step."
|
||||
msgstr "你還是需要完成電子郵件驗證步驟。"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:94
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:92
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:40
|
||||
msgid "You won't receive notifications on desktop"
|
||||
msgstr "您將不會在電腦版收到通知"
|
||||
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:95
|
||||
#: src/features/app/components/floating/UserAreaPopout.tsx:93
|
||||
#: src/features/user/components/modals/StatusChangeBottomSheet.tsx:41
|
||||
msgid "You'll appear offline"
|
||||
msgstr "您會顯示為離線"
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
// @vitest-environment happy-dom
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {installVoiceMenuTestBootstrap} from '@app/features/ui/action_menu/items/__fixtures__/VoiceMenuTestBootstrap';
|
||||
import type {GuildMemberData} from '@fluxer/schema/src/domains/guild/GuildMemberSchemas';
|
||||
import type {Guild} from '@fluxer/schema/src/domains/guild/GuildResponseSchemas';
|
||||
import {describe, expect, it, vi} from 'vitest';
|
||||
|
||||
vi.mock('@lingui/core/macro', () => {
|
||||
const descriptor = (value: unknown): unknown => (typeof value === 'string' ? {message: value} : value);
|
||||
return {msg: descriptor, t: descriptor, plural: () => '', select: () => '', selectOrdinal: () => ''};
|
||||
});
|
||||
vi.mock('@app/features/gateway/transport/GatewayConnection', () => ({default: {socket: null}}));
|
||||
vi.mock('@app/features/channel/state/Channels', () => ({default: {getChannel: () => null}}));
|
||||
vi.mock('@app/features/guild/state/Guilds', () => ({
|
||||
default: {
|
||||
getGuild: (guildId: string) => ({
|
||||
id: guildId,
|
||||
disabledOperations: 0,
|
||||
roles: {
|
||||
'10': {id: '10', permissions: 0n, position: 0},
|
||||
'20': {id: '20', permissions: 0n, position: 5},
|
||||
'30': {id: '30', permissions: 0n, position: 9},
|
||||
},
|
||||
}),
|
||||
},
|
||||
}));
|
||||
|
||||
installVoiceMenuTestBootstrap();
|
||||
|
||||
const {canManageTargetUser} = await import('@app/features/permissions/utils/PermissionUtils');
|
||||
const {default: GuildMembers} = await import('@app/features/member/state/GuildMembers');
|
||||
const {default: MemberSidebar} = await import('@app/features/member/state/MemberSidebar');
|
||||
|
||||
const MODERATOR_ROLE = {id: '20', permissions: 0n, position: 5};
|
||||
|
||||
let nextGuildId = 0;
|
||||
|
||||
function makeMember(userId: string, roles: Array<string>, nick: string | null = null): GuildMemberData {
|
||||
return {
|
||||
user: {
|
||||
id: userId,
|
||||
username: `user-${userId}`,
|
||||
discriminator: '0001',
|
||||
global_name: null,
|
||||
avatar: null,
|
||||
avatar_color: null,
|
||||
flags: 0,
|
||||
},
|
||||
nick,
|
||||
roles,
|
||||
joined_at: '2026-01-01T00:00:00.000Z',
|
||||
};
|
||||
}
|
||||
|
||||
function makeGuild(guildId: string): Guild {
|
||||
return {id: guildId, owner_id: 'owner'} as unknown as Guild;
|
||||
}
|
||||
|
||||
function syncMemberList(guildId: string, channelId: string, members: Array<GuildMemberData>): void {
|
||||
MemberSidebar.subscribeToChannel(guildId, channelId, [[0, 99]]);
|
||||
MemberSidebar.handleListUpdate({
|
||||
guildId,
|
||||
listId: 'everyone',
|
||||
channelId,
|
||||
memberCount: members.length,
|
||||
onlineCount: members.length,
|
||||
groups: [{id: 'online', count: members.length}],
|
||||
ops: [
|
||||
{
|
||||
op: 'SYNC',
|
||||
range: [0, members.length],
|
||||
items: [{group: {id: 'online', count: members.length}}, ...members.map((member) => ({member}))],
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
function setupGuild(members: Array<GuildMemberData>): string {
|
||||
const guildId = `guild-${++nextGuildId}`;
|
||||
syncMemberList(guildId, `channel-${guildId}`, members);
|
||||
return guildId;
|
||||
}
|
||||
|
||||
describe('MemberSidebar member list hydration', () => {
|
||||
it('makes membership known for members that only ever appeared in the member list', () => {
|
||||
const guildId = setupGuild([makeMember('target-low', []), makeMember('target-high', ['30'])]);
|
||||
expect(GuildMembers.isMembershipKnown(guildId, 'target-low')).toBe(true);
|
||||
expect(GuildMembers.getMember(guildId, 'target-high')?.roles.has('30')).toBe(true);
|
||||
});
|
||||
|
||||
it('lets the role hierarchy check pass for a sidebar member who has never posted', () => {
|
||||
const guildId = setupGuild([makeMember('target-low', [])]);
|
||||
expect(canManageTargetUser(makeGuild(guildId), 'me', MODERATOR_ROLE, 'target-low')).toBe(true);
|
||||
});
|
||||
|
||||
it('still refuses a sidebar member who outranks you', () => {
|
||||
const guildId = setupGuild([makeMember('target-high', ['30'])]);
|
||||
expect(canManageTargetUser(makeGuild(guildId), 'me', MODERATOR_ROLE, 'target-high')).toBe(false);
|
||||
});
|
||||
|
||||
it('does not create members for group header rows', () => {
|
||||
const guildId = setupGuild([makeMember('target-low', []), makeMember('target-high', ['30'])]);
|
||||
expect(GuildMembers.getMemberCount(guildId)).toBe(2);
|
||||
});
|
||||
|
||||
it('leaves an already known member untouched', () => {
|
||||
const guildId = `guild-${++nextGuildId}`;
|
||||
GuildMembers.hydrateIfMissing(guildId, makeMember('target-low', ['20'], 'authoritative'));
|
||||
syncMemberList(guildId, `channel-${guildId}`, [makeMember('target-low', [], 'stale')]);
|
||||
expect(GuildMembers.getMember(guildId, 'target-low')?.nick).toBe('authoritative');
|
||||
});
|
||||
});
|
||||
@@ -5,6 +5,7 @@ import Channels from '@app/features/channel/state/Channels';
|
||||
import GatewayConnection from '@app/features/gateway/transport/GatewayConnection';
|
||||
import Guilds from '@app/features/guild/state/Guilds';
|
||||
import {GuildMember} from '@app/features/member/models/GuildMember';
|
||||
import GuildMembers from '@app/features/member/state/GuildMembers';
|
||||
import {getHydratedMemberListRangesFromNormalized} from '@app/features/member/utils/MemberListHydration';
|
||||
import {deriveMemberListIdentity} from '@app/features/member/utils/MemberListIdentity';
|
||||
import {
|
||||
@@ -695,6 +696,7 @@ class MemberSidebar {
|
||||
}
|
||||
userIdRowCounts.set(userId, (userIdRowCounts.get(userId) ?? 0) + 1);
|
||||
newMembersByUserId.set(userId, member);
|
||||
GuildMembers.hydrateIfMissing(guildId, member);
|
||||
const memberItem = this.convertItem(guildId, row);
|
||||
if (memberItem) {
|
||||
newItems.set(rowIndex, memberItem);
|
||||
|
||||
@@ -84,6 +84,8 @@ interface OnlineWaiter {
|
||||
onAbort: () => void;
|
||||
}
|
||||
|
||||
const strippedAuthorizationOrigins = new Set<string>();
|
||||
|
||||
const onlineWaiters = new Set<OnlineWaiter>();
|
||||
let onlineListenerActive = false;
|
||||
|
||||
@@ -167,6 +169,10 @@ export class RestClient {
|
||||
this.state.globalIntercept = hooks.intercept;
|
||||
}
|
||||
|
||||
carriesAuthorization(): boolean {
|
||||
return !isOffOrigin(resolveUrl(this.state, '/', undefined));
|
||||
}
|
||||
|
||||
dispatch<T = unknown>(method: HttpMethod, path: string, options: RestRequestOptions = {}): Promise<RestResponse<T>> {
|
||||
return runWithSudoEscalation<T>(this.state, method, path, options, 'fresh');
|
||||
}
|
||||
@@ -319,7 +325,12 @@ function composePlan(
|
||||
): Plan {
|
||||
const url = resolveUrl(state, path, options.query);
|
||||
const body = encodeBody(options);
|
||||
const sameOrigin = !looksAbsolute(path) && !isOffOrigin(url);
|
||||
const targetsApiBase = !looksAbsolute(path);
|
||||
const apiOrigin = targetsApiBase ? originOf(url) : null;
|
||||
const sameOrigin = targetsApiBase && (apiOrigin === null || apiOrigin === window.location.origin);
|
||||
if (apiOrigin !== null && !sameOrigin) {
|
||||
reportStrippedAuthorization(state, apiOrigin, options.auth);
|
||||
}
|
||||
const headers = assembleHeaders({
|
||||
state,
|
||||
callerHeaders: options.headers,
|
||||
@@ -365,14 +376,26 @@ function looksAbsolute(path: string): boolean {
|
||||
return path.startsWith('//') || /^[a-z][a-z0-9+.-]*:\/\//i.test(path);
|
||||
}
|
||||
|
||||
function isOffOrigin(url: string): boolean {
|
||||
function originOf(url: string): string | null {
|
||||
try {
|
||||
return new URL(url).origin !== window.location.origin;
|
||||
return new URL(url).origin;
|
||||
} catch {
|
||||
return false;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function isOffOrigin(url: string): boolean {
|
||||
const origin = originOf(url);
|
||||
return origin !== null && origin !== window.location.origin;
|
||||
}
|
||||
|
||||
function reportStrippedAuthorization(state: RuntimeState, apiOrigin: string, auth: RestAuthMode | undefined): void {
|
||||
if (auth === 'none' || strippedAuthorizationOrigins.has(apiOrigin)) return;
|
||||
if (!state.authProvider()) return;
|
||||
strippedAuthorizationOrigins.add(apiOrigin);
|
||||
log.warn(`authorization withheld from off-origin api base: ${apiOrigin} (page ${window.location.origin})`);
|
||||
}
|
||||
|
||||
function encodeBody(options: RestRequestOptions): BodyShape {
|
||||
if (options.multipart) {
|
||||
return {tag: 'form', payload: buildFormData(options.multipart)};
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {beforeEach, describe, expect, test, vi} from 'vitest';
|
||||
|
||||
let nativeMacOS = false;
|
||||
|
||||
vi.mock('@app/features/ui/utils/NativeUtils', () => ({
|
||||
isNativeMacOS: () => nativeMacOS,
|
||||
}));
|
||||
|
||||
const {isTextInputKeyEvent} = await import('@app/features/platform/utils/IsTextInputKeyEvent');
|
||||
|
||||
const keyEvent = (init: Partial<KeyboardEvent>): KeyboardEvent =>
|
||||
({key: '', ctrlKey: false, metaKey: false, altKey: false, shiftKey: false, ...init}) as KeyboardEvent;
|
||||
|
||||
beforeEach(() => {
|
||||
nativeMacOS = false;
|
||||
});
|
||||
|
||||
describe('isTextInputKeyEvent', () => {
|
||||
test('Alt+digit is a shortcut chord, not typing, off macOS', () => {
|
||||
for (const key of ['1', '2', '3', '4', '5', '6', '7', '8', '9']) {
|
||||
expect(isTextInputKeyEvent(keyEvent({key, altKey: true}))).toBe(false);
|
||||
}
|
||||
});
|
||||
|
||||
test('Alt+letter is a shortcut chord, not typing, off macOS', () => {
|
||||
expect(isTextInputKeyEvent(keyEvent({key: 'a', altKey: true}))).toBe(false);
|
||||
});
|
||||
|
||||
test('Option-composed characters stay typing on macOS', () => {
|
||||
nativeMacOS = true;
|
||||
expect(isTextInputKeyEvent(keyEvent({key: '¡', altKey: true}))).toBe(true);
|
||||
expect(isTextInputKeyEvent(keyEvent({key: '@', altKey: true}))).toBe(true);
|
||||
});
|
||||
|
||||
test('a bare printable key is still typing', () => {
|
||||
expect(isTextInputKeyEvent(keyEvent({key: 'a'}))).toBe(true);
|
||||
expect(isTextInputKeyEvent(keyEvent({key: '1'}))).toBe(true);
|
||||
});
|
||||
|
||||
test('ctrl and meta chords and named keys are still not typing', () => {
|
||||
expect(isTextInputKeyEvent(keyEvent({key: '1', ctrlKey: true}))).toBe(false);
|
||||
expect(isTextInputKeyEvent(keyEvent({key: '1', metaKey: true}))).toBe(false);
|
||||
expect(isTextInputKeyEvent(keyEvent({key: 'ArrowUp'}))).toBe(false);
|
||||
expect(isTextInputKeyEvent(keyEvent({key: 'ArrowUp', altKey: true}))).toBe(false);
|
||||
});
|
||||
|
||||
test('a dead key still counts as typing while Alt is held', () => {
|
||||
expect(isTextInputKeyEvent(keyEvent({key: 'Dead', altKey: true}))).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -1,7 +1,9 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {isNativeMacOS} from '@app/features/ui/utils/NativeUtils';
|
||||
|
||||
export function isTextInputKeyEvent(event: KeyboardEvent): boolean {
|
||||
const {key, ctrlKey, metaKey} = event;
|
||||
const {key, ctrlKey, metaKey, altKey} = event;
|
||||
if (!key || key === 'Unidentified') {
|
||||
return false;
|
||||
}
|
||||
@@ -11,6 +13,9 @@ export function isTextInputKeyEvent(event: KeyboardEvent): boolean {
|
||||
if (key === 'Dead') {
|
||||
return true;
|
||||
}
|
||||
if (altKey && !isNativeMacOS()) {
|
||||
return false;
|
||||
}
|
||||
if (key.length > 1 && NAMED_KEY_PATTERN.test(key)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
+34
-3
@@ -4,7 +4,7 @@
|
||||
import {installVoiceMenuTestBootstrap} from '@app/features/ui/action_menu/items/__fixtures__/VoiceMenuTestBootstrap';
|
||||
import type {VoiceParticipantMenuScreenShareSource} from '@app/features/ui/action_menu/items/VoiceParticipantMenuTypes';
|
||||
import type {I18n} from '@lingui/core';
|
||||
import {expect, test, vi} from 'vitest';
|
||||
import {beforeEach, expect, test, vi} from 'vitest';
|
||||
|
||||
vi.mock('@lingui/core/macro', () => {
|
||||
const descriptor = (value: unknown): unknown => (typeof value === 'string' ? {message: value} : value);
|
||||
@@ -38,6 +38,9 @@ vi.mock('@app/features/voice/state/StreamAudioPrefs', () => ({
|
||||
vi.mock('@app/features/voice/state/VoiceSettings', () => ({
|
||||
default: {showMyOwnScreenShare: false, pauseOwnScreenSharePreviewOnUnfocus: false},
|
||||
}));
|
||||
vi.mock('@app/features/voice/commands/VoiceDiagnosticsCommands', () => ({
|
||||
copyVoiceDiagnostics: vi.fn(async () => undefined),
|
||||
}));
|
||||
vi.mock('@app/features/voice/commands/VoiceSettingsCommands', () => ({
|
||||
update: vi.fn(),
|
||||
}));
|
||||
@@ -47,6 +50,7 @@ installVoiceMenuTestBootstrap();
|
||||
const {buildVoiceParticipantStreamMenu} = await import(
|
||||
'@app/features/ui/action_menu/items/VoiceParticipantStreamMenuBuilder'
|
||||
);
|
||||
const {copyVoiceDiagnostics} = await import('@app/features/voice/commands/VoiceDiagnosticsCommands');
|
||||
|
||||
const i18n = {
|
||||
locale: 'en',
|
||||
@@ -56,6 +60,7 @@ const i18n = {
|
||||
interface MenuLeaf {
|
||||
label?: string;
|
||||
items?: Array<MenuLeaf>;
|
||||
onClick?: () => void;
|
||||
}
|
||||
|
||||
function streamMenu(source: VoiceParticipantMenuScreenShareSource): Array<{items: Array<MenuLeaf>}> {
|
||||
@@ -99,18 +104,44 @@ const WATCHED_REMOTE_STREAM_SOURCE: VoiceParticipantMenuScreenShareSource = {
|
||||
state: {kind: 'remote-watched', hasAudio: true, onStopWatching: () => undefined},
|
||||
};
|
||||
|
||||
const UNWATCHED_REMOTE_STREAM_SOURCE: VoiceParticipantMenuScreenShareSource = {
|
||||
kind: 'screen-share',
|
||||
streamKey: 'stream-key',
|
||||
state: {kind: 'remote-unwatched', onWatch: () => undefined},
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
vi.mocked(copyVoiceDiagnostics).mockClear();
|
||||
});
|
||||
|
||||
test('own stream keeps a More options submenu with the screen-share preferences', () => {
|
||||
const groups = streamMenu(OWN_STREAM_SOURCE);
|
||||
const moreOptions = findLeaf(groups, 'More options');
|
||||
expect(moreOptions).not.toBeNull();
|
||||
expect(findLeaf(groups, 'Show my screen share')).not.toBeNull();
|
||||
expect(findLeaf(groups, 'Copy stats JSON')).not.toBeNull();
|
||||
expect(findLeaf(groups, 'Report Problem')).toBeNull();
|
||||
});
|
||||
|
||||
test('remote watched stream omits the now-empty More options submenu and keeps audio controls', () => {
|
||||
test('remote watched stream keeps a More options submenu with the diagnostics entry and audio controls', () => {
|
||||
const groups = streamMenu(WATCHED_REMOTE_STREAM_SOURCE);
|
||||
expect(findLeaf(groups, 'More options')).toBeNull();
|
||||
expect(findLeaf(groups, 'More options')).not.toBeNull();
|
||||
expect(findLeaf(groups, 'Copy stats JSON')).not.toBeNull();
|
||||
expect(findLeaf(groups, 'Mute')).not.toBeNull();
|
||||
expect(findLeaf(groups, 'Stream volume')).not.toBeNull();
|
||||
expect(findLeaf(groups, 'Report Problem')).toBeNull();
|
||||
});
|
||||
|
||||
test('remote unwatched stream keeps the diagnostics entry', () => {
|
||||
const groups = streamMenu(UNWATCHED_REMOTE_STREAM_SOURCE);
|
||||
expect(findLeaf(groups, 'More options')).not.toBeNull();
|
||||
expect(findLeaf(groups, 'Copy stats JSON')).not.toBeNull();
|
||||
});
|
||||
|
||||
test('the diagnostics entry on a remote stream copies voice diagnostics', () => {
|
||||
const groups = streamMenu(WATCHED_REMOTE_STREAM_SOURCE);
|
||||
const copyStats = findLeaf(groups, 'Copy stats JSON');
|
||||
expect(copyStats).not.toBeNull();
|
||||
copyStats?.onClick?.();
|
||||
expect(vi.mocked(copyVoiceDiagnostics)).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
+44
-20
@@ -30,9 +30,11 @@ import type {
|
||||
MenuSliderType,
|
||||
MenuSubmenuItemType,
|
||||
} from '@app/features/ui/menu_bottom_sheet/MenuBottomSheet';
|
||||
import {copyVoiceDiagnostics} from '@app/features/voice/commands/VoiceDiagnosticsCommands';
|
||||
import * as VoiceSettingsCommands from '@app/features/voice/commands/VoiceSettingsCommands';
|
||||
import {changeActiveScreenShare, stopActiveScreenShare} from '@app/features/voice/components/ActiveScreenShareMenu';
|
||||
import {openScreenSharePreviewPrivacyModal} from '@app/features/voice/components/modals/ScreenSharePickerModal';
|
||||
import {COPY_STATS_JSON_DESCRIPTOR} from '@app/features/voice/components/StatsForNerdsCopyDescriptors';
|
||||
import MediaEngine from '@app/features/voice/engine/MediaEngineFacade';
|
||||
import ActiveScreenShareSource from '@app/features/voice/state/ActiveScreenShareSource';
|
||||
import PopoutWindowManager, {isVoicePopoutSupported} from '@app/features/voice/state/PopoutWindowManager';
|
||||
@@ -211,28 +213,39 @@ function buildStreamPopoutAction(options: VoiceParticipantStreamMenuBuilderOptio
|
||||
|
||||
function buildStreamMoreOptions(options: VoiceParticipantStreamMenuBuilderOptions): MenuSubmenuItemType | null {
|
||||
const {i18n, guildId, source, showMyOwnScreenShare, pauseOwnScreenSharePreviewOnUnfocus, onClose} = options;
|
||||
if (source.state.kind !== 'own') return null;
|
||||
const items: Array<MenuItemType | MenuCheckboxType> = [
|
||||
{
|
||||
label: i18n._(SHOW_MY_SCREEN_SHARE_DESCRIPTOR),
|
||||
checked: showMyOwnScreenShare,
|
||||
onChange: (checked: boolean) => VoiceSettingsCommands.update({showMyOwnScreenShare: checked}),
|
||||
},
|
||||
{
|
||||
label: i18n._(PAUSE_OWN_STREAM_PREVIEW_DESCRIPTOR),
|
||||
checked: pauseOwnScreenSharePreviewOnUnfocus,
|
||||
onChange: (checked: boolean) => VoiceSettingsCommands.update({pauseOwnScreenSharePreviewOnUnfocus: checked}),
|
||||
},
|
||||
];
|
||||
if (guildId === undefined) {
|
||||
items.push({
|
||||
label: i18n._(SCREEN_SHARE_PRIVACY_DESCRIPTOR),
|
||||
onClick: () => {
|
||||
onClose();
|
||||
openScreenSharePreviewPrivacyModal();
|
||||
const items: Array<MenuItemType | MenuCheckboxType> = [];
|
||||
if (source.state.kind === 'own') {
|
||||
items.push(
|
||||
{
|
||||
label: i18n._(SHOW_MY_SCREEN_SHARE_DESCRIPTOR),
|
||||
checked: showMyOwnScreenShare,
|
||||
onChange: (checked: boolean) => VoiceSettingsCommands.update({showMyOwnScreenShare: checked}),
|
||||
},
|
||||
});
|
||||
{
|
||||
label: i18n._(PAUSE_OWN_STREAM_PREVIEW_DESCRIPTOR),
|
||||
checked: pauseOwnScreenSharePreviewOnUnfocus,
|
||||
onChange: (checked: boolean) => VoiceSettingsCommands.update({pauseOwnScreenSharePreviewOnUnfocus: checked}),
|
||||
},
|
||||
);
|
||||
if (guildId === undefined) {
|
||||
items.push({
|
||||
label: i18n._(SCREEN_SHARE_PRIVACY_DESCRIPTOR),
|
||||
onClick: () => {
|
||||
onClose();
|
||||
openScreenSharePreviewPrivacyModal();
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
items.push({
|
||||
label: i18n._(COPY_STATS_JSON_DESCRIPTOR),
|
||||
onClick: () => {
|
||||
onClose();
|
||||
void copyVoiceDiagnostics(i18n).catch((error) => {
|
||||
logger.error('Failed to copy voice diagnostics from participant menu', error);
|
||||
});
|
||||
},
|
||||
});
|
||||
if (items.length === 0) return null;
|
||||
return {
|
||||
label: i18n._(MORE_OPTIONS_DESCRIPTOR),
|
||||
@@ -334,6 +347,17 @@ export const VoiceParticipantOwnStreamMenuTail: React.FC<VoiceParticipantOwnStre
|
||||
{i18n._(SCREEN_SHARE_PRIVACY_DESCRIPTOR)}
|
||||
</MenuItem>
|
||||
)}
|
||||
<MenuItem
|
||||
onClick={() => {
|
||||
onClose();
|
||||
void copyVoiceDiagnostics(i18n).catch((error) => {
|
||||
logger.error('Failed to copy voice diagnostics from participant menu', error);
|
||||
});
|
||||
}}
|
||||
data-flx="ui.action-menu.items.voice-participant-stream-menu-builder.voice-participant-own-stream-menu-tail.menu-item.close--2"
|
||||
>
|
||||
{i18n._(COPY_STATS_JSON_DESCRIPTOR)}
|
||||
</MenuItem>
|
||||
</MenuGroup>
|
||||
)}
|
||||
data-flx="ui.action-menu.items.voice-participant-stream-menu-builder.more-options-submenu"
|
||||
|
||||
@@ -88,16 +88,16 @@ const DESKTOP_UPDATE_READY_DESCRIPTOR = msg({
|
||||
message: 'Desktop update ready',
|
||||
comment: 'Modal title shown when a desktop app update has finished downloading.',
|
||||
});
|
||||
const DESKTOP_VERSION_HAS_BEEN_DOWNLOADED_DESCRIPTOR = msg({
|
||||
export const DESKTOP_VERSION_HAS_BEEN_DOWNLOADED_DESCRIPTOR = msg({
|
||||
message: 'Desktop version {version} has been downloaded. Restart {productName} to finish installing.',
|
||||
comment:
|
||||
'Desktop updater modal body. The version placeholder is the downloaded app version; productName is the app name.',
|
||||
});
|
||||
const THE_DESKTOP_UPDATE_HAS_BEEN_DOWNLOADED_DESCRIPTOR = msg({
|
||||
export const THE_DESKTOP_UPDATE_HAS_BEEN_DOWNLOADED_DESCRIPTOR = msg({
|
||||
message: 'The desktop update has been downloaded. Restart {productName} to finish installing.',
|
||||
comment: 'Desktop updater modal body when the downloaded version is unknown. productName is the app name.',
|
||||
});
|
||||
const RESTART_FLUXER_DESCRIPTOR = msg({
|
||||
export const RESTART_FLUXER_DESCRIPTOR = msg({
|
||||
message: 'Restart {productName}',
|
||||
comment: 'Button label that restarts the app to apply a desktop update. productName is the app name.',
|
||||
});
|
||||
|
||||
-55
@@ -1,55 +0,0 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {Button} from '@app/features/ui/button/Button';
|
||||
import * as ToastCommands from '@app/features/ui/commands/ToastCommands';
|
||||
import {
|
||||
COPIED_STATS_JSON_DESCRIPTOR,
|
||||
COPY_STATS_JSON_DESCRIPTOR,
|
||||
} from '@app/features/voice/components/StatsForNerdsCopyDescriptors';
|
||||
import {useStatsForNerds} from '@app/features/voice/components/useStatsForNerds';
|
||||
import {buildStatsForNerdsCopyPayload} from '@app/features/voice/utils/StatsForNerdsCopy';
|
||||
import {useLingui} from '@lingui/react/macro';
|
||||
import {CopySimpleIcon} from '@phosphor-icons/react';
|
||||
import type React from 'react';
|
||||
import {useCallback, useState} from 'react';
|
||||
|
||||
export const StatsForNerdsCopyButton: React.FC = () => {
|
||||
const {i18n} = useLingui();
|
||||
const data = useStatsForNerds();
|
||||
const [copying, setCopying] = useState(false);
|
||||
const handleCopy = useCallback(async () => {
|
||||
if (copying) return;
|
||||
setCopying(true);
|
||||
try {
|
||||
let payload: Record<string, unknown>;
|
||||
try {
|
||||
payload = await buildStatsForNerdsCopyPayload(data);
|
||||
} catch {
|
||||
payload = {
|
||||
schemaVersion: 1,
|
||||
createdAt: new Date().toISOString(),
|
||||
statsForNerds: data,
|
||||
};
|
||||
}
|
||||
await navigator.clipboard.writeText(JSON.stringify(payload, null, 2));
|
||||
ToastCommands.createToast({
|
||||
type: 'success',
|
||||
children: i18n._(COPIED_STATS_JSON_DESCRIPTOR),
|
||||
});
|
||||
} finally {
|
||||
setCopying(false);
|
||||
}
|
||||
}, [copying, data, i18n]);
|
||||
return (
|
||||
<Button
|
||||
variant="secondary"
|
||||
fitContent
|
||||
leftIcon={<CopySimpleIcon size={16} data-flx="user.stats-for-nerds-copy-button.copy-icon" />}
|
||||
submitting={copying}
|
||||
onClick={() => void handleCopy()}
|
||||
data-flx="user.stats-for-nerds-copy-button.copy"
|
||||
>
|
||||
{i18n._(COPY_STATS_JSON_DESCRIPTOR)}
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,22 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import * as ToastCommands from '@app/features/ui/commands/ToastCommands';
|
||||
import {COPIED_STATS_JSON_DESCRIPTOR} from '@app/features/voice/components/StatsForNerdsCopyDescriptors';
|
||||
import {buildStatsForNerdsCopyPayload, collectStatsForNerdsSnapshot} from '@app/features/voice/utils/StatsForNerdsCopy';
|
||||
import type {I18n} from '@lingui/core';
|
||||
|
||||
export async function copyVoiceDiagnostics(i18n: I18n): Promise<void> {
|
||||
const data = collectStatsForNerdsSnapshot();
|
||||
let payload: Record<string, unknown>;
|
||||
try {
|
||||
payload = await buildStatsForNerdsCopyPayload(data);
|
||||
} catch {
|
||||
payload = {
|
||||
schemaVersion: 1,
|
||||
createdAt: new Date().toISOString(),
|
||||
statsForNerds: data,
|
||||
};
|
||||
}
|
||||
await navigator.clipboard.writeText(JSON.stringify(payload, null, 2));
|
||||
ToastCommands.createToast({type: 'success', children: i18n._(COPIED_STATS_JSON_DESCRIPTOR)});
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {beforeEach, describe, expect, it, vi} from 'vitest';
|
||||
|
||||
const refreshMicrophoneFromSettings = vi.fn();
|
||||
const refreshCameraBackgroundFromSettings = vi.fn();
|
||||
const refreshCameraCaptureFromSettings = vi.fn();
|
||||
const refreshScreenShareCodecNegotiationFromSettings = vi.fn();
|
||||
|
||||
const settings = {
|
||||
cameraResolution: 720,
|
||||
videoDeviceId: 'camera',
|
||||
screenshareResolution: 1080,
|
||||
videoFrameRate: 60,
|
||||
streamingMode: 'smooth',
|
||||
screenShareContentHint: 'auto',
|
||||
preferredScreenShareCodec: 'auto',
|
||||
screenShareAv1OptIn: true,
|
||||
screenShareHevcOptIn: false,
|
||||
screenShareEncoderMode: 'auto',
|
||||
screenShareSoftwareQuality: 'auto',
|
||||
screenShareScalabilityMode: 'auto',
|
||||
screenShareBackupCodecMode: 'auto',
|
||||
openH264Enabled: false,
|
||||
};
|
||||
|
||||
vi.mock('@app/features/voice/engine/MediaEngineFacade', () => ({
|
||||
default: {
|
||||
room: null,
|
||||
refreshMicrophoneFromSettings,
|
||||
refreshCameraBackgroundFromSettings,
|
||||
refreshCameraCaptureFromSettings,
|
||||
refreshScreenShareCodecNegotiationFromSettings,
|
||||
setScreenShareAudioMuted: vi.fn(),
|
||||
applyAllLocalAudioPreferences: vi.fn(),
|
||||
applyLocalInputVolume: vi.fn(),
|
||||
},
|
||||
}));
|
||||
|
||||
vi.mock('@app/features/voice/engine/ScreenShareUnderperformance', () => ({
|
||||
noteDeliberateScreenShareQualityChange: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('@app/features/voice/utils/VoiceProcessingProfile', () => ({
|
||||
getActiveInputDeviceLabel: () => null,
|
||||
}));
|
||||
|
||||
vi.mock('@app/features/voice/state/VoiceSettings', () => ({
|
||||
default: {
|
||||
updateSettings: (patch: Record<string, unknown>) => Object.assign(settings, patch),
|
||||
get cameraResolution() {
|
||||
return settings.cameraResolution;
|
||||
},
|
||||
get videoDeviceId() {
|
||||
return settings.videoDeviceId;
|
||||
},
|
||||
getScreenshareResolution: () => settings.screenshareResolution,
|
||||
getVideoFrameRate: () => settings.videoFrameRate,
|
||||
getStreamingMode: () => settings.streamingMode,
|
||||
getScreenShareContentHint: () => settings.screenShareContentHint,
|
||||
getPreferredScreenShareCodec: () => settings.preferredScreenShareCodec,
|
||||
getScreenShareAv1OptIn: () => settings.screenShareAv1OptIn,
|
||||
getScreenShareHevcOptIn: () => settings.screenShareHevcOptIn,
|
||||
getScreenShareEncoderMode: () => settings.screenShareEncoderMode,
|
||||
getScreenShareSoftwareQuality: () => settings.screenShareSoftwareQuality,
|
||||
getScreenShareScalabilityMode: () => settings.screenShareScalabilityMode,
|
||||
getScreenShareBackupCodecMode: () => settings.screenShareBackupCodecMode,
|
||||
getOpenH264Enabled: () => settings.openH264Enabled,
|
||||
},
|
||||
}));
|
||||
|
||||
const VoiceSettingsCommands = await import('./VoiceSettingsCommands');
|
||||
|
||||
describe('screen-share codec settings reactions', () => {
|
||||
beforeEach(() => {
|
||||
settings.screenShareAv1OptIn = true;
|
||||
settings.screenShareHevcOptIn = false;
|
||||
settings.preferredScreenShareCodec = 'auto';
|
||||
refreshScreenShareCodecNegotiationFromSettings.mockClear();
|
||||
});
|
||||
|
||||
it('renegotiates the live screen share when the AV1 opt-in is turned off', () => {
|
||||
VoiceSettingsCommands.update({screenShareAv1OptIn: false});
|
||||
expect(refreshScreenShareCodecNegotiationFromSettings).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('renegotiates the live screen share when the HEVC opt-in changes', () => {
|
||||
VoiceSettingsCommands.update({screenShareHevcOptIn: true});
|
||||
expect(refreshScreenShareCodecNegotiationFromSettings).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('renegotiates the live screen share when the preferred codec changes', () => {
|
||||
VoiceSettingsCommands.update({preferredScreenShareCodec: 'vp9'});
|
||||
expect(refreshScreenShareCodecNegotiationFromSettings).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('leaves the negotiation alone for unrelated screen share settings', () => {
|
||||
VoiceSettingsCommands.update({videoFrameRate: 30});
|
||||
expect(refreshScreenShareCodecNegotiationFromSettings).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
@@ -79,6 +79,7 @@ type VoiceSettingsPatch = Partial<{
|
||||
screenShareAudioSourceMode: 'none' | 'system' | 'specific';
|
||||
screenShareAudioIncludeSources: Array<Record<string, string>>;
|
||||
screenShareAudioExcludeSources: Array<Record<string, string>>;
|
||||
screenShareDeviceAudioUsesMicrophone: boolean;
|
||||
openH264Enabled: boolean;
|
||||
}>;
|
||||
|
||||
@@ -102,6 +103,11 @@ const CAMERA_BACKGROUND_REFRESH_KEYS: Array<keyof VoiceSettingsPatch> = [
|
||||
'mirrorCamera',
|
||||
];
|
||||
const CAMERA_CAPTURE_REFRESH_KEYS: Array<keyof VoiceSettingsPatch> = ['cameraResolution', 'videoDeviceId'];
|
||||
const SCREEN_SHARE_CODEC_NEGOTIATION_REFRESH_KEYS: Array<keyof VoiceSettingsPatch> = [
|
||||
'preferredScreenShareCodec',
|
||||
'screenShareAv1OptIn',
|
||||
'screenShareHevcOptIn',
|
||||
];
|
||||
function refreshMicrophone(): void {
|
||||
MediaEngine.refreshMicrophoneFromSettings();
|
||||
}
|
||||
@@ -114,6 +120,10 @@ function refreshCameraCapture(): void {
|
||||
MediaEngine.refreshCameraCaptureFromSettings();
|
||||
}
|
||||
|
||||
function refreshScreenShareCodecNegotiation(): void {
|
||||
MediaEngine.refreshScreenShareCodecNegotiationFromSettings();
|
||||
}
|
||||
|
||||
function shouldRefreshMicrophone(settings: VoiceSettingsPatch): boolean {
|
||||
return MICROPHONE_REFRESH_KEYS.some((key) => settings[key] !== undefined);
|
||||
}
|
||||
@@ -122,6 +132,10 @@ function shouldRefreshCameraBackground(settings: VoiceSettingsPatch): boolean {
|
||||
return CAMERA_BACKGROUND_REFRESH_KEYS.some((key) => settings[key] !== undefined);
|
||||
}
|
||||
|
||||
function shouldRefreshScreenShareCodecNegotiation(settings: VoiceSettingsPatch): boolean {
|
||||
return SCREEN_SHARE_CODEC_NEGOTIATION_REFRESH_KEYS.some((key) => settings[key] !== undefined);
|
||||
}
|
||||
|
||||
function readCameraCaptureRefreshValues(): VoiceSettingsPatch {
|
||||
return {
|
||||
cameraResolution: VoiceSettings.cameraResolution,
|
||||
@@ -195,6 +209,9 @@ function applyUpdatedVoiceSettings(
|
||||
if (shouldRefreshCameraCapture(settings, cameraCaptureBefore, readCameraCaptureRefreshValues())) {
|
||||
refreshCameraCapture();
|
||||
}
|
||||
if (shouldRefreshScreenShareCodecNegotiation(settings)) {
|
||||
refreshScreenShareCodecNegotiation();
|
||||
}
|
||||
}
|
||||
|
||||
export function setVoiceProcessingModeForDeviceLabel(label: string, mode: VoiceProcessingMode): void {
|
||||
|
||||
@@ -141,6 +141,7 @@ export const AudioSourcePickerLinuxSubmenu = observer((props: AudioSourcePickerL
|
||||
const sourceMode = VoiceSettings.getScreenShareAudioSourceMode();
|
||||
const includeSources = VoiceSettings.getScreenShareAudioIncludeSources();
|
||||
const excludeSources = VoiceSettings.getScreenShareAudioExcludeSources();
|
||||
const usesDeviceMicrophone = VoiceSettings.getScreenShareDeviceAudioUsesMicrophone();
|
||||
const granular = VoiceSettings.getLinuxAudioCaptureGranularSelect();
|
||||
const deviceSelect = VoiceSettings.getLinuxAudioCaptureDeviceSelect();
|
||||
const ignoreVirtual = VoiceSettings.getLinuxAudioCaptureIgnoreVirtual();
|
||||
@@ -167,12 +168,13 @@ export const AudioSourcePickerLinuxSubmenu = observer((props: AudioSourcePickerL
|
||||
onSelectionChange?.('window');
|
||||
}, [onSelectionChange]);
|
||||
const handlePickSystem = useCallback(() => {
|
||||
VoiceSettingsCommands.update({
|
||||
screenShareAudioSourceMode: 'system',
|
||||
screenShareAudioIncludeSources: [],
|
||||
});
|
||||
VoiceSettingsCommands.update(
|
||||
isDeviceShare
|
||||
? {screenShareDeviceAudioUsesMicrophone: true}
|
||||
: {screenShareAudioSourceMode: 'system', screenShareAudioIncludeSources: []},
|
||||
);
|
||||
onSelectionChange?.(widenedScope);
|
||||
}, [onSelectionChange, widenedScope]);
|
||||
}, [isDeviceShare, onSelectionChange, widenedScope]);
|
||||
const handlePickNone = useCallback(() => {
|
||||
VoiceSettingsCommands.update({
|
||||
screenShareAudioSourceMode: 'none',
|
||||
@@ -189,10 +191,11 @@ export const AudioSourcePickerLinuxSubmenu = observer((props: AudioSourcePickerL
|
||||
VoiceSettingsCommands.update({
|
||||
screenShareAudioSourceMode: nextSources.length > 0 ? 'specific' : 'system',
|
||||
screenShareAudioIncludeSources: nextSources,
|
||||
...(isDeviceShare ? {screenShareDeviceAudioUsesMicrophone: false} : {}),
|
||||
});
|
||||
onSelectionChange?.(widenedScope);
|
||||
},
|
||||
[includeSources, onSelectionChange, widenedScope],
|
||||
[includeSources, isDeviceShare, onSelectionChange, widenedScope],
|
||||
);
|
||||
const handleToggleExcludeApp = useCallback(
|
||||
(item: LinuxAudioSourceItem) => {
|
||||
@@ -217,9 +220,10 @@ export const AudioSourcePickerLinuxSubmenu = observer((props: AudioSourcePickerL
|
||||
microphoneLabel,
|
||||
displayShareEnvironment,
|
||||
windowAudioScope,
|
||||
usesDeviceMicrophone,
|
||||
});
|
||||
const showsWideSourceLists = !offersWindowScope || resolvedScope === 'system';
|
||||
const wideSourceIsSelected = isDeviceShare ? !routesSelectedSources : sourceMode === 'system';
|
||||
const wideSourceIsSelected = isDeviceShare ? usesDeviceMicrophone || !routesSelectedSources : sourceMode === 'system';
|
||||
if (!snapshot.available && !snapshot.loading) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -2,13 +2,9 @@
|
||||
|
||||
import {msg} from '@lingui/core/macro';
|
||||
|
||||
export const COPY_AS_JSON_DESCRIPTOR = msg({
|
||||
message: 'Copy as JSON',
|
||||
comment: 'Aria label for a button that copies stats for nerds data as JSON to the clipboard.',
|
||||
});
|
||||
export const COPY_STATS_JSON_DESCRIPTOR = msg({
|
||||
message: 'Copy stats JSON',
|
||||
comment: 'Button label in audio and video settings. Copies stats for nerds data as JSON to the clipboard.',
|
||||
comment: 'Menu item label in the screen share menu. Copies stats for nerds data as JSON to the clipboard.',
|
||||
});
|
||||
export const COPIED_STATS_JSON_DESCRIPTOR = msg({
|
||||
message: 'Copied stats JSON to clipboard',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user