mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-09 20:22:11 +09:00
Compare commits
19
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4f39e6a89 | ||
|
|
00bf74cef5 | ||
|
|
c1c45d835f | ||
|
|
bbfe809bef | ||
|
|
e0843ac4f5 | ||
|
|
43741cdad8 | ||
|
|
b8e3807262 | ||
|
|
3304f01a84 | ||
|
|
2ba463235b | ||
|
|
15136fed59 | ||
|
|
6013581dd9 | ||
|
|
7a91f128e9 | ||
|
|
963ffc5550 | ||
|
|
a90991612c | ||
|
|
50ad23b760 | ||
|
|
425dab983b | ||
|
|
a0825e77c4 | ||
|
|
88038a1d5b | ||
|
|
c2c0fdb445 |
@@ -32,6 +32,7 @@
|
||||
/fluxer_docs/.astro/
|
||||
/fluxer_app/.devserver-cache.json
|
||||
/fluxer_app/pkgs/libfluxcore/
|
||||
/fluxer_app/pkgs/libfluxwebp/
|
||||
/fluxer_app/src/features/i18n/locales/*/messages.mjs
|
||||
/fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
|
||||
/fluxer_app/src/features/theme/styles/generated/
|
||||
|
||||
@@ -123,12 +123,16 @@ jobs:
|
||||
with:
|
||||
path: |
|
||||
fluxer_app/pkgs/libfluxcore
|
||||
fluxer_app/pkgs/libfluxwebp
|
||||
fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
|
||||
key: >-
|
||||
app-wasm-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
|
||||
'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts',
|
||||
'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock',
|
||||
'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**',
|
||||
'fluxer_app/rust/libfluxwebp/Cargo.toml', 'fluxer_app/rust/libfluxwebp/Cargo.lock',
|
||||
'fluxer_app/rust/libfluxwebp/src/**', 'fluxer_app/rust/libfluxwebp/shim/**',
|
||||
'fluxer_app/rust/libfluxwebp/simd/**',
|
||||
'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml',
|
||||
'packages/markdown_parser/rust/src/**') }}
|
||||
|
||||
@@ -142,12 +146,16 @@ jobs:
|
||||
with:
|
||||
path: |
|
||||
fluxer_app/pkgs/libfluxcore
|
||||
fluxer_app/pkgs/libfluxwebp
|
||||
fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
|
||||
key: >-
|
||||
app-wasm-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
|
||||
'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts',
|
||||
'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock',
|
||||
'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**',
|
||||
'fluxer_app/rust/libfluxwebp/Cargo.toml', 'fluxer_app/rust/libfluxwebp/Cargo.lock',
|
||||
'fluxer_app/rust/libfluxwebp/src/**', 'fluxer_app/rust/libfluxwebp/shim/**',
|
||||
'fluxer_app/rust/libfluxwebp/simd/**',
|
||||
'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml',
|
||||
'packages/markdown_parser/rust/src/**') }}
|
||||
|
||||
@@ -190,6 +198,9 @@ jobs:
|
||||
- name: Check Rust dependencies
|
||||
run: cargo deny --locked check -D warnings
|
||||
|
||||
- name: Check libfluxwebp dependencies
|
||||
run: cargo deny --manifest-path fluxer_app/rust/libfluxwebp/Cargo.toml --config deny.toml --locked check licenses bans sources
|
||||
|
||||
- name: Check desktop native dependencies
|
||||
run: tools/ci/check-desktop-native-workspaces.sh dependencies
|
||||
|
||||
@@ -242,6 +253,9 @@ jobs:
|
||||
- name: Check formatting
|
||||
run: cargo fmt --all -- --check
|
||||
|
||||
- name: Check formatting (libfluxwebp)
|
||||
run: cargo fmt --manifest-path fluxer_app/rust/libfluxwebp/Cargo.toml -- --check
|
||||
|
||||
- name: Check formatting (desktop native workspaces)
|
||||
run: tools/ci/check-desktop-native-workspaces.sh fmt
|
||||
|
||||
@@ -398,12 +412,16 @@ jobs:
|
||||
with:
|
||||
path: |
|
||||
fluxer_app/pkgs/libfluxcore
|
||||
fluxer_app/pkgs/libfluxwebp
|
||||
fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
|
||||
key: >-
|
||||
app-wasm-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
|
||||
'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts',
|
||||
'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock',
|
||||
'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**',
|
||||
'fluxer_app/rust/libfluxwebp/Cargo.toml', 'fluxer_app/rust/libfluxwebp/Cargo.lock',
|
||||
'fluxer_app/rust/libfluxwebp/src/**', 'fluxer_app/rust/libfluxwebp/shim/**',
|
||||
'fluxer_app/rust/libfluxwebp/simd/**',
|
||||
'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml',
|
||||
'packages/markdown_parser/rust/src/**') }}
|
||||
|
||||
@@ -417,12 +435,16 @@ jobs:
|
||||
with:
|
||||
path: |
|
||||
fluxer_app/pkgs/libfluxcore
|
||||
fluxer_app/pkgs/libfluxwebp
|
||||
fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
|
||||
key: >-
|
||||
app-wasm-${{ runner.os }}-1.98.1-${{ hashFiles('Cargo.lock', 'tools/ci/src/app_wasm.rs',
|
||||
'tools/ci/templates/libfluxcore_wrapper.js', 'tools/ci/templates/libfluxcore_wrapper.d.ts',
|
||||
'fluxer_app/rust/libfluxcore/Cargo.toml', 'fluxer_app/rust/libfluxcore/Cargo.lock',
|
||||
'fluxer_app/rust/libfluxcore/.cargo/config.toml', 'fluxer_app/rust/libfluxcore/src/**',
|
||||
'fluxer_app/rust/libfluxwebp/Cargo.toml', 'fluxer_app/rust/libfluxwebp/Cargo.lock',
|
||||
'fluxer_app/rust/libfluxwebp/src/**', 'fluxer_app/rust/libfluxwebp/shim/**',
|
||||
'fluxer_app/rust/libfluxwebp/simd/**',
|
||||
'packages/markdown_parser/rust/Cargo.toml', 'packages/markdown_parser/rust/.cargo/config.toml',
|
||||
'packages/markdown_parser/rust/src/**') }}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
/fluxer_app/.devserver-cache.json
|
||||
/fluxer_app/pkgs/libfluxcore/
|
||||
/fluxer_app/pkgs/libfluxwebp/
|
||||
/fluxer_app/src/features/i18n/locales/*/messages.mjs
|
||||
/fluxer_app/src/features/messaging/utils/markdown/parser/MarkdownParserWasmBytes.ts
|
||||
/fluxer_app/src/features/theme/styles/generated/
|
||||
|
||||
@@ -10524,7 +10524,6 @@
|
||||
},
|
||||
"gateway_rollout": {"$ref": "#/components/schemas/GatewayRolloutConfigResponse"},
|
||||
"voice_noise_suppression": {"$ref": "#/components/schemas/VoiceNoiseSuppressionConfigResponse"},
|
||||
"screen_share_delivery": {"$ref": "#/components/schemas/ScreenShareDeliveryConfigResponse"},
|
||||
"push_service_delivery": {"$ref": "#/components/schemas/PushServiceDeliveryConfigResponse"},
|
||||
"experiment_delivery": {"$ref": "#/components/schemas/ExperimentDeliveryConfigResponse"},
|
||||
"registration": {
|
||||
@@ -10953,7 +10952,6 @@
|
||||
"sso",
|
||||
"gateway_rollout",
|
||||
"voice_noise_suppression",
|
||||
"screen_share_delivery",
|
||||
"push_service_delivery",
|
||||
"experiment_delivery",
|
||||
"registration",
|
||||
@@ -11089,10 +11087,6 @@
|
||||
"nullable": true,
|
||||
"allOf": [{"$ref": "#/components/schemas/VoiceNoiseSuppressionConfigUpdateRequest"}]
|
||||
},
|
||||
"screen_share_delivery": {
|
||||
"nullable": true,
|
||||
"allOf": [{"$ref": "#/components/schemas/ScreenShareDeliveryConfigUpdateRequest"}]
|
||||
},
|
||||
"push_service_delivery": {
|
||||
"nullable": true,
|
||||
"allOf": [{"$ref": "#/components/schemas/PushServiceDeliveryConfigUpdateRequest"}]
|
||||
@@ -15208,24 +15202,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ScreenShareDeliveryConfigUpdateRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": {"type": "boolean"},
|
||||
"rollout_basis_points": {"type": "integer", "minimum": 0, "maximum": 10000},
|
||||
"rollout_salt": {"type": "string", "minLength": 1, "maxLength": 64},
|
||||
"included_user_ids": {
|
||||
"maxItems": 1000,
|
||||
"type": "array",
|
||||
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
|
||||
},
|
||||
"excluded_user_ids": {
|
||||
"maxItems": 1000,
|
||||
"type": "array",
|
||||
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
|
||||
}
|
||||
}
|
||||
},
|
||||
"VoiceNoiseSuppressionConfigUpdateRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -15327,36 +15303,6 @@
|
||||
],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"ScreenShareDeliveryConfigResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": {"default": false, "type": "boolean"},
|
||||
"config_version": {"default": 0, "type": "integer", "minimum": 0, "maximum": 9007199254740991},
|
||||
"rollout_basis_points": {"default": 0, "type": "integer", "minimum": 0, "maximum": 10000},
|
||||
"rollout_salt": {"default": "screen-share-delivery-v1", "type": "string", "minLength": 1, "maxLength": 64},
|
||||
"included_user_ids": {
|
||||
"default": [],
|
||||
"maxItems": 1000,
|
||||
"type": "array",
|
||||
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
|
||||
},
|
||||
"excluded_user_ids": {
|
||||
"default": [],
|
||||
"maxItems": 1000,
|
||||
"type": "array",
|
||||
"items": {"type": "string", "pattern": "^\\d{1,20}$"}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"enabled",
|
||||
"config_version",
|
||||
"rollout_basis_points",
|
||||
"rollout_salt",
|
||||
"included_user_ids",
|
||||
"excluded_user_ids"
|
||||
],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"VoiceNoiseSuppressionConfigResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
||||
@@ -23,8 +23,6 @@ pub struct InstanceConfigResponse {
|
||||
#[serde(default)]
|
||||
pub voice_noise_suppression: VoiceNoiseSuppressionConfigResponse,
|
||||
#[serde(default)]
|
||||
pub screen_share_delivery: ScreenShareDeliveryConfigResponse,
|
||||
#[serde(default)]
|
||||
pub push_service_delivery: PushServiceDeliveryConfigResponse,
|
||||
#[serde(default)]
|
||||
pub experiment_delivery: ExperimentDeliveryConfigResponse,
|
||||
@@ -452,7 +450,6 @@ impl VoiceE2eeScope {
|
||||
|
||||
pub const EXPERIMENT_MAX_TARGETED_USERS: usize = 1_000;
|
||||
pub const PUSH_SERVICE_DELIVERY_DEFAULT_SALT: &str = "push-service-delivery-v1";
|
||||
pub const SCREEN_SHARE_DELIVERY_DEFAULT_SALT: &str = "screen-share-delivery-v1";
|
||||
pub const VOICE_NS_MAX_GUILD_OVERRIDES: usize = 200;
|
||||
|
||||
impl NoiseSuppressionBackend {
|
||||
@@ -543,44 +540,6 @@ pub struct VoiceNoiseSuppressionConfigUpdateRequest {
|
||||
pub suppression_strength: Option<u32>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
#[serde(default)]
|
||||
pub struct ScreenShareDeliveryConfigResponse {
|
||||
pub enabled: bool,
|
||||
pub config_version: u64,
|
||||
pub rollout_basis_points: u32,
|
||||
pub rollout_salt: String,
|
||||
pub included_user_ids: Vec<String>,
|
||||
pub excluded_user_ids: Vec<String>,
|
||||
}
|
||||
|
||||
impl Default for ScreenShareDeliveryConfigResponse {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
enabled: false,
|
||||
config_version: 0,
|
||||
rollout_basis_points: 0,
|
||||
rollout_salt: SCREEN_SHARE_DELIVERY_DEFAULT_SALT.to_owned(),
|
||||
included_user_ids: Vec::new(),
|
||||
excluded_user_ids: Vec::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Default, Serialize)]
|
||||
pub struct ScreenShareDeliveryConfigUpdateRequest {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub enabled: Option<bool>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub rollout_basis_points: Option<u32>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub rollout_salt: Option<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub included_user_ids: Option<Vec<String>>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub excluded_user_ids: Option<Vec<String>>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
#[serde(default)]
|
||||
pub struct PushServiceDeliveryConfigResponse {
|
||||
@@ -735,8 +694,6 @@ pub struct InstanceConfigUpdateRequest {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub voice_noise_suppression: Option<VoiceNoiseSuppressionConfigUpdateRequest>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub screen_share_delivery: Option<ScreenShareDeliveryConfigUpdateRequest>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub push_service_delivery: Option<PushServiceDeliveryConfigUpdateRequest>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub experiment_delivery: Option<ExperimentDeliveryConfigUpdateRequest>,
|
||||
@@ -1076,30 +1033,18 @@ mod tests {
|
||||
.expect("admin schema");
|
||||
let noise = serde_json::from_value::<VoiceNoiseSuppressionConfigResponse>(json!({}))
|
||||
.expect("default noise config");
|
||||
let screen_share = serde_json::from_value::<ScreenShareDeliveryConfigResponse>(json!({}))
|
||||
.expect("default screen share config");
|
||||
let delivery = serde_json::from_value::<ExperimentDeliveryConfigResponse>(json!({}))
|
||||
.expect("default delivery config");
|
||||
let noise = serde_json::to_value(noise).expect("serializable noise config");
|
||||
let screen_share =
|
||||
serde_json::to_value(screen_share).expect("serializable screen share config");
|
||||
let delivery = serde_json::to_value(delivery).expect("serializable delivery config");
|
||||
let generated_noise: generated_types::VoiceNoiseSuppressionConfigResponse =
|
||||
serde_json::from_value(noise.clone()).expect("generated noise config contract");
|
||||
let generated_screen_share: generated_types::ScreenShareDeliveryConfigResponse =
|
||||
serde_json::from_value(screen_share.clone())
|
||||
.expect("generated screen share config contract");
|
||||
let generated_delivery: generated_types::ExperimentDeliveryConfigResponse =
|
||||
serde_json::from_value(delivery.clone()).expect("generated delivery config contract");
|
||||
assert_eq!(
|
||||
serde_json::to_value(generated_noise).expect("serializable generated noise config"),
|
||||
noise
|
||||
);
|
||||
assert_eq!(
|
||||
serde_json::to_value(generated_screen_share)
|
||||
.expect("serializable generated screen share config"),
|
||||
screen_share
|
||||
);
|
||||
assert_eq!(
|
||||
serde_json::to_value(generated_delivery)
|
||||
.expect("serializable generated delivery config"),
|
||||
@@ -1107,7 +1052,6 @@ mod tests {
|
||||
);
|
||||
for (name, value) in [
|
||||
("VoiceNoiseSuppressionConfigResponse", noise),
|
||||
("ScreenShareDeliveryConfigResponse", screen_share),
|
||||
("ExperimentDeliveryConfigResponse", delivery),
|
||||
] {
|
||||
for (field, value) in value.as_object().expect("config object") {
|
||||
@@ -1119,29 +1063,6 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn screen_share_delivery_update_preserves_empty_lists_and_omitted_fields() {
|
||||
let update = ScreenShareDeliveryConfigUpdateRequest {
|
||||
included_user_ids: Some(Vec::new()),
|
||||
excluded_user_ids: Some(Vec::new()),
|
||||
..Default::default()
|
||||
};
|
||||
let value = serde_json::to_value(update).expect("serializable update");
|
||||
serde_json::from_value::<generated_types::ScreenShareDeliveryConfigUpdateRequest>(
|
||||
value.clone(),
|
||||
)
|
||||
.expect("generated update contract");
|
||||
assert_eq!(
|
||||
value,
|
||||
json!({"included_user_ids": [], "excluded_user_ids": []})
|
||||
);
|
||||
assert_eq!(
|
||||
serde_json::to_value(ScreenShareDeliveryConfigUpdateRequest::default())
|
||||
.expect("serializable update"),
|
||||
json!({})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn noise_suppression_update_preserves_empty_lists_and_omitted_fields() {
|
||||
let update = VoiceNoiseSuppressionConfigUpdateRequest {
|
||||
|
||||
@@ -19,9 +19,8 @@ use crate::{
|
||||
InstanceServicesUpdateRequest, InstanceYoutubeIntegrationUpdateRequest,
|
||||
LimitConfigUpdateRequest, LimitRule, LimitRuleFilters, NoiseSuppressionBackend,
|
||||
PremiumMode, PushServiceDeliveryConfigUpdateRequest, RegistrationMode,
|
||||
ScreenShareDeliveryConfigUpdateRequest, SsoConfigUpdateRequest,
|
||||
VOICE_NS_MAX_GUILD_OVERRIDES, VoiceE2eeScope, VoiceNoiseSuppressionConfigUpdateRequest,
|
||||
VoiceNoiseSuppressionGuildOverride,
|
||||
SsoConfigUpdateRequest, VOICE_NS_MAX_GUILD_OVERRIDES, VoiceE2eeScope,
|
||||
VoiceNoiseSuppressionConfigUpdateRequest, VoiceNoiseSuppressionGuildOverride,
|
||||
},
|
||||
},
|
||||
config::AdminConfig,
|
||||
@@ -208,10 +207,6 @@ pub async fn instance_config_post(
|
||||
Ok(update) => instance_config_result(client.update_instance_config(&update).await),
|
||||
Err(message) => FlashData::error(message),
|
||||
},
|
||||
"update_screen_share_delivery" => match build_screen_share_delivery_update(&form) {
|
||||
Ok(update) => instance_config_result(client.update_instance_config(&update).await),
|
||||
Err(message) => FlashData::error(message),
|
||||
},
|
||||
"update_push_service_delivery" => match build_push_service_delivery_update(&form) {
|
||||
Ok(update) => instance_config_result(client.update_instance_config(&update).await),
|
||||
Err(message) => FlashData::error(message),
|
||||
@@ -653,38 +648,6 @@ fn build_voice_noise_suppression_update(
|
||||
})
|
||||
}
|
||||
|
||||
fn build_screen_share_delivery_update(
|
||||
form: &MultiValueForm,
|
||||
) -> Result<InstanceConfigUpdateRequest, String> {
|
||||
Ok(InstanceConfigUpdateRequest {
|
||||
screen_share_delivery: Some(ScreenShareDeliveryConfigUpdateRequest {
|
||||
enabled: Some(form.bool_value("screen_share_delivery_enabled")),
|
||||
rollout_basis_points: parse_form_number(
|
||||
form,
|
||||
"screen_share_delivery_rollout_basis_points",
|
||||
"Rollout basis points",
|
||||
0,
|
||||
EXPERIMENT_ROLLOUT_BASIS_POINTS_MAX,
|
||||
)?,
|
||||
rollout_salt: parse_experiment_rollout_salt(
|
||||
form,
|
||||
"screen_share_delivery_rollout_salt",
|
||||
)?,
|
||||
included_user_ids: Some(parse_experiment_user_ids(
|
||||
form.first("screen_share_delivery_included_user_ids")
|
||||
.unwrap_or_default(),
|
||||
"Included user IDs",
|
||||
)?),
|
||||
excluded_user_ids: Some(parse_experiment_user_ids(
|
||||
form.first("screen_share_delivery_excluded_user_ids")
|
||||
.unwrap_or_default(),
|
||||
"Excluded user IDs",
|
||||
)?),
|
||||
}),
|
||||
..Default::default()
|
||||
})
|
||||
}
|
||||
|
||||
fn build_push_service_delivery_update(
|
||||
form: &MultiValueForm,
|
||||
) -> Result<InstanceConfigUpdateRequest, String> {
|
||||
@@ -1638,83 +1601,6 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn build_screen_share_delivery_update_reads_the_rollout_fields() {
|
||||
let form = MultiValueForm::parse(
|
||||
b"screen_share_delivery_enabled=true&screen_share_delivery_rollout_basis_points=%20250%20&screen_share_delivery_rollout_salt=%20screen-share-delivery-v2%20&screen_share_delivery_included_user_ids=1500000000000000001%0A1500000000000000002&screen_share_delivery_excluded_user_ids=1500000000000000003%2C%201500000000000000004",
|
||||
);
|
||||
let update = build_screen_share_delivery_update(&form)
|
||||
.expect("valid form")
|
||||
.screen_share_delivery
|
||||
.expect("screen share delivery update");
|
||||
assert_eq!(update.enabled, Some(true));
|
||||
assert_eq!(update.rollout_basis_points, Some(250));
|
||||
assert_eq!(
|
||||
update.rollout_salt,
|
||||
Some("screen-share-delivery-v2".to_owned())
|
||||
);
|
||||
assert_eq!(
|
||||
update.included_user_ids,
|
||||
Some(vec![
|
||||
"1500000000000000001".to_owned(),
|
||||
"1500000000000000002".to_owned()
|
||||
])
|
||||
);
|
||||
assert_eq!(
|
||||
update.excluded_user_ids,
|
||||
Some(vec![
|
||||
"1500000000000000003".to_owned(),
|
||||
"1500000000000000004".to_owned()
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn build_screen_share_delivery_update_leaves_the_feature_inert_when_nothing_is_submitted() {
|
||||
let form = MultiValueForm::parse(b"_csrf=token");
|
||||
let request = build_screen_share_delivery_update(&form).expect("valid form");
|
||||
assert_eq!(
|
||||
serde_json::to_value(request).expect("serializable update"),
|
||||
serde_json::json!({"screen_share_delivery": {
|
||||
"enabled": false,
|
||||
"included_user_ids": [],
|
||||
"excluded_user_ids": [],
|
||||
}})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn build_screen_share_delivery_update_rejects_invalid_rollout_fields() {
|
||||
for (form, message) in [
|
||||
(
|
||||
"screen_share_delivery_rollout_basis_points=10001",
|
||||
"Rollout basis points must be a whole number between 0 and 10000",
|
||||
),
|
||||
(
|
||||
"screen_share_delivery_rollout_basis_points=abc",
|
||||
"Rollout basis points must be a whole number between 0 and 10000",
|
||||
),
|
||||
(
|
||||
"screen_share_delivery_rollout_salt=%20%20",
|
||||
"Rollout salt must be between 1 and 64 characters",
|
||||
),
|
||||
(
|
||||
"screen_share_delivery_included_user_ids=123%2Cinvalid",
|
||||
"Included user IDs entry 2 must contain 1 to 20 decimal digits",
|
||||
),
|
||||
(
|
||||
"screen_share_delivery_excluded_user_ids=123%2Cinvalid",
|
||||
"Excluded user IDs entry 2 must contain 1 to 20 decimal digits",
|
||||
),
|
||||
] {
|
||||
let form = MultiValueForm::parse(form.as_bytes());
|
||||
assert_eq!(
|
||||
build_screen_share_delivery_update(&form).expect_err("invalid rollout field"),
|
||||
message
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn build_experiment_delivery_update_leaves_both_fields_unchanged_when_absent() {
|
||||
let form = MultiValueForm::parse(b"_csrf=token");
|
||||
|
||||
@@ -7,8 +7,7 @@ use crate::{
|
||||
InstanceMediaResponse, InstancePolicyResponse, InstanceRegistrationResponse,
|
||||
LimitConfigResponse, NoiseSuppressionBackend, PUSH_SERVICE_DELIVERY_DEFAULT_SALT,
|
||||
PendingRegistrationResponse, PushServiceDeliveryConfigResponse, RegistrationUrlResponse,
|
||||
SCREEN_SHARE_DELIVERY_DEFAULT_SALT, ScreenShareDeliveryConfigResponse, SsoConfigResponse,
|
||||
VOICE_NS_MAX_GUILD_OVERRIDES, VoiceNoiseSuppressionConfigResponse,
|
||||
SsoConfigResponse, VOICE_NS_MAX_GUILD_OVERRIDES, VoiceNoiseSuppressionConfigResponse,
|
||||
},
|
||||
config::AdminConfig,
|
||||
middleware::auth::AuthContext,
|
||||
@@ -149,7 +148,6 @@ pub fn instance_config_page(
|
||||
html! {
|
||||
(gateway_rollout_section(base, csrf_token, &instance_config.gateway_rollout))
|
||||
(voice_noise_suppression_section(base, csrf_token, &instance_config.voice_noise_suppression))
|
||||
(screen_share_delivery_section(base, csrf_token, &instance_config.screen_share_delivery))
|
||||
(push_service_delivery_section(base, csrf_token, &instance_config.push_service_delivery))
|
||||
(experiment_delivery_section(base, csrf_token, &instance_config.experiment_delivery))
|
||||
@if let Some(limit_config) = limit_config {
|
||||
@@ -1179,117 +1177,6 @@ fn voice_noise_suppression_section(
|
||||
)
|
||||
}
|
||||
|
||||
fn screen_share_delivery_section(
|
||||
base: &str,
|
||||
csrf_token: &str,
|
||||
screen_share_delivery: &ScreenShareDeliveryConfigResponse,
|
||||
) -> Markup {
|
||||
let status = if screen_share_delivery.enabled {
|
||||
("Live", BadgeVariant::Success)
|
||||
} else {
|
||||
("Inert", BadgeVariant::Default)
|
||||
};
|
||||
let included_user_ids = screen_share_delivery.included_user_ids.join("\n");
|
||||
let excluded_user_ids = screen_share_delivery.excluded_user_ids.join("\n");
|
||||
section_card_with_description(
|
||||
"Screen Share Delivery",
|
||||
"Pick how many clients publish screen shares through the reworked delivery path. While \
|
||||
the master switch below is off nothing on this form reaches any client: every user \
|
||||
keeps the screen share pipeline they have today, whatever the rest of these fields say. \
|
||||
A client that is already sharing keeps the path it started on until the share ends.",
|
||||
html! {
|
||||
form method="post" action={(base) "/instance-config?action=update_screen_share_delivery"} {
|
||||
(csrf_input(csrf_token))
|
||||
div class="space-y-6" {
|
||||
div class="flex flex-wrap items-center gap-2" {
|
||||
h3 class="text-sm font-semibold text-neutral-900" { "Master switch" }
|
||||
(badge(status.0, status.1))
|
||||
span class="text-xs text-neutral-500" {
|
||||
"Config version " (screen_share_delivery.config_version)
|
||||
}
|
||||
}
|
||||
(checkbox(
|
||||
"screen_share_delivery_enabled",
|
||||
"true",
|
||||
"Serve screen share delivery assignments to clients",
|
||||
screen_share_delivery.enabled,
|
||||
true,
|
||||
))
|
||||
p class="text-xs text-neutral-500" {
|
||||
"Off is the safe state. With this unchecked every client is told the \
|
||||
feature is inert and keeps its current behavior, so the rollout and \
|
||||
targeting fields below have no effect at all."
|
||||
}
|
||||
|
||||
h3 class="text-sm font-semibold text-neutral-900" { "Rollout" }
|
||||
(number_field(
|
||||
"screen_share_delivery_rollout_basis_points",
|
||||
"Rollout (basis points)",
|
||||
&screen_share_delivery.rollout_basis_points.to_string(),
|
||||
Some(0), Some(10000), "1",
|
||||
Some("Share of users bucketed into the canary, in basis points: 0 is nobody, 100 is 1%, 10000 is everybody."),
|
||||
))
|
||||
div class="flex flex-col gap-2" {
|
||||
(text_input(
|
||||
"screen_share_delivery_rollout_salt",
|
||||
"Rollout Salt",
|
||||
&screen_share_delivery.rollout_salt,
|
||||
SCREEN_SHARE_DELIVERY_DEFAULT_SALT,
|
||||
))
|
||||
p class="text-xs text-neutral-500" {
|
||||
"Seeds the bucketing hash. Changing it reshuffles which users fall \
|
||||
inside the percentage above. Leave it alone to keep the current \
|
||||
cohort stable."
|
||||
}
|
||||
}
|
||||
div class="flex flex-col gap-2" {
|
||||
(textarea_input(
|
||||
"screen_share_delivery_included_user_ids",
|
||||
"Always-on User IDs",
|
||||
"1500000000000000001\n1500000000000000002",
|
||||
&included_user_ids,
|
||||
4,
|
||||
false,
|
||||
))
|
||||
(entry_count_hint(
|
||||
screen_share_delivery.included_user_ids.len(),
|
||||
EXPERIMENT_MAX_TARGETED_USERS,
|
||||
))
|
||||
p class="text-xs text-neutral-500" {
|
||||
"One snowflake per line, or comma separated. These users are targeted \
|
||||
regardless of the percentage above. IDs must contain 1 to 20 decimal \
|
||||
digits. Invalid entries prevent the save. Blank entries and duplicate \
|
||||
IDs are ignored."
|
||||
}
|
||||
}
|
||||
div class="flex flex-col gap-2" {
|
||||
(textarea_input(
|
||||
"screen_share_delivery_excluded_user_ids",
|
||||
"Never-on User IDs",
|
||||
"1500000000000000003\n1500000000000000004",
|
||||
&excluded_user_ids,
|
||||
4,
|
||||
false,
|
||||
))
|
||||
(entry_count_hint(
|
||||
screen_share_delivery.excluded_user_ids.len(),
|
||||
EXPERIMENT_MAX_TARGETED_USERS,
|
||||
))
|
||||
p class="text-xs text-neutral-500" {
|
||||
"Same format. Exclusion wins over both the always-on list and the \
|
||||
percentage. This is the per-user kill switch."
|
||||
}
|
||||
}
|
||||
|
||||
(form_actions(html! {
|
||||
(submit_button("Save Screen Share Delivery Configuration"))
|
||||
}))
|
||||
}
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
fn push_service_delivery_section(
|
||||
base: &str,
|
||||
csrf_token: &str,
|
||||
@@ -2042,25 +1929,6 @@ mod tests {
|
||||
assert!(!markup.contains("at the cap"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn screen_share_delivery_section_shows_list_counts_and_the_master_switch() {
|
||||
let screen_share_delivery = ScreenShareDeliveryConfigResponse {
|
||||
included_user_ids: vec!["1500000000000000001".to_owned()],
|
||||
excluded_user_ids: vec![
|
||||
"1500000000000000002".to_owned(),
|
||||
"1500000000000000003".to_owned(),
|
||||
],
|
||||
..ScreenShareDeliveryConfigResponse::default()
|
||||
};
|
||||
let markup =
|
||||
screen_share_delivery_section("/admin", "csrf", &screen_share_delivery).into_string();
|
||||
assert!(markup.contains("action=update_screen_share_delivery"));
|
||||
assert!(markup.contains("screen_share_delivery_enabled"));
|
||||
assert!(markup.contains("1 of 1000 stored"));
|
||||
assert!(markup.contains("2 of 1000 stored"));
|
||||
assert!(!markup.contains("at the cap"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn voice_noise_suppression_section_flags_a_list_at_its_cap() {
|
||||
let voice_noise_suppression = VoiceNoiseSuppressionConfigResponse {
|
||||
|
||||
@@ -409,15 +409,6 @@ fn deserialize_instance_config_response_with_unknown_keys() {
|
||||
"future_object_knob": {"nested": true},
|
||||
"future_list_knob": ["a", "b"]
|
||||
},
|
||||
"screen_share_delivery": {
|
||||
"enabled": true,
|
||||
"config_version": 2,
|
||||
"rollout_basis_points": 2500,
|
||||
"rollout_salt": "screen-share-delivery-v1",
|
||||
"included_user_ids": ["1500000000000000001"],
|
||||
"future_delivery_knob": 9,
|
||||
"excluded_user_ids": []
|
||||
},
|
||||
"push_service_delivery": {
|
||||
"enabled": true,
|
||||
"config_version": 3,
|
||||
@@ -555,14 +546,6 @@ fn deserialize_instance_config_response_with_unknown_keys() {
|
||||
assert_eq!(resp.voice_noise_suppression.rollout_basis_points, 10000);
|
||||
assert_eq!(*resp.voice_noise_suppression.rollout_salt, "voice-ns-v1");
|
||||
assert_eq!(resp.voice_noise_suppression.enabled_backends.len(), 3);
|
||||
assert!(resp.screen_share_delivery.enabled);
|
||||
assert_eq!(resp.screen_share_delivery.config_version, 2);
|
||||
assert_eq!(resp.screen_share_delivery.rollout_basis_points, 2500);
|
||||
assert_eq!(
|
||||
*resp.screen_share_delivery.rollout_salt,
|
||||
"screen-share-delivery-v1"
|
||||
);
|
||||
assert_eq!(resp.screen_share_delivery.included_user_ids.len(), 1);
|
||||
assert_eq!(resp.experiment_delivery.poll_interval_seconds, 300);
|
||||
assert!(resp.policy.single_community_guild_id.is_none());
|
||||
assert_eq!(resp.policy.services.gif_enabled, Some(true));
|
||||
@@ -573,7 +556,6 @@ fn deserialize_instance_config_response_with_unknown_keys() {
|
||||
.replace("\"future_rollout_knob\": 3,", "")
|
||||
.replace("\"future_presentation_knob\": \"verbose\",", "")
|
||||
.replace("\"future_knob\": 7,", "")
|
||||
.replace("\"future_delivery_knob\": 9,", "")
|
||||
.replace("\"future_object_knob\": {\"nested\": true},", "")
|
||||
.replace("\"future_list_knob\": [\"a\", \"b\"],", "")
|
||||
.replace(
|
||||
|
||||
@@ -465,7 +465,6 @@ async fn mutating_admin_pages_render_usable_csrf_tokens() {
|
||||
"/instance-config?action=update_gateway_rollout",
|
||||
"/instance-config?action=update_sso",
|
||||
"/instance-config?action=update_voice_noise_suppression",
|
||||
"/instance-config?action=update_screen_share_delivery",
|
||||
"/instance-config?action=update_experiment_delivery",
|
||||
][..],
|
||||
),
|
||||
@@ -1200,14 +1199,6 @@ fn instance_config() -> Value {
|
||||
"guild_overrides": [],
|
||||
"suppression_strength": 80
|
||||
},
|
||||
"screen_share_delivery": {
|
||||
"enabled": false,
|
||||
"config_version": 0,
|
||||
"rollout_basis_points": 0,
|
||||
"rollout_salt": "screen-share-delivery-v1",
|
||||
"included_user_ids": [],
|
||||
"excluded_user_ids": []
|
||||
},
|
||||
"experiment_delivery": {
|
||||
"poll_interval_seconds": 300,
|
||||
"poll_jitter_percent": 15
|
||||
|
||||
@@ -36,7 +36,6 @@ import {
|
||||
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
|
||||
import {GatewayRolloutConfigSchema} from '@fluxer/schema/src/domains/admin/GatewayRolloutSchemas';
|
||||
import {PushServiceDeliveryConfigSchema} from '@fluxer/schema/src/domains/admin/PushServiceDeliverySchemas';
|
||||
import {ScreenShareDeliveryConfigSchema} from '@fluxer/schema/src/domains/admin/ScreenShareDeliverySchemas';
|
||||
import {VoiceNoiseSuppressionConfigSchema} from '@fluxer/schema/src/domains/admin/VoiceNoiseSuppressionSchemas';
|
||||
import {UserIdParam} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
|
||||
import {ExperimentDeliveryConfigSchema} from '@fluxer/schema/src/domains/experiment/ExperimentSchemas';
|
||||
@@ -65,7 +64,6 @@ async function buildInstanceConfigResponse(): Promise<InstanceConfigResponse> {
|
||||
ssoConfig,
|
||||
gatewayRollout,
|
||||
voiceNoiseSuppression,
|
||||
screenShareDelivery,
|
||||
pushServiceDelivery,
|
||||
experimentDelivery,
|
||||
registrationConfig,
|
||||
@@ -75,7 +73,6 @@ async function buildInstanceConfigResponse(): Promise<InstanceConfigResponse> {
|
||||
instanceConfigRepository.getSsoConfig(),
|
||||
instanceConfigRepository.getGatewayRolloutConfig(),
|
||||
instanceConfigRepository.getVoiceNoiseSuppressionConfig(),
|
||||
instanceConfigRepository.getScreenShareDeliveryConfig(),
|
||||
instanceConfigRepository.getPushServiceDeliveryConfig(),
|
||||
instanceConfigRepository.getExperimentDeliveryConfig(),
|
||||
instanceConfigRepository.getRegistrationConfig(),
|
||||
@@ -108,7 +105,6 @@ async function buildInstanceConfigResponse(): Promise<InstanceConfigResponse> {
|
||||
},
|
||||
gateway_rollout: gatewayRollout,
|
||||
voice_noise_suppression: voiceNoiseSuppression,
|
||||
screen_share_delivery: screenShareDelivery,
|
||||
push_service_delivery: pushServiceDelivery,
|
||||
experiment_delivery: experimentDelivery,
|
||||
registration: {
|
||||
@@ -273,18 +269,6 @@ export function InstanceConfigAdminController(app: HonoApp) {
|
||||
);
|
||||
}
|
||||
}
|
||||
if (data.screen_share_delivery) {
|
||||
const patch = omitUndefinedFields(data.screen_share_delivery);
|
||||
if (Object.keys(patch).length > 0) {
|
||||
await instanceConfigRepository.updateScreenShareDeliveryConfig((current) =>
|
||||
ScreenShareDeliveryConfigSchema.parse({
|
||||
...current,
|
||||
...patch,
|
||||
config_version: current.config_version + 1,
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
if (data.push_service_delivery) {
|
||||
const patch = omitUndefinedFields(data.push_service_delivery);
|
||||
if (Object.keys(patch).length > 0) {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"auth.unknown_location": "Ubicación desconocida",
|
||||
"billing.donation_description_monthly": "Donación mensual para apoyar a {product_name}",
|
||||
"billing.donation_description_one_time": "Donación única para apoyar a {product_name}",
|
||||
"billing.donation_description_yearly": "Donación anual para apoyar a {product_name}",
|
||||
"billing.donation_name_one_time": "Donación a {product_name}",
|
||||
"billing.donation_name_recurring": "Donación recurrente a {product_name}",
|
||||
"billing.eu_withdrawal_waiver_checkout": "Si soy un consumidor de la UE/EEE, doy mi consentimiento expreso para que el contenido digital de {product_name} {premium_tier_name} se proporcione de inmediato y reconozco que pierdo mi derecho legal de desistimiento una vez que se otorgue el acceso. Esto no afecta otros derechos de consumo obligatorios. Consulta los [Términos de servicio]({terms_url}).",
|
||||
"bulk_message_deletion.complete": "Terminamos de eliminar tus mensajes. Eliminamos {message_count, plural, =0 {0 mensajes} one {# mensaje} other {# mensajes}} de {channel_count, plural, =0 {0 lugares} one {# lugar} other {# lugares}}.",
|
||||
"content.virus_detected": "Ese archivo fue marcado como potencialmente inseguro y se ha eliminado.",
|
||||
"guild.bulk_create.emoji_limit": "Se alcanzó el límite máximo de emojis ({limit}).",
|
||||
"guild.bulk_create.sticker_limit": "Se alcanzó el límite máximo de stickers ({limit}).",
|
||||
"guild.bulk_create.unknown_error": "Error desconocido.",
|
||||
"guild.default_category_text": "Canales de texto",
|
||||
"guild.default_category_voice": "Canales de voz",
|
||||
"guild.default_channel_text": "general",
|
||||
"guild.default_channel_voice": "General"
|
||||
"auth.unknown_location": "Ubicación desconocida",
|
||||
"billing.donation_description_monthly": "Donación mensual para apoyar a {product_name}",
|
||||
"billing.donation_description_one_time": "Donación única para apoyar a {product_name}",
|
||||
"billing.donation_description_yearly": "Donación anual para apoyar a {product_name}",
|
||||
"billing.donation_name_one_time": "Donación a {product_name}",
|
||||
"billing.donation_name_recurring": "Donación recurrente a {product_name}",
|
||||
"billing.eu_withdrawal_waiver_checkout": "Si soy un consumidor de la UE/EEE, doy mi consentimiento expreso para que el contenido digital de {product_name} {premium_tier_name} se proporcione de inmediato y reconozco que pierdo mi derecho legal de desistimiento una vez que se otorgue el acceso. Esto no afecta otros derechos de consumo obligatorios. Consulta los [Términos de servicio]({terms_url}).",
|
||||
"bulk_message_deletion.complete": "Terminamos de eliminar tus mensajes. Eliminamos {message_count, plural, =0 {0 mensajes} one {# mensaje} other {# mensajes}} de {channel_count, plural, =0 {0 lugares} one {# lugar} other {# lugares}}.",
|
||||
"content.virus_detected": "Ese archivo fue marcado como potencialmente inseguro y se ha eliminado.",
|
||||
"guild.bulk_create.emoji_limit": "Se alcanzó el límite máximo de emojis ({limit}).",
|
||||
"guild.bulk_create.sticker_limit": "Se alcanzó el límite máximo de stickers ({limit}).",
|
||||
"guild.bulk_create.unknown_error": "Error desconocido.",
|
||||
"guild.default_category_text": "Canales de texto",
|
||||
"guild.default_category_voice": "Canales de voz",
|
||||
"guild.default_channel_text": "general",
|
||||
"guild.default_channel_voice": "General"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import {RateLimitConfigs} from '@app/api/RateLimitConfig';
|
||||
import type {HonoApp} from '@app/api/types/HonoEnv';
|
||||
import {entityTagMatches} from '@app/api/utils/EntityTag';
|
||||
import {Headers as HttpHeaders} from '@fluxer/constants/src/Headers';
|
||||
import {resolveScreenShareDeliveryAssignment} from '@fluxer/schema/src/domains/admin/ScreenShareDeliverySchemas';
|
||||
import {resolveVoiceNoiseSuppressionAssignment} from '@fluxer/schema/src/domains/admin/VoiceNoiseSuppressionSchemas';
|
||||
import {ExperimentAssignmentsResponse} from '@fluxer/schema/src/domains/experiment/ExperimentSchemas';
|
||||
|
||||
@@ -29,10 +28,9 @@ export function ExperimentController(app: HonoApp) {
|
||||
}),
|
||||
async (ctx) => {
|
||||
const instanceConfigRepository = ctx.get('instanceConfigRepository');
|
||||
const [delivery, voiceConfig, screenShareConfig] = await Promise.all([
|
||||
const [delivery, voiceConfig] = await Promise.all([
|
||||
instanceConfigRepository.getExperimentDeliveryConfig(),
|
||||
instanceConfigRepository.getVoiceNoiseSuppressionConfig(),
|
||||
instanceConfigRepository.getScreenShareDeliveryConfig(),
|
||||
]);
|
||||
const userId = ctx.get('user').id.toString();
|
||||
const body: ExperimentAssignmentsResponse = {
|
||||
@@ -40,7 +38,6 @@ export function ExperimentController(app: HonoApp) {
|
||||
poll_jitter_percent: delivery.poll_jitter_percent,
|
||||
assignments: {
|
||||
voice_noise_suppression: resolveVoiceNoiseSuppressionAssignment(voiceConfig, userId),
|
||||
screen_share_delivery: resolveScreenShareDeliveryAssignment(screenShareConfig, userId),
|
||||
},
|
||||
};
|
||||
const etag = `"${createHash('sha256').update(JSON.stringify(body)).digest('hex')}"`;
|
||||
|
||||
@@ -6,10 +6,6 @@ import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHa
|
||||
import {HTTP_STATUS} from '@app/api/test/TestConstants';
|
||||
import {createBuilder, createBuilderWithoutAuth} from '@app/api/test/TestRequestBuilder';
|
||||
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
|
||||
import {
|
||||
DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG,
|
||||
INERT_SCREEN_SHARE_DELIVERY_ASSIGNMENT,
|
||||
} from '@fluxer/schema/src/domains/admin/ScreenShareDeliverySchemas';
|
||||
import {
|
||||
DEFAULT_VOICE_NOISE_SUPPRESSION_CONFIG,
|
||||
INERT_VOICE_NOISE_SUPPRESSION_ASSIGNMENT,
|
||||
@@ -19,7 +15,6 @@ import {
|
||||
DEFAULT_EXPERIMENT_POLL_JITTER_PERCENT,
|
||||
type ExperimentAssignmentsResponse,
|
||||
type ExperimentDeliveryConfigResponse,
|
||||
readScreenShareDeliveryAssignment,
|
||||
readVoiceNoiseSuppressionAssignment,
|
||||
} from '@fluxer/schema/src/domains/experiment/ExperimentSchemas';
|
||||
import {afterAll, beforeAll, beforeEach, describe, expect, it} from 'vitest';
|
||||
@@ -56,7 +51,6 @@ describe('GET /experiments', () => {
|
||||
poll_jitter_percent: DEFAULT_EXPERIMENT_POLL_JITTER_PERCENT,
|
||||
assignments: {
|
||||
voice_noise_suppression: INERT_VOICE_NOISE_SUPPRESSION_ASSIGNMENT,
|
||||
screen_share_delivery: INERT_SCREEN_SHARE_DELIVERY_ASSIGNMENT,
|
||||
},
|
||||
});
|
||||
});
|
||||
@@ -88,52 +82,6 @@ describe('GET /experiments', () => {
|
||||
expect(readVoiceNoiseSuppressionAssignment(body).enabled).toBe(false);
|
||||
});
|
||||
|
||||
it('populates the screen share assignment key even when the rollout is disabled', async () => {
|
||||
const account = await createTestAccount(harness);
|
||||
|
||||
const body = await createBuilder<ExperimentAssignmentsResponse>(harness, account.token).get(ENDPOINT).execute();
|
||||
|
||||
expect(Object.hasOwn(body.assignments, 'screen_share_delivery')).toBe(true);
|
||||
expect(readScreenShareDeliveryAssignment(body).enabled).toBe(false);
|
||||
});
|
||||
|
||||
it('resolves the screen share caller through the allowlist', async () => {
|
||||
const targeted = await createTestAccount(harness);
|
||||
const untargeted = await createTestAccount(harness);
|
||||
await getInstanceConfigRepository().setScreenShareDeliveryConfig({
|
||||
...DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG,
|
||||
enabled: true,
|
||||
config_version: 4,
|
||||
rollout_basis_points: 0,
|
||||
included_user_ids: [targeted.userId],
|
||||
});
|
||||
|
||||
const targetedBody = await createBuilder<ExperimentAssignmentsResponse>(harness, targeted.token)
|
||||
.get(ENDPOINT)
|
||||
.execute();
|
||||
expect(targetedBody.assignments.screen_share_delivery).toEqual({enabled: true});
|
||||
|
||||
const untargetedBody = await createBuilder<ExperimentAssignmentsResponse>(harness, untargeted.token)
|
||||
.get(ENDPOINT)
|
||||
.execute();
|
||||
expect(untargetedBody.assignments.screen_share_delivery).toEqual({enabled: false});
|
||||
});
|
||||
|
||||
it('keeps the screen share exclusion ahead of a full rollout', async () => {
|
||||
const excluded = await createTestAccount(harness);
|
||||
await getInstanceConfigRepository().setScreenShareDeliveryConfig({
|
||||
...DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG,
|
||||
enabled: true,
|
||||
rollout_basis_points: 10000,
|
||||
included_user_ids: [excluded.userId],
|
||||
excluded_user_ids: [excluded.userId],
|
||||
});
|
||||
|
||||
const body = await createBuilder<ExperimentAssignmentsResponse>(harness, excluded.token).get(ENDPOINT).execute();
|
||||
|
||||
expect(body.assignments.screen_share_delivery).toEqual({enabled: false});
|
||||
});
|
||||
|
||||
it('serves the delivery cadence from the delivery config and not from the voice config', async () => {
|
||||
const account = await createTestAccount(harness);
|
||||
await getInstanceConfigRepository().setExperimentDeliveryConfig({
|
||||
@@ -248,30 +196,6 @@ describe('GET /experiments', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('serves a fresh body once the screen share config changes', async () => {
|
||||
const account = await createTestAccount(harness);
|
||||
|
||||
const first = await createBuilder<ExperimentAssignmentsResponse>(harness, account.token)
|
||||
.get(ENDPOINT)
|
||||
.executeWithResponse();
|
||||
const staleEtag = first.response.headers.get('etag') as string;
|
||||
|
||||
await getInstanceConfigRepository().setScreenShareDeliveryConfig({
|
||||
...DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG,
|
||||
enabled: true,
|
||||
config_version: 1,
|
||||
rollout_basis_points: 10000,
|
||||
});
|
||||
|
||||
const refreshed = await createBuilder<ExperimentAssignmentsResponse>(harness, account.token)
|
||||
.get(ENDPOINT)
|
||||
.header('If-None-Match', staleEtag)
|
||||
.executeWithResponse();
|
||||
expect(refreshed.response.status).toBe(HTTP_STATUS.OK);
|
||||
expect(refreshed.response.headers.get('etag')).not.toBe(staleEtag);
|
||||
expect(refreshed.json?.assignments.screen_share_delivery).toEqual({enabled: true});
|
||||
});
|
||||
|
||||
it('serves a fresh body once the delivery config changes', async () => {
|
||||
const account = await createTestAccount(harness);
|
||||
|
||||
@@ -328,44 +252,6 @@ describe('GET /experiments', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('bumps the screen share config version on every admin update without the client sending one', async () => {
|
||||
const admin = await setUserACLs(harness, await createTestAccount(harness), [
|
||||
AdminACLs.AUTHENTICATE,
|
||||
AdminACLs.INSTANCE_CONFIG_VIEW,
|
||||
AdminACLs.INSTANCE_CONFIG_UPDATE,
|
||||
]);
|
||||
|
||||
const afterFirst = await createBuilder<{screen_share_delivery: {config_version: number; enabled: boolean}}>(
|
||||
harness,
|
||||
admin.token,
|
||||
)
|
||||
.patch('/admin/instance/config')
|
||||
.body({screen_share_delivery: {enabled: true, rollout_basis_points: 10000}})
|
||||
.execute();
|
||||
expect(afterFirst.screen_share_delivery).toMatchObject({config_version: 1, enabled: true});
|
||||
|
||||
const afterSecond = await createBuilder<{screen_share_delivery: {config_version: number; enabled: boolean}}>(
|
||||
harness,
|
||||
admin.token,
|
||||
)
|
||||
.patch('/admin/instance/config')
|
||||
.body({screen_share_delivery: {rollout_salt: 'screen-share-delivery-v2'}})
|
||||
.execute();
|
||||
expect(afterSecond.screen_share_delivery).toMatchObject({config_version: 2, enabled: true});
|
||||
|
||||
const afterEmpty = await createBuilder<{screen_share_delivery: {config_version: number; enabled: boolean}}>(
|
||||
harness,
|
||||
admin.token,
|
||||
)
|
||||
.patch('/admin/instance/config')
|
||||
.body({screen_share_delivery: {}})
|
||||
.execute();
|
||||
expect(afterEmpty.screen_share_delivery).toMatchObject({config_version: 2, enabled: true});
|
||||
|
||||
const body = await createBuilder<ExperimentAssignmentsResponse>(harness, admin.token).get(ENDPOINT).execute();
|
||||
expect(body.assignments.screen_share_delivery).toEqual({enabled: true});
|
||||
});
|
||||
|
||||
it('leaves the config version alone for an admin update that sets no field', async () => {
|
||||
const admin = await setUserACLs(harness, await createTestAccount(harness), [
|
||||
AdminACLs.AUTHENTICATE,
|
||||
|
||||
@@ -84,6 +84,41 @@ describe('stripNonJpegImageMetadataForUpload', () => {
|
||||
});
|
||||
});
|
||||
|
||||
function riffChunk(type: string, data: Uint8Array): Uint8Array {
|
||||
const out = new Uint8Array(8 + data.length + (data.length & 1));
|
||||
out.set(textBytes(type), 0);
|
||||
new DataView(out.buffer).setUint32(4, data.length, true);
|
||||
out.set(data, 8);
|
||||
return out;
|
||||
}
|
||||
|
||||
function webp(chunks: ReadonlyArray<Uint8Array>): Uint8Array {
|
||||
const body = concatBytes(chunks);
|
||||
const header = concatBytes([textBytes('RIFF'), new Uint8Array(4), textBytes('WEBP')]);
|
||||
new DataView(header.buffer).setUint32(4, 4 + body.length, true);
|
||||
return concatBytes([header, body]);
|
||||
}
|
||||
|
||||
describe('stripNonJpegImageMetadataForUpload for WebP', () => {
|
||||
it('drops EXIF and XMP chunks without re-encoding frames', async () => {
|
||||
const vp8x = new Uint8Array(10);
|
||||
vp8x[0] = 0x02 | 0x08 | 0x04;
|
||||
const anmf = riffChunk('ANMF', new Uint8Array([9, 8, 7]));
|
||||
const input = webp([
|
||||
riffChunk('VP8X', vp8x),
|
||||
riffChunk('ANIM', new Uint8Array(6)),
|
||||
anmf,
|
||||
riffChunk('EXIF', textBytes('GPS=1,2')),
|
||||
riffChunk('XMP ', textBytes('private metadata')),
|
||||
]);
|
||||
const stripped = await stripNonJpegImageMetadataForUpload(input, 'image/webp');
|
||||
const expectedVp8x = new Uint8Array(10);
|
||||
expectedVp8x[0] = 0x02;
|
||||
expect(stripped.contentType).toBe('image/webp');
|
||||
expect(stripped.body).toEqual(webp([riffChunk('VP8X', expectedVp8x), riffChunk('ANIM', new Uint8Array(6)), anmf]));
|
||||
});
|
||||
});
|
||||
|
||||
describe('buildProcessedMediaObject', () => {
|
||||
it('leaves non-media objects for plain copy', async () => {
|
||||
await expect(buildProcessedMediaObject(textBytes('plain text'), 'text/plain')).resolves.toBeNull();
|
||||
|
||||
@@ -162,6 +162,8 @@ export async function stripNonJpegImageMetadataForUpload(
|
||||
contentType: normalizedContentType === 'image/apng' ? 'image/apng' : 'image/png',
|
||||
};
|
||||
}
|
||||
const strippedWebp = isWebp(data) ? stripWebpMetadataChunks(data) : null;
|
||||
if (strippedWebp) return {body: strippedWebp, contentType: 'image/webp'};
|
||||
const image = sharp(data, {animated: true});
|
||||
const metadata = await image.metadata();
|
||||
switch (metadata.format) {
|
||||
@@ -242,6 +244,50 @@ function stripPngMetadataChunks(data: Uint8Array): Uint8Array {
|
||||
return output;
|
||||
}
|
||||
|
||||
const WEBP_CHUNKS_TO_KEEP = new Set(['VP8 ', 'VP8L', 'VP8X', 'ALPH', 'ANIM', 'ANMF', 'ICCP']);
|
||||
const WEBP_VP8X_EXIF_FLAG = 0x08;
|
||||
const WEBP_VP8X_XMP_FLAG = 0x04;
|
||||
|
||||
function readFourCc(data: Uint8Array, offset: number): string {
|
||||
return String.fromCharCode(data[offset]!, data[offset + 1]!, data[offset + 2]!, data[offset + 3]!);
|
||||
}
|
||||
|
||||
function readU32LE(data: Uint8Array, offset: number): number {
|
||||
return (data[offset]! | (data[offset + 1]! << 8) | (data[offset + 2]! << 16) | (data[offset + 3]! << 24)) >>> 0;
|
||||
}
|
||||
|
||||
function isWebp(data: Uint8Array): boolean {
|
||||
return data.length >= 12 && readFourCc(data, 0) === 'RIFF' && readFourCc(data, 8) === 'WEBP';
|
||||
}
|
||||
|
||||
function stripWebpMetadataChunks(data: Uint8Array): Uint8Array | null {
|
||||
const riffEnd = Math.min(data.length, 8 + readU32LE(data, 4));
|
||||
const chunks: Array<Uint8Array> = [];
|
||||
let offset = 12;
|
||||
while (offset + 8 <= riffEnd) {
|
||||
const length = readU32LE(data, offset + 4);
|
||||
const chunkEnd = offset + 8 + length + (length & 1);
|
||||
if (offset + 8 + length > riffEnd) return null;
|
||||
const type = readFourCc(data, offset);
|
||||
if (WEBP_CHUNKS_TO_KEEP.has(type)) {
|
||||
const chunk = data.slice(offset, Math.min(chunkEnd, riffEnd));
|
||||
if (type === 'VP8X' && length > 0) chunk[8] = (chunk[8] ?? 0) & ~(WEBP_VP8X_EXIF_FLAG | WEBP_VP8X_XMP_FLAG);
|
||||
chunks.push(chunk);
|
||||
}
|
||||
offset = chunkEnd;
|
||||
}
|
||||
const bodyLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
||||
const output = new Uint8Array(12 + bodyLength);
|
||||
output.set(data.subarray(0, 12));
|
||||
new DataView(output.buffer).setUint32(4, 4 + bodyLength, true);
|
||||
let cursor = 12;
|
||||
for (const chunk of chunks) {
|
||||
output.set(chunk, cursor);
|
||||
cursor += chunk.length;
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
function imageExtensionForContentType(contentType: string): string {
|
||||
if (contentType.includes('svg')) return 'svg';
|
||||
if (contentType.includes('tiff')) return 'tiff';
|
||||
|
||||
@@ -18,10 +18,6 @@ import {InstanceConfigWriteRaceExecutor} from '@app/api/instance/tests/InstanceC
|
||||
import {startDockerContainer} from '@app/api/test/DockerTestContainer';
|
||||
import {InMemoryCassandraQueryExecutor} from '@app/api/test/InMemoryCassandraQueryExecutor';
|
||||
import {MockKVProvider} from '@app/api/test/mocks/MockKVProvider';
|
||||
import {
|
||||
DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG,
|
||||
type ScreenShareDeliveryConfig,
|
||||
} from '@fluxer/schema/src/domains/admin/ScreenShareDeliverySchemas';
|
||||
import {
|
||||
DEFAULT_VOICE_NOISE_SUPPRESSION_CONFIG,
|
||||
type VoiceNoiseSuppressionConfig,
|
||||
@@ -39,7 +35,6 @@ import {
|
||||
import {afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi} from 'vitest';
|
||||
|
||||
const VOICE_NOISE_SUPPRESSION_CONFIG_KEY = 'voice_noise_suppression_config';
|
||||
const SCREEN_SHARE_DELIVERY_CONFIG_KEY = 'screen_share_delivery_config';
|
||||
const EXPERIMENT_DELIVERY_CONFIG_KEY = 'experiment_delivery_config';
|
||||
const APP_PUBLIC_CONFIG_KEY = 'app_public_config';
|
||||
const INSTANCE_POLICY_CONFIG_KEY = 'instance_policy_config';
|
||||
@@ -356,70 +351,6 @@ describe('InstanceConfigRepository', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('returns the default screen share delivery config when the key is absent', async () => {
|
||||
const executor = new CountingInMemoryCassandraQueryExecutor();
|
||||
setCassandraQueryExecutorForTesting(executor);
|
||||
const kvProvider = new MockKVProvider();
|
||||
const repository = createRepository(kvProvider);
|
||||
|
||||
await expect(repository.getScreenShareDeliveryConfig()).resolves.toEqual(DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG);
|
||||
});
|
||||
|
||||
it.each([
|
||||
{name: 'unparseable text', stored: 'not-json'},
|
||||
{name: 'a json array', stored: '[]'},
|
||||
{name: 'out-of-range values', stored: '{"rollout_basis_points":99999}'},
|
||||
{name: 'a non-boolean enabled flag', stored: '{"enabled":"yes"}'},
|
||||
])('falls back to the default screen share delivery config for $name', async ({stored}) => {
|
||||
const executor = new CountingInMemoryCassandraQueryExecutor();
|
||||
setCassandraQueryExecutorForTesting(executor);
|
||||
const kvProvider = new MockKVProvider();
|
||||
const repository = createRepository(kvProvider);
|
||||
|
||||
await repository.setConfig(SCREEN_SHARE_DELIVERY_CONFIG_KEY, stored);
|
||||
|
||||
await expect(repository.getScreenShareDeliveryConfig()).resolves.toEqual(DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG);
|
||||
});
|
||||
|
||||
it('round-trips a stored screen share delivery config', async () => {
|
||||
const executor = new CountingInMemoryCassandraQueryExecutor();
|
||||
setCassandraQueryExecutorForTesting(executor);
|
||||
const kvProvider = new MockKVProvider();
|
||||
const repository = createRepository(kvProvider);
|
||||
|
||||
const config: ScreenShareDeliveryConfig = {
|
||||
...DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG,
|
||||
enabled: true,
|
||||
config_version: 5,
|
||||
rollout_basis_points: 2500,
|
||||
rollout_salt: 'screen-share-delivery-v2',
|
||||
included_user_ids: ['1400000000000000001'],
|
||||
excluded_user_ids: ['1400000000000000002'],
|
||||
};
|
||||
await repository.setScreenShareDeliveryConfig(config);
|
||||
|
||||
await expect(repository.getScreenShareDeliveryConfig()).resolves.toEqual(config);
|
||||
});
|
||||
|
||||
it('fills newly added screen share delivery fields from the schema defaults', async () => {
|
||||
const executor = new CountingInMemoryCassandraQueryExecutor();
|
||||
setCassandraQueryExecutorForTesting(executor);
|
||||
const kvProvider = new MockKVProvider();
|
||||
const repository = createRepository(kvProvider);
|
||||
|
||||
await repository.setConfig(
|
||||
SCREEN_SHARE_DELIVERY_CONFIG_KEY,
|
||||
JSON.stringify({enabled: true, config_version: 2, rollout_basis_points: 1000}),
|
||||
);
|
||||
|
||||
await expect(repository.getScreenShareDeliveryConfig()).resolves.toEqual({
|
||||
...DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG,
|
||||
enabled: true,
|
||||
config_version: 2,
|
||||
rollout_basis_points: 1000,
|
||||
});
|
||||
});
|
||||
|
||||
it('returns the default experiment delivery config when the key is absent', async () => {
|
||||
const executor = new CountingInMemoryCassandraQueryExecutor();
|
||||
setCassandraQueryExecutorForTesting(executor);
|
||||
@@ -492,26 +423,6 @@ describe('InstanceConfigRepository', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('publishes a refresh so another repository observes the screen share delivery config', async () => {
|
||||
const executor = new CountingInMemoryCassandraQueryExecutor();
|
||||
setCassandraQueryExecutorForTesting(executor);
|
||||
const kvProvider = new MockKVProvider();
|
||||
const reader = createRepository(kvProvider);
|
||||
const writer = createRepository(kvProvider);
|
||||
|
||||
await expect(reader.getScreenShareDeliveryConfig()).resolves.toEqual(DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG);
|
||||
|
||||
await writer.setScreenShareDeliveryConfig({
|
||||
...DEFAULT_SCREEN_SHARE_DELIVERY_CONFIG,
|
||||
enabled: true,
|
||||
config_version: 1,
|
||||
});
|
||||
|
||||
await vi.waitFor(async () => {
|
||||
expect(await reader.getScreenShareDeliveryConfig()).toMatchObject({enabled: true, config_version: 1});
|
||||
});
|
||||
});
|
||||
|
||||
it('uses the registration URL id as the admin-visible registration code', async () => {
|
||||
const executor = new CountingInMemoryCassandraQueryExecutor();
|
||||
setCassandraQueryExecutorForTesting(executor);
|
||||
|
||||
@@ -36,10 +36,6 @@ import {
|
||||
type PushServiceDeliveryConfig,
|
||||
PushServiceDeliveryConfigSchema,
|
||||
} from '@fluxer/schema/src/domains/admin/PushServiceDeliverySchemas';
|
||||
import {
|
||||
type ScreenShareDeliveryConfig,
|
||||
ScreenShareDeliveryConfigSchema,
|
||||
} from '@fluxer/schema/src/domains/admin/ScreenShareDeliverySchemas';
|
||||
import {
|
||||
type VoiceNoiseSuppressionConfig,
|
||||
VoiceNoiseSuppressionConfigSchema,
|
||||
@@ -66,7 +62,6 @@ import {z} from 'zod';
|
||||
|
||||
const GATEWAY_ROLLOUT_CONFIG_KEY = 'gateway_rollout_config';
|
||||
const VOICE_NOISE_SUPPRESSION_CONFIG_KEY = 'voice_noise_suppression_config';
|
||||
const SCREEN_SHARE_DELIVERY_CONFIG_KEY = 'screen_share_delivery_config';
|
||||
const PUSH_SERVICE_DELIVERY_CONFIG_KEY = 'push_service_delivery_config';
|
||||
const EXPERIMENT_DELIVERY_CONFIG_KEY = 'experiment_delivery_config';
|
||||
const REGISTRATION_CONFIG_KEY = 'registration_config';
|
||||
@@ -374,7 +369,6 @@ type StoredConfigSection =
|
||||
| 'app public'
|
||||
| 'gateway rollout'
|
||||
| 'voice noise suppression'
|
||||
| 'screen share delivery'
|
||||
| 'push service delivery'
|
||||
| 'experiment delivery'
|
||||
| 'instance policy'
|
||||
@@ -514,10 +508,6 @@ function parseStoredVoiceNoiseSuppressionConfig(raw: string | null): VoiceNoiseS
|
||||
return parseStoredConfigOrDefault(VoiceNoiseSuppressionConfigSchema, raw, 'voice noise suppression');
|
||||
}
|
||||
|
||||
function parseStoredScreenShareDeliveryConfig(raw: string | null): ScreenShareDeliveryConfig {
|
||||
return parseStoredConfigOrDefault(ScreenShareDeliveryConfigSchema, raw, 'screen share delivery');
|
||||
}
|
||||
|
||||
function parseStoredPushServiceDeliveryConfig(raw: string | null): PushServiceDeliveryConfig {
|
||||
return parseStoredConfigOrDefault(PushServiceDeliveryConfigSchema, raw, 'push service delivery');
|
||||
}
|
||||
@@ -1169,7 +1159,6 @@ export class InstanceConfigRepository {
|
||||
parseStoredGatewayRolloutConfig(snapshot.get(GATEWAY_ROLLOUT_CONFIG_KEY) ?? null),
|
||||
);
|
||||
parseStoredVoiceNoiseSuppressionConfig(snapshot.get(VOICE_NOISE_SUPPRESSION_CONFIG_KEY) ?? null);
|
||||
parseStoredScreenShareDeliveryConfig(snapshot.get(SCREEN_SHARE_DELIVERY_CONFIG_KEY) ?? null);
|
||||
parseStoredPushServiceDeliveryConfig(snapshot.get(PUSH_SERVICE_DELIVERY_CONFIG_KEY) ?? null);
|
||||
parseStoredExperimentDeliveryConfig(snapshot.get(EXPERIMENT_DELIVERY_CONFIG_KEY) ?? null);
|
||||
const policy = parseStoredInstancePolicyConfig(snapshot.get(INSTANCE_POLICY_CONFIG_KEY) ?? null);
|
||||
@@ -1267,27 +1256,6 @@ export class InstanceConfigRepository {
|
||||
);
|
||||
}
|
||||
|
||||
async getScreenShareDeliveryConfig(): Promise<ScreenShareDeliveryConfig> {
|
||||
const raw = await this.getConfig(SCREEN_SHARE_DELIVERY_CONFIG_KEY);
|
||||
return parseStoredScreenShareDeliveryConfig(raw);
|
||||
}
|
||||
|
||||
async setScreenShareDeliveryConfig(config: ScreenShareDeliveryConfig): Promise<void> {
|
||||
await this.updateScreenShareDeliveryConfig(() => config);
|
||||
}
|
||||
|
||||
updateScreenShareDeliveryConfig(
|
||||
update: (current: ScreenShareDeliveryConfig) => ScreenShareDeliveryConfig,
|
||||
): Promise<ScreenShareDeliveryConfig> {
|
||||
return this.updateStoredConfig(SCREEN_SHARE_DELIVERY_CONFIG_KEY, (raw) =>
|
||||
validateStoredConfig(
|
||||
ScreenShareDeliveryConfigSchema,
|
||||
update(parseStoredScreenShareDeliveryConfig(raw)),
|
||||
'screen share delivery',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
async getPushServiceDeliveryConfig(): Promise<PushServiceDeliveryConfig> {
|
||||
const raw = await this.getConfig(PUSH_SERVICE_DELIVERY_CONFIG_KEY);
|
||||
return parseStoredPushServiceDeliveryConfig(raw);
|
||||
|
||||
@@ -27190,8 +27190,7 @@
|
||||
"assignments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"voice_noise_suppression": {"$ref": "#/components/schemas/VoiceNoiseSuppressionAssignmentResponse"},
|
||||
"screen_share_delivery": {"$ref": "#/components/schemas/ScreenShareDeliveryAssignmentResponse"}
|
||||
"voice_noise_suppression": {"$ref": "#/components/schemas/VoiceNoiseSuppressionAssignmentResponse"}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
@@ -30695,12 +30694,6 @@
|
||||
"additionalProperties": false
|
||||
},
|
||||
"DonationCurrency": {"type": "string", "enum": ["usd", "eur", "brl", "inr", "pln", "try", "sek", "dkk", "nok"]},
|
||||
"ScreenShareDeliveryAssignmentResponse": {
|
||||
"type": "object",
|
||||
"properties": {"enabled": {"type": "boolean"}},
|
||||
"required": ["enabled"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"VoiceNoiseSuppressionAssignmentResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
||||
@@ -204,9 +204,7 @@ function buildApnsPayload(payload: Record<string, unknown>): Record<string, unkn
|
||||
if (badge !== undefined) {
|
||||
aps.badge = badge;
|
||||
}
|
||||
if (imageUrl) {
|
||||
aps['mutable-content'] = 1;
|
||||
}
|
||||
aps['mutable-content'] = 1;
|
||||
return {
|
||||
...data,
|
||||
title,
|
||||
|
||||
@@ -139,7 +139,7 @@ describe('ApnsPushService', () => {
|
||||
notification: {title: 'Alice', body: 'Hello', icon: 'https://cdn.example/avatar.png'},
|
||||
});
|
||||
expect(payload.image_url).toBeUndefined();
|
||||
expect(payload.aps).not.toHaveProperty('mutable-content');
|
||||
expect(payload.aps).toHaveProperty('mutable-content', 1);
|
||||
expect(payload.author_avatar_url).toBe('https://cdn.example/avatar.png');
|
||||
});
|
||||
it('imports the APNs signing key once per PEM and rejects a truncated one every time', async () => {
|
||||
|
||||
@@ -52,7 +52,6 @@ export interface InternalRoomOptions {
|
||||
|
||||
singlePeerConnection: boolean;
|
||||
subscriberVideoCodecExclusions?: Array<VideoCodec>;
|
||||
screenShareDelivery?: boolean;
|
||||
h264HardwareProfiles?: ReadonlySet<string>;
|
||||
dataStream?: RoomDataStreamOptions;
|
||||
}
|
||||
|
||||
@@ -73,66 +73,34 @@ describe('applyVideoStartBitrate', () => {
|
||||
}
|
||||
|
||||
it('adds a start bitrate to a non-SVC codec section', () => {
|
||||
for (const screenShareDelivery of [false, true]) {
|
||||
const media = videoMedia('camera-track', [
|
||||
{payload: 96, config: 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f'},
|
||||
]);
|
||||
expect(applyVideoStartBitrate(media, 'camera-track', 'H264', 1000, false, screenShareDelivery)).toBe(96);
|
||||
expect(media.fmtp[0]?.config).toBe(
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f;x-google-start-bitrate=900',
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
it('caps camera start bitrates but not screen share start bitrates while screen share delivery is off', () => {
|
||||
const camera = videoMedia('camera-track', [{payload: 96, config: 'profile-level-id=42e01f'}]);
|
||||
applyVideoStartBitrate(camera, 'camera-track', 'H264', 3000);
|
||||
expect(camera.fmtp[0]?.config).toBe('profile-level-id=42e01f;x-google-start-bitrate=1000');
|
||||
|
||||
const screen = videoMedia('screen-track', [{payload: 96, config: 'profile-level-id=42e01f'}]);
|
||||
applyVideoStartBitrate(screen, 'screen-track', 'H264', 6000, true);
|
||||
expect(screen.fmtp[0]?.config).toBe('profile-level-id=42e01f;x-google-start-bitrate=5400');
|
||||
const media = videoMedia('camera-track', [
|
||||
{payload: 96, config: 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f'},
|
||||
]);
|
||||
expect(applyVideoStartBitrate(media, 'camera-track', 'H264', 1000, false)).toBe(96);
|
||||
expect(media.fmtp[0]?.config).toBe(
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f;x-google-start-bitrate=900',
|
||||
);
|
||||
});
|
||||
|
||||
it('caps camera and screen share start bitrates at their own ceilings', () => {
|
||||
const camera = videoMedia('camera-track', [{payload: 96, config: 'profile-level-id=42e01f'}]);
|
||||
applyVideoStartBitrate(camera, 'camera-track', 'H264', 3000, false, true);
|
||||
applyVideoStartBitrate(camera, 'camera-track', 'H264', 3000, false);
|
||||
expect(camera.fmtp[0]?.config).toBe('profile-level-id=42e01f;x-google-start-bitrate=1000');
|
||||
|
||||
const screen = videoMedia('screen-track', [{payload: 96, config: 'profile-level-id=42e01f'}]);
|
||||
applyVideoStartBitrate(screen, 'screen-track', 'H264', 6000, true, true);
|
||||
applyVideoStartBitrate(screen, 'screen-track', 'H264', 6000, true);
|
||||
expect(screen.fmtp[0]?.config).toBe('profile-level-id=42e01f;x-google-start-bitrate=1500');
|
||||
});
|
||||
|
||||
it('leaves a small screen share start bitrate on the floor while screen share delivery is off', () => {
|
||||
const screen = videoMedia('screen-track', [{payload: 96, config: 'profile-level-id=42e01f'}]);
|
||||
applyVideoStartBitrate(screen, 'screen-track', 'H264', 300, true);
|
||||
expect(screen.fmtp[0]?.config).toBe('profile-level-id=42e01f;x-google-start-bitrate=270');
|
||||
});
|
||||
|
||||
it('keeps a screen share start bitrate above the frame dropper cliff', () => {
|
||||
const screen = videoMedia('screen-track', [{payload: 96, config: 'profile-level-id=42e01f'}]);
|
||||
applyVideoStartBitrate(screen, 'screen-track', 'H264', 300, true, true);
|
||||
applyVideoStartBitrate(screen, 'screen-track', 'H264', 300, true);
|
||||
expect(screen.fmtp[0]?.config).toBe('profile-level-id=42e01f;x-google-start-bitrate=600');
|
||||
});
|
||||
|
||||
it('stamps only the lead payload type while screen share delivery is off', () => {
|
||||
const media = multiPayloadScreenMedia();
|
||||
expect(applyVideoStartBitrate(media, 'screen-track', 'H264', 6000, true)).toBe(116);
|
||||
expect(media.fmtp.find((fmtp) => fmtp.payload === 116)?.config).toBe(
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f;x-google-start-bitrate=5400',
|
||||
);
|
||||
expect(media.fmtp.find((fmtp) => fmtp.payload === 102)?.config).toBe(
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f',
|
||||
);
|
||||
expect(media.fmtp.find((fmtp) => fmtp.payload === 108)?.config).toBe(
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f',
|
||||
);
|
||||
});
|
||||
|
||||
it('stamps every payload type the codec is offered under, not only the lead one', () => {
|
||||
const media = multiPayloadScreenMedia();
|
||||
expect(applyVideoStartBitrate(media, 'screen-track', 'H264', 6000, true, true)).toBe(116);
|
||||
expect(applyVideoStartBitrate(media, 'screen-track', 'H264', 6000, true)).toBe(116);
|
||||
for (const fmtp of media.fmtp) {
|
||||
expect(fmtp.config).toContain('x-google-start-bitrate=1500');
|
||||
}
|
||||
@@ -140,47 +108,35 @@ describe('applyVideoStartBitrate', () => {
|
||||
});
|
||||
|
||||
it('only touches the fmtp line for the matching payload', () => {
|
||||
for (const screenShareDelivery of [false, true]) {
|
||||
const media = videoMedia(
|
||||
'screen-track',
|
||||
[
|
||||
{payload: 96, config: 'profile-level-id=42e01f'},
|
||||
{payload: 98, config: 'profile-id=0'},
|
||||
],
|
||||
[
|
||||
{payload: 96, codec: 'H264'},
|
||||
{payload: 98, codec: 'VP9'},
|
||||
],
|
||||
);
|
||||
applyVideoStartBitrate(media, 'screen-track', 'VP9', 1500, true, screenShareDelivery);
|
||||
expect(media.fmtp[0]?.config).toBe('profile-level-id=42e01f');
|
||||
expect(media.fmtp[1]?.config).toBe('profile-id=0;x-google-start-bitrate=1350');
|
||||
}
|
||||
});
|
||||
|
||||
it('never appends a second start bitrate while screen share delivery is off', () => {
|
||||
const media = videoMedia('camera-track', [
|
||||
{payload: 96, config: 'profile-level-id=42e01f;x-google-start-bitrate=900'},
|
||||
]);
|
||||
applyVideoStartBitrate(media, 'camera-track', 'H264', 2000);
|
||||
expect(media.fmtp[0]?.config).toBe('profile-level-id=42e01f;x-google-start-bitrate=900');
|
||||
const media = videoMedia(
|
||||
'screen-track',
|
||||
[
|
||||
{payload: 96, config: 'profile-level-id=42e01f'},
|
||||
{payload: 98, config: 'profile-id=0'},
|
||||
],
|
||||
[
|
||||
{payload: 96, codec: 'H264'},
|
||||
{payload: 98, codec: 'VP9'},
|
||||
],
|
||||
);
|
||||
applyVideoStartBitrate(media, 'screen-track', 'VP9', 1500, true);
|
||||
expect(media.fmtp[0]?.config).toBe('profile-level-id=42e01f');
|
||||
expect(media.fmtp[1]?.config).toBe('profile-id=0;x-google-start-bitrate=1350');
|
||||
});
|
||||
|
||||
it('replaces a start bitrate an earlier offer wrote instead of keeping it', () => {
|
||||
const media = videoMedia('camera-track', [
|
||||
{payload: 96, config: 'profile-level-id=42e01f;x-google-start-bitrate=900'},
|
||||
]);
|
||||
applyVideoStartBitrate(media, 'camera-track', 'H264', 2000, false, true);
|
||||
applyVideoStartBitrate(media, 'camera-track', 'H264', 2000, false);
|
||||
expect(media.fmtp[0]?.config).toBe('profile-level-id=42e01f;x-google-start-bitrate=1000');
|
||||
});
|
||||
|
||||
it('leaves other tracks and missing codecs alone', () => {
|
||||
for (const screenShareDelivery of [false, true]) {
|
||||
const media = videoMedia('camera-track', [{payload: 96, config: 'profile-level-id=42e01f'}]);
|
||||
expect(applyVideoStartBitrate(media, 'other-track', 'H264', 2000, false, screenShareDelivery)).toBeUndefined();
|
||||
expect(applyVideoStartBitrate(media, 'camera-track', 'AV1', 2000, false, screenShareDelivery)).toBe(0);
|
||||
expect(media.fmtp[0]?.config).toBe('profile-level-id=42e01f');
|
||||
}
|
||||
const media = videoMedia('camera-track', [{payload: 96, config: 'profile-level-id=42e01f'}]);
|
||||
expect(applyVideoStartBitrate(media, 'other-track', 'H264', 2000, false)).toBeUndefined();
|
||||
expect(applyVideoStartBitrate(media, 'camera-track', 'AV1', 2000, false)).toBe(0);
|
||||
expect(media.fmtp[0]?.config).toBe('profile-level-id=42e01f');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -49,7 +49,6 @@ export function applyVideoStartBitrate(
|
||||
codec: string,
|
||||
maxbr: number,
|
||||
isScreenShare = false,
|
||||
screenShareDelivery = false,
|
||||
): number | undefined {
|
||||
if (!media.msid?.includes(cid)) {
|
||||
return undefined;
|
||||
@@ -65,25 +64,10 @@ export function applyVideoStartBitrate(
|
||||
const calculatedStartBitrate = Math.round(maxbr * startBitrateMultiplier);
|
||||
let startBitrate = Math.min(calculatedStartBitrate, maxStartBitrateKbps);
|
||||
if (isScreenShare) {
|
||||
startBitrate = screenShareDelivery
|
||||
? Math.max(minScreenShareStartBitrateKbps, Math.min(calculatedStartBitrate, maxScreenShareStartBitrateKbps))
|
||||
: calculatedStartBitrate;
|
||||
}
|
||||
|
||||
if (!screenShareDelivery) {
|
||||
const codecPayload = codecPayloads[0];
|
||||
const fmtp = media.fmtp.find((entry) => entry.payload === codecPayload);
|
||||
if (fmtp) {
|
||||
if (!fmtp.config.includes(startBitrateParameter)) {
|
||||
fmtp.config += `;${startBitrateParameter}=${startBitrate}`;
|
||||
}
|
||||
} else {
|
||||
media.fmtp.push({
|
||||
payload: codecPayload,
|
||||
config: `${startBitrateParameter}=${startBitrate}`,
|
||||
});
|
||||
}
|
||||
return codecPayload;
|
||||
startBitrate = Math.max(
|
||||
minScreenShareStartBitrateKbps,
|
||||
Math.min(calculatedStartBitrate, maxScreenShareStartBitrateKbps),
|
||||
);
|
||||
}
|
||||
|
||||
for (const payload of codecPayloads) {
|
||||
@@ -143,8 +127,6 @@ export default class PCTransport extends (EventEmitter as new () => TypedEmitter
|
||||
|
||||
excludedVideoDecoderMimeTypes: Set<string> = new Set();
|
||||
|
||||
private screenShareDelivery: boolean;
|
||||
|
||||
onOffer?: (offer: RTCSessionDescriptionInit, offerId: number) => void;
|
||||
|
||||
onIceCandidate?: (candidate: RTCIceCandidate) => void;
|
||||
@@ -161,10 +143,9 @@ export default class PCTransport extends (EventEmitter as new () => TypedEmitter
|
||||
|
||||
onTrack?: (ev: RTCTrackEvent) => void;
|
||||
|
||||
constructor(config?: RTCConfiguration, loggerOptions: LoggerOptions = {}, screenShareDelivery: boolean = false) {
|
||||
constructor(config?: RTCConfiguration, loggerOptions: LoggerOptions = {}) {
|
||||
super();
|
||||
this.loggerOptions = loggerOptions;
|
||||
this.screenShareDelivery = screenShareDelivery;
|
||||
this.log = getLogger(loggerOptions.loggerName ?? LoggerNames.PCTransport, () => this.logContext);
|
||||
this.iceLog = getLogger(LoggerNames.ICE, () => this.logContext);
|
||||
this.config = config;
|
||||
@@ -412,7 +393,6 @@ export default class PCTransport extends (EventEmitter as new () => TypedEmitter
|
||||
trackbr.codec,
|
||||
trackbr.maxbr,
|
||||
trackbr.isScreenShare,
|
||||
this.screenShareDelivery,
|
||||
);
|
||||
if (codecPayload === undefined) {
|
||||
return false;
|
||||
@@ -471,10 +451,7 @@ export default class PCTransport extends (EventEmitter as new () => TypedEmitter
|
||||
for (const transceiver of this.getTransceivers()) {
|
||||
if (transceiver.receiver.track?.kind !== 'video') continue;
|
||||
if ((transceiver as {stopped?: boolean}).stopped) continue;
|
||||
const receives = this.screenShareDelivery
|
||||
? transceiver.direction === 'recvonly'
|
||||
: transceiver.direction === 'recvonly' || transceiver.direction === 'sendrecv';
|
||||
if (!receives) continue;
|
||||
if (transceiver.direction !== 'recvonly') continue;
|
||||
if (typeof transceiver.setCodecPreferences !== 'function') continue;
|
||||
try {
|
||||
transceiver.setCodecPreferences(allowed);
|
||||
|
||||
@@ -98,7 +98,6 @@ export class PCTransportManager {
|
||||
loggerOptions: LoggerOptions,
|
||||
rtcConfig?: RTCConfiguration,
|
||||
subscriberVideoCodecExclusions?: Array<VideoCodec>,
|
||||
screenShareDelivery: boolean = false,
|
||||
) {
|
||||
this.loggerOptions = loggerOptions;
|
||||
this.log = getLogger(loggerOptions.loggerName ?? LoggerNames.PCManager, () => this.logContext);
|
||||
@@ -106,10 +105,10 @@ export class PCTransportManager {
|
||||
|
||||
this.isPublisherConnectionRequired = mode !== 'subscriber-primary';
|
||||
this.isSubscriberConnectionRequired = mode === 'subscriber-primary';
|
||||
this.publisher = new PCTransport(rtcConfig, loggerOptions, screenShareDelivery);
|
||||
this.publisher = new PCTransport(rtcConfig, loggerOptions);
|
||||
this._mode = mode;
|
||||
if (mode !== 'publisher-only') {
|
||||
this.subscriber = new PCTransport(rtcConfig, loggerOptions, screenShareDelivery);
|
||||
this.subscriber = new PCTransport(rtcConfig, loggerOptions);
|
||||
this.subscriber.onConnectionStateChange = this.updateState;
|
||||
this.subscriber.onIceConnectionStateChange = this.updateState;
|
||||
this.subscriber.onSignalingStatechange = this.updateState;
|
||||
@@ -127,7 +126,7 @@ export class PCTransportManager {
|
||||
};
|
||||
}
|
||||
|
||||
const receivingTransport = screenShareDelivery ? (this.subscriber ?? this.publisher) : this.subscriber;
|
||||
const receivingTransport = this.subscriber ?? this.publisher;
|
||||
if (receivingTransport) {
|
||||
for (const codec of subscriberVideoCodecExclusions ?? []) {
|
||||
receivingTransport.excludedVideoDecoderMimeTypes.add(`video/${codec}`);
|
||||
|
||||
@@ -25,41 +25,20 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
const mainLine = 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f';
|
||||
const highLine = 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f';
|
||||
|
||||
it('keeps Main and Baseline ahead of Constrained Baseline while screen share delivery is off', () => {
|
||||
const constrainedBaseline = codec('video/H264', constrainedBaselineLine);
|
||||
const baseline = codec('video/H264', baselineLine);
|
||||
const highProfile = codec('video/H264', highLine);
|
||||
const rtx = codec('video/rtx');
|
||||
const preferences = selectPublisherCodecPreferences('h264', [constrainedBaseline, rtx, baseline, highProfile]);
|
||||
expect(preferences).toEqual([highProfile, baseline, constrainedBaseline, rtx]);
|
||||
});
|
||||
|
||||
it('offers High first, then the one profile this server always registers, then the ones it registers nowhere', () => {
|
||||
const constrainedBaseline = codec('video/H264', constrainedBaselineLine);
|
||||
const baseline = codec('video/H264', baselineLine);
|
||||
const highProfile = codec('video/H264', highLine);
|
||||
const rtx = codec('video/rtx');
|
||||
const preferences = selectPublisherCodecPreferences(
|
||||
'h264',
|
||||
[constrainedBaseline, rtx, baseline, highProfile],
|
||||
true,
|
||||
);
|
||||
const preferences = selectPublisherCodecPreferences('h264', [constrainedBaseline, rtx, baseline, highProfile]);
|
||||
expect(preferences).toEqual([highProfile, constrainedBaseline, baseline, rtx]);
|
||||
});
|
||||
|
||||
it('leads with Main and then Baseline while screen share delivery is off', () => {
|
||||
const constrainedBaseline = codec('video/H264', constrainedBaselineLine);
|
||||
const mainProfile = codec('video/H264', mainLine);
|
||||
const baseline = codec('video/H264', baselineLine);
|
||||
const preferences = selectPublisherCodecPreferences('h264', [mainProfile, baseline, constrainedBaseline]);
|
||||
expect(preferences).toEqual([mainProfile, baseline, constrainedBaseline]);
|
||||
});
|
||||
|
||||
it('never leads with Main or Baseline, which this server registers nowhere and deletes from the answer', () => {
|
||||
const constrainedBaseline = codec('video/H264', constrainedBaselineLine);
|
||||
const mainProfile = codec('video/H264', mainLine);
|
||||
const baseline = codec('video/H264', baselineLine);
|
||||
const preferences = selectPublisherCodecPreferences('h264', [mainProfile, baseline, constrainedBaseline], true);
|
||||
const preferences = selectPublisherCodecPreferences('h264', [mainProfile, baseline, constrainedBaseline]);
|
||||
expect(preferences).toEqual([constrainedBaseline, mainProfile, baseline]);
|
||||
});
|
||||
|
||||
@@ -75,21 +54,8 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
];
|
||||
}
|
||||
|
||||
it('sorts the capabilities Chromium reports by the old table while screen share delivery is off', () => {
|
||||
const preferences = selectPublisherCodecPreferences('h264', chromiumCapabilities());
|
||||
expect(preferences.map((entry) => entry.sdpFmtpLine)).toEqual([
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640034',
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f',
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f',
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f',
|
||||
'level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f',
|
||||
'level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f',
|
||||
'level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f',
|
||||
]);
|
||||
});
|
||||
|
||||
it('offers High first out of the capabilities Chromium reports, so the only hardware profile this server registers wins', () => {
|
||||
const preferences = selectPublisherCodecPreferences('h264', chromiumCapabilities(), true);
|
||||
const preferences = selectPublisherCodecPreferences('h264', chromiumCapabilities());
|
||||
expect(preferences.map((entry) => entry.sdpFmtpLine)).toEqual([
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640034',
|
||||
'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f',
|
||||
@@ -116,7 +82,7 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
return {constrainedBaseline, mainProfile, highProfileLevel31, highProfileLevel51, constrainedHigh};
|
||||
}
|
||||
|
||||
it('ranks High, Constrained High, Main and Baseline above Constrained Baseline while screen share delivery is off', () => {
|
||||
it('ranks High and Constrained High above Constrained Baseline, whatever level each one reports', () => {
|
||||
const {constrainedBaseline, mainProfile, highProfileLevel31, highProfileLevel51, constrainedHigh} = levelSpread();
|
||||
const preferences = selectPublisherCodecPreferences('h264', [
|
||||
mainProfile,
|
||||
@@ -125,22 +91,6 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
constrainedHigh,
|
||||
constrainedBaseline,
|
||||
]);
|
||||
expect(preferences).toEqual([
|
||||
highProfileLevel31,
|
||||
highProfileLevel51,
|
||||
constrainedHigh,
|
||||
mainProfile,
|
||||
constrainedBaseline,
|
||||
]);
|
||||
});
|
||||
|
||||
it('ranks High and Constrained High above Constrained Baseline, whatever level each one reports', () => {
|
||||
const {constrainedBaseline, mainProfile, highProfileLevel31, highProfileLevel51, constrainedHigh} = levelSpread();
|
||||
const preferences = selectPublisherCodecPreferences(
|
||||
'h264',
|
||||
[mainProfile, highProfileLevel31, highProfileLevel51, constrainedHigh, constrainedBaseline],
|
||||
true,
|
||||
);
|
||||
expect(preferences).toEqual([
|
||||
highProfileLevel31,
|
||||
highProfileLevel51,
|
||||
@@ -150,7 +100,7 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it('ranks packetization-mode=1 above packetization-mode=0 in both arms, which no hardware encoder takes', () => {
|
||||
it('ranks packetization-mode=1 above packetization-mode=0, which no hardware encoder takes', () => {
|
||||
const constrainedBaselineMode0 = codec(
|
||||
'video/H264',
|
||||
'level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f',
|
||||
@@ -167,7 +117,6 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
const capabilities = [highProfileMode0, constrainedBaselineMode0, constrainedBaselineMode1, highProfileMode1];
|
||||
const expected = [highProfileMode1, constrainedBaselineMode1, highProfileMode0, constrainedBaselineMode0];
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities)).toEqual(expected);
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities, true)).toEqual(expected);
|
||||
});
|
||||
|
||||
it('puts the chosen codec first and keeps every other codec in browser capability order', () => {
|
||||
@@ -175,7 +124,6 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
const vp8 = codec('video/VP8');
|
||||
const rtx = codec('video/rtx');
|
||||
expect(selectPublisherCodecPreferences('vp9', [vp8, rtx, vp9])).toEqual([vp9, vp8, rtx]);
|
||||
expect(selectPublisherCodecPreferences('vp9', [vp8, rtx, vp9], true)).toEqual([vp9, vp8, rtx]);
|
||||
});
|
||||
|
||||
it('keeps the other codecs so a later publication on the same connection can negotiate them', () => {
|
||||
@@ -192,7 +140,7 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
const constrainedBaseline = codec('video/H264', constrainedBaselineLine);
|
||||
const capabilities = [vp8, highProfile, constrainedBaseline];
|
||||
expect(selectPublisherCodecPreferences('vp8', capabilities)).toEqual([vp8, highProfile, constrainedBaseline]);
|
||||
expect(selectPublisherCodecPreferences('vp8', capabilities, true, new Set(['42e0']))).toEqual([
|
||||
expect(selectPublisherCodecPreferences('vp8', capabilities, new Set(['42e0']))).toEqual([
|
||||
vp8,
|
||||
constrainedBaseline,
|
||||
highProfile,
|
||||
@@ -203,25 +151,15 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
expect(selectPublisherCodecPreferences('av1', [codec('video/VP8'), codec('video/rtx')])).toEqual([]);
|
||||
});
|
||||
|
||||
it('ignores the profiles this host measured while screen share delivery is off', () => {
|
||||
const constrainedBaseline = codec('video/H264', constrainedBaselineLine);
|
||||
const highProfile = codec('video/H264', highLine);
|
||||
const capabilities = [highProfile, constrainedBaseline];
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities, false, new Set(['42e0']))).toEqual([
|
||||
highProfile,
|
||||
constrainedBaseline,
|
||||
]);
|
||||
});
|
||||
|
||||
it('only lets a profile this host encodes in hardware outrank Constrained Baseline', () => {
|
||||
const constrainedBaseline = codec('video/H264', constrainedBaselineLine);
|
||||
const highProfile = codec('video/H264', highLine);
|
||||
const capabilities = [highProfile, constrainedBaseline];
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities, true, new Set(['42e0']))).toEqual([
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities, new Set(['42e0']))).toEqual([
|
||||
constrainedBaseline,
|
||||
highProfile,
|
||||
]);
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities, true, new Set(['6400', '42e0']))).toEqual([
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities, new Set(['6400', '42e0']))).toEqual([
|
||||
highProfile,
|
||||
constrainedBaseline,
|
||||
]);
|
||||
@@ -231,8 +169,8 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
const constrainedBaseline = codec('video/H264', constrainedBaselineLine);
|
||||
const highProfile = codec('video/H264', highLine);
|
||||
const capabilities = [constrainedBaseline, highProfile];
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities, true)).toEqual([highProfile, constrainedBaseline]);
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities, true, new Set())).toEqual([
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities)).toEqual([highProfile, constrainedBaseline]);
|
||||
expect(selectPublisherCodecPreferences('h264', capabilities, new Set())).toEqual([
|
||||
highProfile,
|
||||
constrainedBaseline,
|
||||
]);
|
||||
@@ -245,7 +183,7 @@ describe('selectPublisherCodecPreferences', () => {
|
||||
'level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=64001f',
|
||||
);
|
||||
expect(
|
||||
selectPublisherCodecPreferences('h264', [highProfileMode0, constrainedBaselineMode1], true, new Set(['6400'])),
|
||||
selectPublisherCodecPreferences('h264', [highProfileMode0, constrainedBaselineMode1], new Set(['6400'])),
|
||||
).toEqual([constrainedBaselineMode1, highProfileMode0]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -123,13 +123,6 @@ const videoCodecMimeTypes: Record<VideoCodec, Array<string>> = {
|
||||
vp8: ['video/vp8'],
|
||||
};
|
||||
const h264ProfileRanks = new Map([
|
||||
['6400', 0],
|
||||
['640c', 1],
|
||||
['4d00', 2],
|
||||
['4200', 3],
|
||||
['42e0', 4],
|
||||
]);
|
||||
const h264DeliveryProfileRanks = new Map([
|
||||
['6400', 0],
|
||||
['640c', 1],
|
||||
['42e0', 2],
|
||||
@@ -139,8 +132,7 @@ const h264DeliveryProfileRanks = new Map([
|
||||
const h264UnrankedProfileScore = 5;
|
||||
const h264MissingProfileScore = 6;
|
||||
const h264NonHardwareProfilePenalty = 8;
|
||||
const h264PacketizationMode0Score = 10;
|
||||
const h264DeliveryPacketizationMode0Score = 20;
|
||||
const h264PacketizationMode0Score = 20;
|
||||
type RtpCodecCapability = RTCRtpCapabilities['codecs'][number] & {sdpFmtpLine?: string};
|
||||
|
||||
enum PCState {
|
||||
@@ -523,7 +515,6 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
||||
this.loggerOptions,
|
||||
rtcConfig,
|
||||
this.options.subscriberVideoCodecExclusions,
|
||||
this.options.screenShareDelivery ?? false,
|
||||
);
|
||||
} else {
|
||||
this.participantSid = joinResponse.participant?.sid;
|
||||
@@ -537,7 +528,6 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
||||
this.loggerOptions,
|
||||
rtcConfig,
|
||||
this.options.subscriberVideoCodecExclusions,
|
||||
this.options.screenShareDelivery ?? false,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1062,12 +1052,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
||||
if (typeof RTCRtpSender === 'undefined' || typeof RTCRtpSender.getCapabilities !== 'function') return;
|
||||
const capabilities = RTCRtpSender.getCapabilities('video');
|
||||
if (!capabilities) return;
|
||||
const preferences = selectPublisherCodecPreferences(
|
||||
codec,
|
||||
capabilities.codecs,
|
||||
this.options.screenShareDelivery ?? false,
|
||||
this.options.h264HardwareProfiles,
|
||||
);
|
||||
const preferences = selectPublisherCodecPreferences(codec, capabilities.codecs, this.options.h264HardwareProfiles);
|
||||
if (preferences.length === 0) {
|
||||
this.log.warn('sender cannot encode the requested codec, leaving the browser order in place', {
|
||||
...this.logContext,
|
||||
@@ -1843,33 +1828,27 @@ function getFmtpParameter(sdpFmtpLine: string | undefined, key: string): string
|
||||
|
||||
function getH264PublisherCodecScore(
|
||||
codec: RtpCodecCapability,
|
||||
screenShareDelivery: boolean,
|
||||
hardwareProfiles: ReadonlySet<string> | undefined,
|
||||
): number {
|
||||
const profileLevelId = getFmtpParameter(codec.sdpFmtpLine, 'profile-level-id');
|
||||
const packetizationMode = getFmtpParameter(codec.sdpFmtpLine, 'packetization-mode');
|
||||
const mode0Score = screenShareDelivery ? h264DeliveryPacketizationMode0Score : h264PacketizationMode0Score;
|
||||
const packetizationScore = packetizationMode === '1' ? 0 : mode0Score;
|
||||
const packetizationScore = packetizationMode === '1' ? 0 : h264PacketizationMode0Score;
|
||||
if (!profileLevelId) return packetizationScore + h264MissingProfileScore;
|
||||
const profile = profileLevelId.slice(0, 4);
|
||||
if (!screenShareDelivery) {
|
||||
return packetizationScore + (h264ProfileRanks.get(profile) ?? h264UnrankedProfileScore);
|
||||
}
|
||||
const isSoftwareOnly = hardwareProfiles !== undefined && hardwareProfiles.size > 0 && !hardwareProfiles.has(profile);
|
||||
const hardwareScore = isSoftwareOnly ? h264NonHardwareProfilePenalty : 0;
|
||||
return packetizationScore + hardwareScore + (h264DeliveryProfileRanks.get(profile) ?? h264UnrankedProfileScore);
|
||||
return packetizationScore + hardwareScore + (h264ProfileRanks.get(profile) ?? h264UnrankedProfileScore);
|
||||
}
|
||||
|
||||
function preferHardwareH264Codecs(
|
||||
codecs: ReadonlyArray<RtpCodecCapability>,
|
||||
screenShareDelivery: boolean,
|
||||
hardwareProfiles: ReadonlySet<string> | undefined,
|
||||
): Array<RtpCodecCapability> {
|
||||
return codecs
|
||||
.map((codec, index) => ({
|
||||
codec,
|
||||
index,
|
||||
score: getH264PublisherCodecScore(codec, screenShareDelivery, hardwareProfiles),
|
||||
score: getH264PublisherCodecScore(codec, hardwareProfiles),
|
||||
}))
|
||||
.sort((a, b) => a.score - b.score || a.index - b.index)
|
||||
.map((entry) => entry.codec);
|
||||
@@ -1878,17 +1857,15 @@ function preferHardwareH264Codecs(
|
||||
export function selectPublisherCodecPreferences(
|
||||
codec: VideoCodec,
|
||||
codecs: ReadonlyArray<RtpCodecCapability>,
|
||||
screenShareDelivery: boolean = false,
|
||||
h264HardwareProfiles?: ReadonlySet<string>,
|
||||
): Array<RtpCodecCapability> {
|
||||
const mimeTypes = new Set(videoCodecMimeTypes[codec]);
|
||||
const selected = codecs.filter((entry) => mimeTypes.has(entry.mimeType.toLowerCase()));
|
||||
if (selected.length === 0) return [];
|
||||
const preferred =
|
||||
codec === 'h264' ? preferHardwareH264Codecs(selected, screenShareDelivery, h264HardwareProfiles) : selected;
|
||||
const preferred = codec === 'h264' ? preferHardwareH264Codecs(selected, h264HardwareProfiles) : selected;
|
||||
const isH264 = (entry: RtpCodecCapability): boolean => entry.mimeType.toLowerCase() === 'video/h264';
|
||||
const remaining = codecs.filter((entry) => !mimeTypes.has(entry.mimeType.toLowerCase()));
|
||||
const rankedH264 = preferHardwareH264Codecs(remaining.filter(isH264), screenShareDelivery, h264HardwareProfiles);
|
||||
const rankedH264 = preferHardwareH264Codecs(remaining.filter(isH264), h264HardwareProfiles);
|
||||
let nextH264 = 0;
|
||||
const rest = remaining.map((entry) => (isH264(entry) ? rankedH264[nextH264++] : entry));
|
||||
return [...preferred, ...rest];
|
||||
|
||||
@@ -63,7 +63,6 @@ import {
|
||||
publishDefaults,
|
||||
roomConnectOptionDefaults,
|
||||
roomOptionDefaults,
|
||||
screenShareDeliveryPublishDefaults,
|
||||
videoDefaults,
|
||||
} from './defaults.ts';
|
||||
import {ConnectionError, ConnectionErrorReason, UnexpectedConnectionState, UnsupportedServer} from './errors.ts';
|
||||
@@ -228,7 +227,7 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
||||
...options?.videoCaptureDefaults,
|
||||
};
|
||||
this.options.publishDefaults = {
|
||||
...(this.options.screenShareDelivery ? screenShareDeliveryPublishDefaults : publishDefaults),
|
||||
...publishDefaults,
|
||||
...options?.publishDefaults,
|
||||
};
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import {AudioPresets, BackupCodecPolicy, ScreenSharePresets, VideoPresets} from
|
||||
|
||||
export const defaultVideoCodec = 'h264';
|
||||
|
||||
export const screenShareDeliveryPublishDefaults: TrackPublishDefaults = {
|
||||
export const publishDefaults: TrackPublishDefaults = {
|
||||
audioPreset: AudioPresets.music,
|
||||
dtx: false,
|
||||
red: true,
|
||||
@@ -21,11 +21,6 @@ export const screenShareDeliveryPublishDefaults: TrackPublishDefaults = {
|
||||
preConnectBuffer: false,
|
||||
} as const;
|
||||
|
||||
export const publishDefaults: TrackPublishDefaults = {
|
||||
...screenShareDeliveryPublishDefaults,
|
||||
degradationPreference: 'maintain-resolution',
|
||||
};
|
||||
|
||||
export const audioDefaults: AudioCaptureOptions = {
|
||||
deviceId: {ideal: 'default'},
|
||||
autoGainControl: true,
|
||||
|
||||
@@ -814,7 +814,6 @@ export default class LocalParticipant extends Participant {
|
||||
...this.roomOptions.publishDefaults,
|
||||
...options,
|
||||
};
|
||||
track.screenShareDelivery = this.roomOptions.screenShareDelivery ?? false;
|
||||
const isStereoInput =
|
||||
('channelCount' in track.mediaStreamTrack.getSettings() &&
|
||||
track.mediaStreamTrack.getSettings().channelCount === 2) ||
|
||||
@@ -1788,7 +1787,7 @@ export default class LocalParticipant extends Participant {
|
||||
return;
|
||||
}
|
||||
let subscribedCodecs = update.subscribedCodecs;
|
||||
if (this.roomOptions.screenShareDelivery && hasSingleRidlessEncoding(pub.videoTrack)) {
|
||||
if (hasSingleRidlessEncoding(pub.videoTrack)) {
|
||||
subscribedCodecs = subscribedCodecs.filter((codec) => codec.qualities.some((quality) => quality.enabled));
|
||||
if (subscribedCodecs.length === 0) {
|
||||
return;
|
||||
|
||||
@@ -41,8 +41,6 @@ export default abstract class LocalTrack<TrackKind extends Track.Kind = Track.Ki
|
||||
|
||||
codec?: VideoCodec;
|
||||
|
||||
screenShareDelivery: boolean = false;
|
||||
|
||||
get constraints() {
|
||||
return this._constraints;
|
||||
}
|
||||
@@ -563,7 +561,7 @@ export default abstract class LocalTrack<TrackKind extends Track.Kind = Track.Ki
|
||||
);
|
||||
|
||||
private debouncedTrackMuteHandler = debounce(async () => {
|
||||
if (this.screenShareDelivery && this.source === Track.Source.ScreenShare) {
|
||||
if (this.source === Track.Source.ScreenShare) {
|
||||
this.log.debug('screen share capture went idle, keeping upstream published', this.logContext);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -433,6 +433,7 @@ export default () => {
|
||||
staticFilesPlugin({
|
||||
staticCdnEndpoint: normalizedStaticCdnEndpoint,
|
||||
fontsDir: path.join(MONOREPO_ROOT, 'packages', 'fonts'),
|
||||
wasmCratesDir: path.join(ROOT_DIR, 'rust'),
|
||||
}),
|
||||
new DefinePlugin({
|
||||
__FLUXER_PRECACHE_MANIFEST__: JSON.stringify([]),
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2026, Alexandre Bury
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -0,0 +1,32 @@
|
||||
The auto-generated bindings are under the 3-clause BSD license:
|
||||
|
||||
BSD License
|
||||
|
||||
For Zstandard software
|
||||
|
||||
Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name Facebook, nor Meta, nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -0,0 +1,30 @@
|
||||
BSD License
|
||||
|
||||
For Zstandard software
|
||||
|
||||
Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name Facebook, nor Meta, nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -0,0 +1,12 @@
|
||||
# libfluxcore licenses
|
||||
|
||||
`libfluxcore_bg.wasm` is built from this crate and bundled into the app. It
|
||||
contains third-party code that keeps its upstream license.
|
||||
|
||||
| Component | Source | License |
|
||||
| --- | --- | --- |
|
||||
| Zstandard 1.5.7 | Vendored by the `zstd-sys` 2.1.0 crate | BSD-3-Clause, see `LICENSE-ZSTD.txt` (Zstandard is dual licensed, Fluxer uses it under BSD-3-Clause) |
|
||||
| `zstd-sys` 2.1.0 | Rust bindings, build script and WebAssembly libc shim | BSD-3-Clause, see `LICENSE-ZSTD-SYS.txt` |
|
||||
| `zstd` 0.14.0 | Rust wrapper | BSD-3-Clause, see `LICENSE-ZSTD-RS.txt` |
|
||||
|
||||
No Fluxer license notice grants rights to third-party trademarks or brand names.
|
||||
@@ -16,6 +16,22 @@ pub fn is_animated_image_bytes(input: &[u8]) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
pub fn sniff_image_format_bytes(input: &[u8]) -> u8 {
|
||||
if is_png(input) {
|
||||
1
|
||||
} else if is_gif(input) {
|
||||
2
|
||||
} else if is_webp(input) {
|
||||
3
|
||||
} else if is_avif_file(input) {
|
||||
4
|
||||
} else if input.starts_with(&[0xff, 0xd8, 0xff]) {
|
||||
5
|
||||
} else {
|
||||
0
|
||||
}
|
||||
}
|
||||
|
||||
fn is_gif(input: &[u8]) -> bool {
|
||||
input.starts_with(b"GIF89a") || input.starts_with(b"GIF87a")
|
||||
}
|
||||
@@ -35,7 +51,16 @@ fn is_avif_file(input: &[u8]) -> bool {
|
||||
}
|
||||
|
||||
fn has_avif_anim(input: &[u8]) -> bool {
|
||||
is_avif_file(input) && &input[8..12] == b"avis"
|
||||
if !is_avif_file(input) {
|
||||
return false;
|
||||
}
|
||||
if &input[8..12] == b"avis" {
|
||||
return true;
|
||||
}
|
||||
let box_end = read_u32_be(input, 0).map_or(0, |size| (size as usize).min(input.len()));
|
||||
input
|
||||
.get(16..box_end)
|
||||
.is_some_and(|brands| brands.as_chunks::<4>().0.contains(b"avis"))
|
||||
}
|
||||
|
||||
fn has_apng_actl(input: &[u8]) -> bool {
|
||||
@@ -243,13 +268,53 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn detects_avif_sequence_brand() {
|
||||
let avif = b"\x00\x00\x00\x18ftypavif\x00\x00\x00\x00avis";
|
||||
assert!(!is_animated_image_bytes(avif));
|
||||
let still = b"\x00\x00\x00\x18ftypavif\x00\x00\x00\x00mif1miaf";
|
||||
assert!(!is_animated_image_bytes(still));
|
||||
|
||||
let avis = b"\x00\x00\x00\x18ftypavis\x00\x00\x00\x00avif";
|
||||
assert!(is_animated_image_bytes(avis));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn detects_avis_among_compatible_brands() {
|
||||
let compat = b"\x00\x00\x00\x1cftypavif\x00\x00\x00\x00mif1avismsf1";
|
||||
assert!(is_animated_image_bytes(compat));
|
||||
|
||||
let outside_ftyp = b"\x00\x00\x00\x14ftypavif\x00\x00\x00\x00mif1avis";
|
||||
assert!(!is_animated_image_bytes(outside_ftyp));
|
||||
|
||||
let truncated = b"\x00\x00\x00\x40ftypavif\x00\x00\x00\x00mif1av";
|
||||
assert!(!is_animated_image_bytes(truncated));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sniffs_image_formats_from_magic_bytes() {
|
||||
assert_eq!(sniff_image_format_bytes(b""), 0);
|
||||
assert_eq!(sniff_image_format_bytes(b"<svg xmlns"), 0);
|
||||
assert_eq!(
|
||||
sniff_image_format_bytes(b"\x89PNG\r\n\x1a\n\0\0\0\rIHDR"),
|
||||
1
|
||||
);
|
||||
assert_eq!(sniff_image_format_bytes(b"GIF89a\x01\x00"), 2);
|
||||
assert_eq!(sniff_image_format_bytes(b"GIF87a\x01\x00"), 2);
|
||||
assert_eq!(sniff_image_format_bytes(b"RIFF\x04\0\0\0WEBPVP8 "), 3);
|
||||
assert_eq!(sniff_image_format_bytes(b"RIFF\x04\0\0\0WAVEfmt "), 0);
|
||||
assert_eq!(
|
||||
sniff_image_format_bytes(b"\x00\x00\x00\x18ftypavif\x00\x00\x00\x00"),
|
||||
4
|
||||
);
|
||||
assert_eq!(
|
||||
sniff_image_format_bytes(b"\x00\x00\x00\x18ftypavis\x00\x00\x00\x00"),
|
||||
4
|
||||
);
|
||||
assert_eq!(
|
||||
sniff_image_format_bytes(b"\x00\x00\x00\x18ftypheic\x00\x00\x00\x00"),
|
||||
0
|
||||
);
|
||||
assert_eq!(sniff_image_format_bytes(b"\xff\xd8\xff\xe0\x00\x10JFIF"), 5);
|
||||
assert_eq!(sniff_image_format_bytes(b"\xff\xd8"), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_truncated_chunks_without_panicking() {
|
||||
assert!(!is_animated_image_bytes(
|
||||
|
||||
@@ -5,8 +5,8 @@ mod rgba;
|
||||
mod zstd_frame;
|
||||
mod zstd_stream;
|
||||
|
||||
use formats::is_animated_image_bytes;
|
||||
use rgba::{TransformRequest, crop_rotate_rgba_alloc};
|
||||
use formats::{is_animated_image_bytes, sniff_image_format_bytes};
|
||||
use rgba::{TransformRequest, crop_rotate_rgba_alloc, crop_rotate_rgba_into};
|
||||
use wasm_bindgen::prelude::*;
|
||||
|
||||
#[wasm_bindgen]
|
||||
@@ -40,6 +40,39 @@ pub fn crop_rotate_rgba_raw(
|
||||
.map_err(|error| JsValue::from_str(error.message()))
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn crop_rotate_rgba_into_buffer(
|
||||
input: &[u8],
|
||||
output: &mut [u8],
|
||||
src_width: u32,
|
||||
src_height: u32,
|
||||
x: u32,
|
||||
y: u32,
|
||||
width: u32,
|
||||
height: u32,
|
||||
rotation_deg: u32,
|
||||
output_width: u32,
|
||||
output_height: u32,
|
||||
) -> Result<(), JsValue> {
|
||||
crop_rotate_rgba_into(
|
||||
input,
|
||||
output,
|
||||
TransformRequest {
|
||||
src_width,
|
||||
src_height,
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height,
|
||||
rotation_deg,
|
||||
resize_width: output_width,
|
||||
resize_height: output_height,
|
||||
},
|
||||
)
|
||||
.map_err(|error| JsValue::from_str(error.message()))
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub fn decompress_zstd_frame(input: &[u8]) -> Result<Vec<u8>, JsValue> {
|
||||
zstd_frame::decompress(input).map_err(zstd_error_to_js)
|
||||
@@ -106,6 +139,11 @@ pub fn is_animated_image(input: &[u8]) -> bool {
|
||||
is_animated_image_bytes(input)
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub fn sniff_image_format(input: &[u8]) -> u8 {
|
||||
sniff_image_format_bytes(input)
|
||||
}
|
||||
|
||||
fn optional_dimension_to_abi(value: Option<u32>) -> u32 {
|
||||
value.filter(|dimension| *dimension > 0).unwrap_or(u32::MAX)
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ pub struct TransformRequest {
|
||||
pub enum TransformError {
|
||||
InvalidDimensions,
|
||||
InvalidRgbaLength,
|
||||
InvalidOutputLength,
|
||||
EmptyCrop,
|
||||
EmptyTarget,
|
||||
ImageTooLarge,
|
||||
@@ -33,6 +34,7 @@ impl TransformError {
|
||||
match self {
|
||||
Self::InvalidDimensions => "invalid RGBA dimensions",
|
||||
Self::InvalidRgbaLength => "RGBA input length does not match dimensions",
|
||||
Self::InvalidOutputLength => "RGBA output length does not match target dimensions",
|
||||
Self::EmptyCrop => "Crop area is empty",
|
||||
Self::EmptyTarget => "Target dimensions are empty",
|
||||
Self::ImageTooLarge => "Image is too large to crop",
|
||||
@@ -75,12 +77,7 @@ pub fn crop_rotate_rgba_alloc(
|
||||
input: &[u8],
|
||||
request: TransformRequest,
|
||||
) -> Result<Vec<u8>, TransformError> {
|
||||
let geometry = output_geometry(request)?;
|
||||
let expected_len = rgba_byte_len(request.src_width, request.src_height, 0)?;
|
||||
if input.len() != expected_len {
|
||||
return Err(TransformError::InvalidRgbaLength);
|
||||
}
|
||||
|
||||
let geometry = checked_geometry(input, request)?;
|
||||
let output_len = rgba_byte_len(
|
||||
geometry.target_width,
|
||||
geometry.target_height,
|
||||
@@ -89,8 +86,45 @@ pub fn crop_rotate_rgba_alloc(
|
||||
let mut output = try_zeroed_vec(output_len)?;
|
||||
write_u32_le(&mut output, 0, geometry.target_width);
|
||||
write_u32_le(&mut output, 4, geometry.target_height);
|
||||
write_transformed(
|
||||
input,
|
||||
&mut output[RGBA_RESULT_HEADER_BYTES..],
|
||||
request,
|
||||
geometry,
|
||||
);
|
||||
Ok(output)
|
||||
}
|
||||
|
||||
let dst = &mut output[RGBA_RESULT_HEADER_BYTES..];
|
||||
pub fn crop_rotate_rgba_into(
|
||||
input: &[u8],
|
||||
output: &mut [u8],
|
||||
request: TransformRequest,
|
||||
) -> Result<(), TransformError> {
|
||||
let geometry = checked_geometry(input, request)?;
|
||||
if output.len() != rgba_byte_len(geometry.target_width, geometry.target_height, 0)? {
|
||||
return Err(TransformError::InvalidOutputLength);
|
||||
}
|
||||
write_transformed(input, output, request, geometry);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn checked_geometry(
|
||||
input: &[u8],
|
||||
request: TransformRequest,
|
||||
) -> Result<OutputGeometry, TransformError> {
|
||||
let geometry = output_geometry(request)?;
|
||||
if input.len() != rgba_byte_len(request.src_width, request.src_height, 0)? {
|
||||
return Err(TransformError::InvalidRgbaLength);
|
||||
}
|
||||
Ok(geometry)
|
||||
}
|
||||
|
||||
fn write_transformed(
|
||||
input: &[u8],
|
||||
dst: &mut [u8],
|
||||
request: TransformRequest,
|
||||
geometry: OutputGeometry,
|
||||
) {
|
||||
if geometry.target_width == geometry.base_width
|
||||
&& geometry.target_height == geometry.base_height
|
||||
{
|
||||
@@ -98,8 +132,6 @@ pub fn crop_rotate_rgba_alloc(
|
||||
} else {
|
||||
copy_rotated_with_nearest_resize(input, dst, request, geometry);
|
||||
}
|
||||
|
||||
Ok(output)
|
||||
}
|
||||
|
||||
fn output_geometry(request: TransformRequest) -> Result<OutputGeometry, TransformError> {
|
||||
@@ -463,6 +495,30 @@ mod tests {
|
||||
assert!(crop_rotate_rgba_alloc(&rgba(&[1, 2, 3, 4]), empty_target).is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn into_writes_the_same_pixels_as_alloc() {
|
||||
let input = rgba(&[1, 2, 3, 4, 5, 6]);
|
||||
for rotation_deg in [0, 90, 180, 270] {
|
||||
let mut transform = request(2, 3);
|
||||
transform.rotation_deg = rotation_deg;
|
||||
transform.resize_width = 5;
|
||||
transform.resize_height = 4;
|
||||
let expected = crop_rotate_rgba_alloc(&input, transform).unwrap();
|
||||
let mut output = vec![0xaa; 5 * 4 * RGBA_BYTES_PER_PIXEL];
|
||||
crop_rotate_rgba_into(&input, &mut output, transform).unwrap();
|
||||
assert_eq!(output, payload(&expected));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn into_rejects_an_output_of_the_wrong_length() {
|
||||
let mut output = vec![0; 3 * RGBA_BYTES_PER_PIXEL];
|
||||
assert_eq!(
|
||||
crop_rotate_rgba_into(&rgba(&[1, 2, 3, 4]), &mut output, request(2, 2)).unwrap_err(),
|
||||
TransformError::InvalidOutputLength
|
||||
);
|
||||
}
|
||||
|
||||
proptest! {
|
||||
#[test]
|
||||
fn identity_transform_preserves_pixels(width in 1u32..16, height in 1u32..16) {
|
||||
|
||||
Generated
+160
@@ -0,0 +1,160 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.20.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.4.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"shlex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
|
||||
|
||||
[[package]]
|
||||
name = "find-msvc-tools"
|
||||
version = "0.1.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b"
|
||||
|
||||
[[package]]
|
||||
name = "glob"
|
||||
version = "0.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b"
|
||||
|
||||
[[package]]
|
||||
name = "libfluxwebp"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"libwebp-sys",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libwebp-sys"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b3a87b44e34d17161e4f17d92a463d596cb13825dcd1758ed18fd3a721e189c"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"glob",
|
||||
"pkg-config",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.21.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
||||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.107"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.47"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "3.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954"
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.128"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
"rustversion",
|
||||
"wasm-bindgen-macro",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.128"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.128"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.128"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
[package]
|
||||
name = "libfluxwebp"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
license = "AGPL-3.0-or-later"
|
||||
publish = false
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib"]
|
||||
|
||||
[dependencies]
|
||||
wasm-bindgen = "=0.2.128"
|
||||
libwebp-sys = {version = "=0.14.4", default-features = false}
|
||||
|
||||
[profile.release]
|
||||
codegen-units = 1
|
||||
lto = true
|
||||
opt-level = "z"
|
||||
panic = "abort"
|
||||
strip = true
|
||||
|
||||
[workspace]
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) the libwebp-sys authors (XianYou, Kornel Lesiński and contributors)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,30 @@
|
||||
Copyright (c) 2010, Google Inc. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of Google nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
# libfluxwebp licenses
|
||||
|
||||
`libfluxwebp_bg.wasm` and `libfluxwebp_simd_bg.wasm` are built from this crate
|
||||
and bundled into the app. They contain third-party code that keeps its upstream
|
||||
license.
|
||||
|
||||
| Component | Source | License |
|
||||
| --- | --- | --- |
|
||||
| libwebp 1.6.0 | Vendored by the `libwebp-sys` 0.14.4 crate | BSD-3-Clause, see `LICENSE-LIBWEBP.txt`, with the additional patent grant in `PATENTS-LIBWEBP.txt` |
|
||||
| `libwebp-sys` 0.14.4 | Rust bindings and build script | MIT, see `LICENSE-LIBWEBP-SYS.txt` |
|
||||
| `simd/xmmintrin.h`, `simd/emmintrin.h` | Emscripten 4.0.15 SSE compatibility headers | MIT or University of Illinois/NCSA, see `simd/LICENSE` |
|
||||
|
||||
The SIMD build compiles libwebp's SSE2 code paths through the Emscripten
|
||||
headers, unmodified. The headers in `shim/` and `src/shim.rs` are Fluxer code.
|
||||
|
||||
No Fluxer license notice grants rights to third-party trademarks or brand names.
|
||||
@@ -0,0 +1,23 @@
|
||||
Additional IP Rights Grant (Patents)
|
||||
------------------------------------
|
||||
|
||||
"These implementations" means the copyrightable works that implement the WebM
|
||||
codecs distributed by Google as part of the WebM Project.
|
||||
|
||||
Google hereby grants to you a perpetual, worldwide, non-exclusive, no-charge,
|
||||
royalty-free, irrevocable (except as stated in this section) patent license to
|
||||
make, have made, use, offer to sell, sell, import, transfer, and otherwise
|
||||
run, modify and propagate the contents of these implementations of WebM, where
|
||||
such license applies only to those patent claims, both currently owned by
|
||||
Google and acquired in the future, licensable by Google that are necessarily
|
||||
infringed by these implementations of WebM. This grant does not include claims
|
||||
that would be infringed only as a consequence of further modification of these
|
||||
implementations. If you or your agent or exclusive licensee institute or order
|
||||
or agree to the institution of patent litigation or any other patent
|
||||
enforcement activity against any entity (including a cross-claim or
|
||||
counterclaim in a lawsuit) alleging that any of these implementations of WebM
|
||||
or any code incorporated within any of these implementations of WebM
|
||||
constitute direct or contributory patent infringement, or inducement of
|
||||
patent infringement, then any patent rights granted to you under this License
|
||||
for these implementations of WebM shall terminate as of the date such
|
||||
litigation is filed.
|
||||
@@ -0,0 +1,6 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
#ifndef FLUXWEBP_ASSERT_H
|
||||
#define FLUXWEBP_ASSERT_H
|
||||
#define assert(expr) ((void)0)
|
||||
#endif
|
||||
@@ -0,0 +1,6 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
#ifndef FLUXWEBP_INTTYPES_H
|
||||
#define FLUXWEBP_INTTYPES_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
@@ -0,0 +1,33 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
#ifndef FLUXWEBP_MATH_H
|
||||
#define FLUXWEBP_MATH_H
|
||||
double fluxwebp_shim_pow(double x, double y);
|
||||
double fluxwebp_shim_log(double x);
|
||||
float fluxwebp_shim_expf(float x);
|
||||
double fluxwebp_shim_log10(double x);
|
||||
float fluxwebp_shim_logf(float x);
|
||||
double fluxwebp_shim_round(double x);
|
||||
#define pow(x, y) fluxwebp_shim_pow(x, y)
|
||||
#define log(x) fluxwebp_shim_log(x)
|
||||
#define expf(x) fluxwebp_shim_expf(x)
|
||||
#define log10(x) fluxwebp_shim_log10(x)
|
||||
#define logf(x) fluxwebp_shim_logf(x)
|
||||
#define round(x) fluxwebp_shim_round(x)
|
||||
#define fabs(x) __builtin_fabs(x)
|
||||
#define floor(x) __builtin_floor(x)
|
||||
#define ceil(x) __builtin_ceil(x)
|
||||
#define sqrt(x) __builtin_sqrt(x)
|
||||
#define sqrtf(x) __builtin_sqrtf(x)
|
||||
#define rint(x) __builtin_rint(x)
|
||||
#define rintf(x) __builtin_rintf(x)
|
||||
#define fabsf(x) __builtin_fabsf(x)
|
||||
#define floorf(x) __builtin_floorf(x)
|
||||
#define ceilf(x) __builtin_ceilf(x)
|
||||
#define isnan(x) __builtin_isnan(x)
|
||||
#define isinf(x) __builtin_isinf(x)
|
||||
#define lrint(x) ((long)__builtin_rint(x))
|
||||
#define llrint(x) ((long long)__builtin_rint(x))
|
||||
#define lrintf(x) ((long)__builtin_rintf(x))
|
||||
#define llrintf(x) ((long long)__builtin_rintf(x))
|
||||
#endif
|
||||
@@ -0,0 +1,50 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
#ifndef FLUXWEBP_STDIO_H
|
||||
#define FLUXWEBP_STDIO_H
|
||||
#include <stddef.h>
|
||||
#include <stdarg.h>
|
||||
typedef struct FluxWebpFile FILE;
|
||||
#define stderr ((FILE*)0)
|
||||
#define stdout ((FILE*)0)
|
||||
#define fprintf(f, ...) ((void)0)
|
||||
#define printf(...) ((void)0)
|
||||
#define fflush(f) ((void)0)
|
||||
|
||||
static inline void fluxwebp_shim_put(char* buf, size_t cap, size_t* n, char c) {
|
||||
if (*n + 1 < cap) buf[*n] = c;
|
||||
(*n)++;
|
||||
}
|
||||
|
||||
static inline int snprintf(char* buf, size_t cap, const char* fmt, ...) {
|
||||
va_list ap;
|
||||
size_t n = 0;
|
||||
va_start(ap, fmt);
|
||||
for (; *fmt; fmt++) {
|
||||
if (*fmt != '%') {
|
||||
fluxwebp_shim_put(buf, cap, &n, *fmt);
|
||||
continue;
|
||||
}
|
||||
fmt++;
|
||||
if (*fmt == 's') {
|
||||
const char* s = va_arg(ap, const char*);
|
||||
while (s && *s) fluxwebp_shim_put(buf, cap, &n, *s++);
|
||||
} else if (*fmt == 'd') {
|
||||
int v = va_arg(ap, int);
|
||||
char tmp[12];
|
||||
int i = 0;
|
||||
unsigned int u = v < 0 ? 0u - (unsigned int)v : (unsigned int)v;
|
||||
if (v < 0) fluxwebp_shim_put(buf, cap, &n, '-');
|
||||
do { tmp[i++] = (char)('0' + u % 10); u /= 10; } while (u);
|
||||
while (i) fluxwebp_shim_put(buf, cap, &n, tmp[--i]);
|
||||
} else if (*fmt == '%') {
|
||||
fluxwebp_shim_put(buf, cap, &n, '%');
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
va_end(ap);
|
||||
if (cap) buf[n < cap ? n : cap - 1] = '\0';
|
||||
return (int)n;
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,16 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
#ifndef FLUXWEBP_STDLIB_H
|
||||
#define FLUXWEBP_STDLIB_H
|
||||
#include <stddef.h>
|
||||
void* fluxwebp_shim_malloc(size_t size);
|
||||
void* fluxwebp_shim_calloc(size_t nmemb, size_t size);
|
||||
void fluxwebp_shim_free(void* ptr);
|
||||
void fluxwebp_shim_qsort(void* base, size_t nitems, size_t size, int (*compar)(const void*, const void*));
|
||||
#define malloc(size) fluxwebp_shim_malloc(size)
|
||||
#define calloc(nmemb, size) fluxwebp_shim_calloc(nmemb, size)
|
||||
#define free(ptr) fluxwebp_shim_free(ptr)
|
||||
#define qsort(base, nitems, size, compar) fluxwebp_shim_qsort(base, nitems, size, compar)
|
||||
#define abort() __builtin_trap()
|
||||
static inline int abs(int x) { return x < 0 ? -x : x; }
|
||||
#endif
|
||||
@@ -0,0 +1,11 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
#ifndef FLUXWEBP_STRING_H
|
||||
#define FLUXWEBP_STRING_H
|
||||
#include <stddef.h>
|
||||
#define memcpy(d, s, n) __builtin_memcpy(d, s, n)
|
||||
#define memmove(d, s, n) __builtin_memmove(d, s, n)
|
||||
#define memset(d, c, n) __builtin_memset(d, c, n)
|
||||
#define memcmp(a, b, n) __builtin_memcmp(a, b, n)
|
||||
#define strlen(s) __builtin_strlen(s)
|
||||
#endif
|
||||
@@ -0,0 +1,102 @@
|
||||
Emscripten is available under 2 licenses, the MIT license and the
|
||||
University of Illinois/NCSA Open Source License.
|
||||
|
||||
Both are permissive open source licenses, with little if any
|
||||
practical difference between them.
|
||||
|
||||
The reason for offering both is that (1) the MIT license is
|
||||
well-known, while (2) the University of Illinois/NCSA Open Source
|
||||
License allows Emscripten's code to be integrated upstream into
|
||||
LLVM, which uses that license, should the opportunity arise.
|
||||
|
||||
The full text of both licenses follows.
|
||||
|
||||
==============================================================================
|
||||
|
||||
Copyright (c) 2010-2014 Emscripten authors, see AUTHORS file.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
==============================================================================
|
||||
|
||||
Copyright (c) 2010-2014 Emscripten authors, see AUTHORS file.
|
||||
All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the
|
||||
"Software"), to deal with the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimers.
|
||||
|
||||
Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimers
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
Neither the names of Mozilla,
|
||||
nor the names of its contributors may be used to endorse
|
||||
or promote products derived from this Software without specific prior
|
||||
written permission.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR
|
||||
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.
|
||||
|
||||
==============================================================================
|
||||
|
||||
This program uses portions of Node.js source code located in src/library_path.js,
|
||||
in accordance with the terms of the MIT license. Node's license follows:
|
||||
|
||||
"""
|
||||
Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
"""
|
||||
|
||||
The musl libc project is bundled in this repo, and it has the MIT license, see
|
||||
system/lib/libc/musl/COPYRIGHT
|
||||
|
||||
The third_party/ subdirectory contains code with other licenses. None of it is
|
||||
used by default, but certain options use it (e.g., the optional closure compiler
|
||||
flag will run closure compiler from third_party/).
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,714 @@
|
||||
/*
|
||||
* Copyright 2020 The Emscripten Authors. All rights reserved.
|
||||
* Emscripten is available under two separate licenses, the MIT license and the
|
||||
* University of Illinois/NCSA Open Source License. Both these licenses can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
#ifndef __emscripten_xmmintrin_h__
|
||||
#define __emscripten_xmmintrin_h__
|
||||
|
||||
#include <wasm_simd128.h>
|
||||
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef __SSE__
|
||||
#error "SSE instruction set not enabled"
|
||||
#endif
|
||||
|
||||
#ifdef WASM_SIMD_COMPAT_SLOW
|
||||
#define DIAGNOSE_SLOW diagnose_if(1, "Instruction emulated via slow path.", "warning")
|
||||
#else
|
||||
#define DIAGNOSE_SLOW
|
||||
#endif
|
||||
|
||||
// Emscripten SIMD support doesn't support MMX/float32x2/__m64.
|
||||
// However, we support loading and storing 2-vectors, so
|
||||
// recognize the type at least.
|
||||
typedef float __m64 __attribute__((__vector_size__(8), __aligned__(8)));
|
||||
typedef __f32x4 __m128;
|
||||
typedef v128_t __m128i;
|
||||
|
||||
#define __f32x4_shuffle(__a, __b, __c0, __c1, __c2, __c3) \
|
||||
((v128_t)(__builtin_shufflevector((__f32x4)(__a), (__f32x4)(__b), __c0, \
|
||||
__c1, __c2, __c3)))
|
||||
|
||||
// This is defined as a macro because __builtin_shufflevector requires its
|
||||
// mask argument to be a compile-time constant.
|
||||
#define _mm_shuffle_ps(__a, __b, __mask) __extension__ ({ \
|
||||
((__m128)__f32x4_shuffle(__a, __b, \
|
||||
(((__mask) >> 0) & 0x3) + 0, \
|
||||
(((__mask) >> 2) & 0x3) + 0, \
|
||||
(((__mask) >> 4) & 0x3) + 4, \
|
||||
(((__mask) >> 6) & 0x3) + 4)); })
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_set_ps(float __z, float __y, float __x, float __w)
|
||||
{
|
||||
return (__m128)wasm_f32x4_make(__w, __x, __y, __z);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_setr_ps(float __z, float __y, float __x, float __w)
|
||||
{
|
||||
return (__m128)wasm_f32x4_make(__z, __y, __x, __w);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_set_ss(float __w)
|
||||
{
|
||||
return (__m128)wasm_f32x4_make(__w, 0, 0, 0);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_set_ps1(float __w)
|
||||
{
|
||||
return (__m128)wasm_f32x4_splat(__w);
|
||||
}
|
||||
|
||||
#define _mm_set1_ps _mm_set_ps1
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_setzero_ps(void)
|
||||
{
|
||||
return (__m128)wasm_f32x4_const(0.f, 0.f, 0.f, 0.f);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_load_ps(const float *__p)
|
||||
{
|
||||
return *(__m128*)__p;
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_loadl_pi(__m128 __a, const void /*__m64*/ *__p)
|
||||
{
|
||||
return (__m128)wasm_v128_load64_lane(__p, (v128_t)__a, 0);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_loadh_pi(__m128 __a, const void /*__m64*/ *__p)
|
||||
{
|
||||
return (__m128)wasm_v128_load64_lane(__p, (v128_t)__a, 1);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_loadr_ps(const float *__p)
|
||||
{
|
||||
__m128 __v = _mm_load_ps(__p);
|
||||
return (__m128)__f32x4_shuffle(__v, __v, 3, 2, 1, 0);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_loadu_ps(const float *__p)
|
||||
{
|
||||
return (__m128)wasm_v128_load(__p);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_load_ps1(const float *__p)
|
||||
{
|
||||
return (__m128)wasm_v32x4_load_splat(__p);
|
||||
}
|
||||
#define _mm_load1_ps _mm_load_ps1
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_load_ss(const float *__p)
|
||||
{
|
||||
return (__m128)wasm_v128_load32_zero(__p);
|
||||
}
|
||||
|
||||
static __inline__ void __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_storel_pi(__m64 *__p, __m128 __a)
|
||||
{
|
||||
wasm_v128_store64_lane((void*)__p, (v128_t)__a, 0);
|
||||
}
|
||||
|
||||
static __inline__ void __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_storeh_pi(__m64 *__p, __m128 __a)
|
||||
{
|
||||
wasm_v128_store64_lane((void*)__p, (v128_t)__a, 1);
|
||||
}
|
||||
|
||||
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_store_ps(float *__p, __m128 __a)
|
||||
{
|
||||
*(__m128 *)__p = __a;
|
||||
}
|
||||
// No NTA cache hint available.
|
||||
#define _mm_stream_ps _mm_store_ps
|
||||
|
||||
#define _MM_HINT_T0 3
|
||||
#define _MM_HINT_T1 2
|
||||
#define _MM_HINT_T2 1
|
||||
#define _MM_HINT_NTA 0
|
||||
// No prefetch available, dummy it out.
|
||||
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_prefetch(const void *__p, int __i)
|
||||
{
|
||||
((void)__p);
|
||||
((void)__i);
|
||||
}
|
||||
|
||||
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_sfence(void)
|
||||
{
|
||||
// Wasm/SharedArrayBuffer memory model is sequentially consistent.
|
||||
// Perhaps a future version of the spec can provide a related fence.
|
||||
__sync_synchronize();
|
||||
}
|
||||
|
||||
#define _MM_SHUFFLE(w, z, y, x) (((w) << 6) | ((z) << 4) | ((y) << 2) | (x))
|
||||
|
||||
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_storer_ps(float *__p, __m128 __a)
|
||||
{
|
||||
_mm_store_ps(__p, _mm_shuffle_ps(__a, __a, _MM_SHUFFLE(0, 1, 2, 3)));
|
||||
}
|
||||
|
||||
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_store_ps1(float *__p, __m128 __a)
|
||||
{
|
||||
_mm_store_ps(__p, _mm_shuffle_ps(__a, __a, _MM_SHUFFLE(0, 0, 0, 0)));
|
||||
}
|
||||
#define _mm_store1_ps _mm_store_ps1
|
||||
|
||||
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_store_ss(float *__p, __m128 __a)
|
||||
{
|
||||
wasm_v128_store32_lane((void*)__p, (v128_t)__a, 0);
|
||||
}
|
||||
|
||||
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_storeu_ps(float *__p, __m128 __a)
|
||||
{
|
||||
struct __unaligned {
|
||||
__m128 __v;
|
||||
} __attribute__((__packed__, __may_alias__));
|
||||
((struct __unaligned *)__p)->__v = __a;
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_movemask_ps(__m128 __a)
|
||||
{
|
||||
return (int)wasm_i32x4_bitmask((v128_t)__a);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_move_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)__f32x4_shuffle(__a, __b, 4, 1, 2, 3);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_add_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_f32x4_add((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_add_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_add_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_sub_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_f32x4_sub((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_sub_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_sub_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_mul_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_f32x4_mul((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_mul_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_mul_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_div_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_f32x4_div((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_div_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_div_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_min_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
// return (__m128)wasm_f32x4_pmin((v128_t)__a, (v128_t)__b); // TODO: Migrate to this, once it works in VMs
|
||||
return (__m128)wasm_v128_bitselect((v128_t)__a, (v128_t)__b, (v128_t)wasm_f32x4_lt((v128_t)__a, (v128_t)__b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_min_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_min_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_max_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
// return (__m128)wasm_f32x4_pmax((v128_t)__a, (v128_t)__b); // TODO: Migrate to this, once it works in VMs
|
||||
return (__m128)wasm_v128_bitselect((v128_t)__a, (v128_t)__b, (v128_t)wasm_f32x4_gt((v128_t)__a, (v128_t)__b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_max_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_max_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_rcp_ps(__m128 __a)
|
||||
{
|
||||
return (__m128)wasm_f32x4_div((v128_t)_mm_set1_ps(1.0f), (v128_t)__a);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_rcp_ss(__m128 __a)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_rcp_ps(__a));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_sqrt_ps(__m128 __a)
|
||||
{
|
||||
return (__m128)wasm_f32x4_sqrt((v128_t)__a);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_sqrt_ss(__m128 __a)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_sqrt_ps(__a));
|
||||
}
|
||||
|
||||
#define _mm_rsqrt_ps(__a) _mm_rcp_ps(_mm_sqrt_ps((__a)))
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_rsqrt_ss(__m128 __a)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_rsqrt_ps(__a));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_unpackhi_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)__f32x4_shuffle(__a, __b, 2, 6, 3, 7);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_unpacklo_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)__f32x4_shuffle(__a, __b, 0, 4, 1, 5);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_movehl_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)__f32x4_shuffle(__a, __b, 6, 7, 2, 3);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_movelh_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)__f32x4_shuffle(__a, __b, 0, 1, 4, 5);
|
||||
}
|
||||
|
||||
#define _MM_TRANSPOSE4_PS(row0, row1, row2, row3) \
|
||||
do { \
|
||||
__m128 __row0 = (row0); \
|
||||
__m128 __row1 = (row1); \
|
||||
__m128 __row2 = (row2); \
|
||||
__m128 __row3 = (row3); \
|
||||
__m128 __tmp0 = _mm_unpacklo_ps(__row0, __row1); \
|
||||
__m128 __tmp1 = _mm_unpackhi_ps(__row0, __row1); \
|
||||
__m128 __tmp2 = _mm_unpacklo_ps(__row2, __row3); \
|
||||
__m128 __tmp3 = _mm_unpackhi_ps(__row2, __row3); \
|
||||
(row0) = _mm_movelh_ps(__tmp0, __tmp2); \
|
||||
(row1) = _mm_movehl_ps(__tmp2, __tmp0); \
|
||||
(row2) = _mm_movelh_ps(__tmp1, __tmp3); \
|
||||
(row3) = _mm_movehl_ps(__tmp3, __tmp1); \
|
||||
} while (0)
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmplt_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_f32x4_lt((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmplt_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmplt_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmple_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_f32x4_le((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmple_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmple_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpeq_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_f32x4_eq((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpeq_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmpeq_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpge_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_f32x4_ge((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpge_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmpge_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpgt_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_f32x4_gt((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpgt_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmpgt_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) _mm_cmpord_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_v128_and(wasm_f32x4_eq((v128_t)__a, (v128_t)__a),
|
||||
wasm_f32x4_eq((v128_t)__b, (v128_t)__b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) _mm_cmpord_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmpord_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) _mm_cmpunord_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_v128_or(wasm_f32x4_ne((v128_t)__a, (v128_t)__a),
|
||||
wasm_f32x4_ne((v128_t)__b, (v128_t)__b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) _mm_cmpunord_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmpunord_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_and_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_v128_and((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_andnot_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_v128_andnot((v128_t)__b, (v128_t)__a);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_or_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_v128_or((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_xor_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_v128_xor((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpneq_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_f32x4_ne((v128_t)__a, (v128_t)__b);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpneq_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmpneq_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpnge_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_v128_not((v128_t)_mm_cmpge_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpnge_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmpnge_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpngt_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_v128_not((v128_t)_mm_cmpgt_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpngt_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmpngt_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpnle_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_v128_not((v128_t)_mm_cmple_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpnle_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmpnle_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpnlt_ps(__m128 __a, __m128 __b)
|
||||
{
|
||||
return (__m128)wasm_v128_not((v128_t)_mm_cmplt_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cmpnlt_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return _mm_move_ss(__a, _mm_cmpnlt_ps(__a, __b));
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_comieq_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) == wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_comige_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) >= wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_comigt_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) > wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_comile_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) <= wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_comilt_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) < wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_comineq_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) != wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_ucomieq_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) == wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_ucomige_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) >= wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_ucomigt_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) > wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_ucomile_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) <= wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_ucomilt_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) < wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_ucomineq_ss(__m128 __a, __m128 __b)
|
||||
{
|
||||
return wasm_f32x4_extract_lane((v128_t)__a, 0) != wasm_f32x4_extract_lane((v128_t)__b, 0);
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_cvtsi32_ss(__m128 __a, int __b)
|
||||
{
|
||||
__f32x4 __v = (__f32x4)__a;
|
||||
__v[0] = (float)__b;
|
||||
return (__m128)__v;
|
||||
}
|
||||
#define _mm_cvt_si2ss _mm_cvtsi32_ss
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) _mm_cvtss_si32(__m128 __a)
|
||||
{
|
||||
float e = ((__f32x4)__a)[0];
|
||||
if (e < 2147483648.0f && e >= -2147483648.0f && (lrint(e) != 0 || fabsf(e) < 2.f))
|
||||
return lrint(e);
|
||||
else
|
||||
return (int)0x80000000;
|
||||
}
|
||||
#define _mm_cvt_ss2si _mm_cvtss_si32
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) _mm_cvttss_si32(__m128 __a)
|
||||
{
|
||||
float e = ((__f32x4)__a)[0];
|
||||
if (e < 2147483648.0f && e >= -2147483648.0f && (lrint(e) != 0 || fabsf(e) < 2.f))
|
||||
return (int)e;
|
||||
else
|
||||
return (int)0x80000000;
|
||||
}
|
||||
#define _mm_cvtt_ss2si _mm_cvttss_si32
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_cvtsi64_ss(__m128 __a, long long __b)
|
||||
{
|
||||
__f32x4 __v = (__f32x4)__a;
|
||||
__v[0] = (float)__b;
|
||||
return (__m128)__v;
|
||||
}
|
||||
|
||||
static __inline__ long long __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_cvtss_si64(__m128 __a)
|
||||
{
|
||||
float e = ((__f32x4)__a)[0];
|
||||
long long x = llrintf(e);
|
||||
if (e <= LLONG_MAX && e >= LLONG_MIN && (x != 0 || fabsf(e) < 2.f))
|
||||
return x;
|
||||
else
|
||||
return 0x8000000000000000LL;
|
||||
}
|
||||
|
||||
static __inline__ long long __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW))
|
||||
_mm_cvttss_si64(__m128 __a)
|
||||
{
|
||||
float e = ((__f32x4)__a)[0];
|
||||
long long x = llrintf(e);
|
||||
if (e <= LLONG_MAX && e >= LLONG_MIN && (x != 0 || fabsf(e) < 2.f))
|
||||
return (long long)e;
|
||||
else
|
||||
return 0x8000000000000000LL;
|
||||
}
|
||||
|
||||
static __inline__ float __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_cvtss_f32(__m128 __a)
|
||||
{
|
||||
return (float)((__f32x4)__a)[0];
|
||||
}
|
||||
|
||||
#define _mm_malloc(__size, __align) memalign((__align), (__size))
|
||||
#define _mm_free free
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_undefined()
|
||||
{
|
||||
__m128 val;
|
||||
return val;
|
||||
}
|
||||
|
||||
static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_undefined_ps()
|
||||
{
|
||||
__m128 val;
|
||||
return val;
|
||||
}
|
||||
|
||||
#define _MM_EXCEPT_MASK 0x003f
|
||||
#define _MM_EXCEPT_INVALID 0x0001
|
||||
#define _MM_EXCEPT_DENORM 0x0002
|
||||
#define _MM_EXCEPT_DIV_ZERO 0x0004
|
||||
#define _MM_EXCEPT_OVERFLOW 0x0008
|
||||
#define _MM_EXCEPT_UNDERFLOW 0x0010
|
||||
#define _MM_EXCEPT_INEXACT 0x0020
|
||||
|
||||
#define _MM_MASK_MASK 0x1f80
|
||||
#define _MM_MASK_INVALID 0x0080
|
||||
#define _MM_MASK_DENORM 0x0100
|
||||
#define _MM_MASK_DIV_ZERO 0x0200
|
||||
#define _MM_MASK_OVERFLOW 0x0400
|
||||
#define _MM_MASK_UNDERFLOW 0x0800
|
||||
#define _MM_MASK_INEXACT 0x1000
|
||||
|
||||
#define _MM_ROUND_MASK 0x6000
|
||||
#define _MM_ROUND_NEAREST 0x0000
|
||||
#define _MM_ROUND_DOWN 0x2000
|
||||
#define _MM_ROUND_UP 0x4000
|
||||
#define _MM_ROUND_TOWARD_ZERO 0x6000
|
||||
|
||||
#define _MM_FLUSH_ZERO_MASK 0x8000
|
||||
#define _MM_FLUSH_ZERO_ON 0x8000
|
||||
#define _MM_FLUSH_ZERO_OFF 0x0000
|
||||
|
||||
static __inline__ int __attribute__((__always_inline__, __nodebug__))
|
||||
_mm_getcsr()
|
||||
{
|
||||
return _MM_MASK_INEXACT | _MM_MASK_DENORM | _MM_MASK_DIV_ZERO | _MM_MASK_OVERFLOW | _MM_MASK_UNDERFLOW | _MM_MASK_INVALID
|
||||
| _MM_ROUND_NEAREST | _MM_FLUSH_ZERO_OFF;
|
||||
}
|
||||
|
||||
#define _MM_GET_EXCEPTION_STATE() (_mm_getcsr() & _MM_EXCEPT_MASK)
|
||||
#define _MM_GET_EXCEPTION_MASK() (_mm_getcsr() & _MM_MASK_MASK)
|
||||
#define _MM_GET_ROUNDING_MODE() (_mm_getcsr() & _MM_ROUND_MASK)
|
||||
#define _MM_GET_FLUSH_ZERO_MODE() (_mm_getcsr() & _MM_FLUSH_ZERO_MASK)
|
||||
|
||||
// Unavailable functions:
|
||||
// void _MM_SET_EXCEPTION_STATE(unsigned int __a);
|
||||
// void _MM_SET_EXCEPTION_MASK(unsigned int __a);
|
||||
// void _MM_GET_ROUNDING_MODE(unsigned int __a);
|
||||
// void _MM_GET_FLUSH_ZERO_MODE(unsigned int __a);
|
||||
|
||||
#endif /* __emscripten_xmmintrin_h__ */
|
||||
@@ -0,0 +1,327 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
|
||||
mod shim;
|
||||
|
||||
use libwebp_sys as ffi;
|
||||
use std::ffi::CStr;
|
||||
use std::ptr;
|
||||
use wasm_bindgen::prelude::*;
|
||||
|
||||
const DEMUX_ABI: i32 = ffi::WEBP_DEMUX_ABI_VERSION as i32;
|
||||
const MUX_ABI: i32 = ffi::WEBP_MUX_ABI_VERSION as i32;
|
||||
const ENCODER_ABI: i32 = ffi::WEBP_ENCODER_ABI_VERSION as i32;
|
||||
const DECODER_ABI: i32 = ffi::WEBP_DECODER_ABI_VERSION as i32;
|
||||
const LOSSLESS_FORMAT: i32 = 2;
|
||||
|
||||
fn webp_data(bytes: &[u8]) -> ffi::WebPData {
|
||||
ffi::WebPData {
|
||||
bytes: bytes.as_ptr(),
|
||||
size: bytes.len(),
|
||||
}
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub fn webp_probe(bytes: &[u8]) -> Result<Box<[u32]>, JsError> {
|
||||
let data = webp_data(bytes);
|
||||
let dmux = unsafe { ffi::WebPDemuxInternal(&data, 0, ptr::null_mut(), DEMUX_ABI) };
|
||||
if dmux.is_null() {
|
||||
return Err(JsError::new("webp demux failed"));
|
||||
}
|
||||
let get = |feature| unsafe { ffi::WebPDemuxGetI(dmux, feature) };
|
||||
let width = get(ffi::WebPFormatFeature::WEBP_FF_CANVAS_WIDTH);
|
||||
let height = get(ffi::WebPFormatFeature::WEBP_FF_CANVAS_HEIGHT);
|
||||
let frame_count = get(ffi::WebPFormatFeature::WEBP_FF_FRAME_COUNT);
|
||||
let loop_count = get(ffi::WebPFormatFeature::WEBP_FF_LOOP_COUNT);
|
||||
let flags = get(ffi::WebPFormatFeature::WEBP_FF_FORMAT_FLAGS);
|
||||
let has_alpha = flags & ffi::WebPFeatureFlags::ALPHA_FLAG as u32 != 0;
|
||||
let all_lossless = unsafe { all_frames_lossless(dmux) };
|
||||
unsafe { ffi::WebPDemuxDelete(dmux) };
|
||||
Ok(Box::new([
|
||||
width,
|
||||
height,
|
||||
frame_count,
|
||||
loop_count,
|
||||
has_alpha as u32,
|
||||
all_lossless as u32,
|
||||
]))
|
||||
}
|
||||
|
||||
unsafe fn all_frames_lossless(dmux: *const ffi::WebPDemuxer) -> bool {
|
||||
unsafe {
|
||||
let mut iter: ffi::WebPIterator = std::mem::zeroed();
|
||||
if ffi::WebPDemuxGetFrame(dmux, 1, &mut iter) == 0 {
|
||||
return false;
|
||||
}
|
||||
let mut lossless = true;
|
||||
loop {
|
||||
let mut features: ffi::WebPBitstreamFeatures = std::mem::zeroed();
|
||||
let status = ffi::WebPGetFeaturesInternal(
|
||||
iter.fragment.bytes,
|
||||
iter.fragment.size,
|
||||
&mut features,
|
||||
DECODER_ABI,
|
||||
);
|
||||
if status != ffi::VP8StatusCode::VP8_STATUS_OK || features.format != LOSSLESS_FORMAT {
|
||||
lossless = false;
|
||||
break;
|
||||
}
|
||||
if ffi::WebPDemuxNextFrame(&mut iter) == 0 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
ffi::WebPDemuxReleaseIterator(&mut iter);
|
||||
lossless
|
||||
}
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub struct AnimDecoder {
|
||||
dec: *mut ffi::WebPAnimDecoder,
|
||||
_bytes: Box<[u8]>,
|
||||
frame: *mut u8,
|
||||
timestamp: i32,
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
impl AnimDecoder {
|
||||
#[wasm_bindgen(constructor)]
|
||||
pub fn new(bytes: Box<[u8]>) -> Result<AnimDecoder, JsError> {
|
||||
let dec = unsafe {
|
||||
let mut options: ffi::WebPAnimDecoderOptions = std::mem::zeroed();
|
||||
if ffi::WebPAnimDecoderOptionsInitInternal(&mut options, DEMUX_ABI) == 0 {
|
||||
return Err(JsError::new("webp decoder options init failed"));
|
||||
}
|
||||
options.color_mode = ffi::WEBP_CSP_MODE::MODE_RGBA;
|
||||
options.use_threads = 0;
|
||||
let data = webp_data(&bytes);
|
||||
ffi::WebPAnimDecoderNewInternal(&data, &options, DEMUX_ABI)
|
||||
};
|
||||
if dec.is_null() {
|
||||
return Err(JsError::new("webp decoder init failed"));
|
||||
}
|
||||
Ok(AnimDecoder {
|
||||
dec,
|
||||
_bytes: bytes,
|
||||
frame: ptr::null_mut(),
|
||||
timestamp: 0,
|
||||
})
|
||||
}
|
||||
|
||||
#[wasm_bindgen(js_name = next)]
|
||||
pub fn next_frame(&mut self) -> Result<bool, JsError> {
|
||||
if unsafe { ffi::WebPAnimDecoderHasMoreFrames(self.dec) } == 0 {
|
||||
return Ok(false);
|
||||
}
|
||||
let mut frame = ptr::null_mut();
|
||||
let mut timestamp = 0;
|
||||
if unsafe { ffi::WebPAnimDecoderGetNext(self.dec, &mut frame, &mut timestamp) } == 0 {
|
||||
return Err(JsError::new("webp frame decode failed"));
|
||||
}
|
||||
self.frame = frame;
|
||||
self.timestamp = timestamp;
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
#[wasm_bindgen(getter)]
|
||||
pub fn frame_ptr(&self) -> u32 {
|
||||
self.frame as usize as u32
|
||||
}
|
||||
|
||||
#[wasm_bindgen(getter)]
|
||||
pub fn end_timestamp(&self) -> i32 {
|
||||
self.timestamp
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for AnimDecoder {
|
||||
fn drop(&mut self) {
|
||||
unsafe { ffi::WebPAnimDecoderDelete(self.dec) };
|
||||
}
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub struct AnimEncoder {
|
||||
enc: *mut ffi::WebPAnimEncoder,
|
||||
width: u32,
|
||||
height: u32,
|
||||
lossless: bool,
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
impl AnimEncoder {
|
||||
#[wasm_bindgen(constructor)]
|
||||
pub fn new(
|
||||
width: u32,
|
||||
height: u32,
|
||||
loop_count: u32,
|
||||
lossless: bool,
|
||||
) -> Result<AnimEncoder, JsError> {
|
||||
let (kmin, kmax) = if lossless { (9, 17) } else { (4, 5) };
|
||||
let enc = unsafe {
|
||||
let mut options: ffi::WebPAnimEncoderOptions = std::mem::zeroed();
|
||||
if ffi::WebPAnimEncoderOptionsInitInternal(&mut options, MUX_ABI) == 0 {
|
||||
return Err(JsError::new("webp encoder options init failed"));
|
||||
}
|
||||
options.anim_params.loop_count = loop_count.min(i32::MAX as u32) as i32;
|
||||
options.anim_params.bgcolor = 0;
|
||||
options.minimize_size = 0;
|
||||
options.allow_mixed = 0;
|
||||
options.kmin = kmin;
|
||||
options.kmax = kmax;
|
||||
ffi::WebPAnimEncoderNewInternal(width as i32, height as i32, &options, MUX_ABI)
|
||||
};
|
||||
if enc.is_null() {
|
||||
return Err(JsError::new("webp encoder init failed"));
|
||||
}
|
||||
Ok(AnimEncoder {
|
||||
enc,
|
||||
width,
|
||||
height,
|
||||
lossless,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn add(
|
||||
&mut self,
|
||||
rgba: &[u8],
|
||||
start_ms: i32,
|
||||
quality: f32,
|
||||
method: i32,
|
||||
) -> Result<(), JsError> {
|
||||
if rgba.len() as u64 != u64::from(self.width) * u64::from(self.height) * 4 {
|
||||
return Err(JsError::new("webp frame size mismatch"));
|
||||
}
|
||||
let added = unsafe {
|
||||
let mut config: ffi::WebPConfig = std::mem::zeroed();
|
||||
if ffi::WebPConfigInitInternal(
|
||||
&mut config,
|
||||
ffi::WebPPreset::WEBP_PRESET_DEFAULT,
|
||||
quality,
|
||||
ENCODER_ABI,
|
||||
) == 0
|
||||
{
|
||||
return Err(JsError::new("webp config init failed"));
|
||||
}
|
||||
config.quality = quality;
|
||||
config.method = method;
|
||||
config.lossless = self.lossless as i32;
|
||||
config.thread_level = 0;
|
||||
config.alpha_quality = 100;
|
||||
config.exact = 0;
|
||||
config.use_sharp_yuv = 0;
|
||||
let mut picture: ffi::WebPPicture = std::mem::zeroed();
|
||||
if ffi::WebPPictureInitInternal(&mut picture, ENCODER_ABI) == 0 {
|
||||
return Err(JsError::new("webp picture init failed"));
|
||||
}
|
||||
picture.width = self.width as i32;
|
||||
picture.height = self.height as i32;
|
||||
picture.use_argb = 1;
|
||||
if ffi::WebPPictureImportRGBA(&mut picture, rgba.as_ptr(), self.width as i32 * 4) == 0 {
|
||||
ffi::WebPPictureFree(&mut picture);
|
||||
return Err(JsError::new("webp picture import failed"));
|
||||
}
|
||||
let added = ffi::WebPAnimEncoderAdd(self.enc, &mut picture, start_ms, &config);
|
||||
ffi::WebPPictureFree(&mut picture);
|
||||
added
|
||||
};
|
||||
if added == 0 {
|
||||
return Err(self.error("webp frame encode failed"));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn finish(&mut self, end_ms: i32) -> Result<Vec<u8>, JsError> {
|
||||
if unsafe { ffi::WebPAnimEncoderAdd(self.enc, ptr::null_mut(), end_ms, ptr::null()) } == 0 {
|
||||
return Err(self.error("webp encoder flush failed"));
|
||||
}
|
||||
let mut data = ffi::WebPData::default();
|
||||
if unsafe { ffi::WebPAnimEncoderAssemble(self.enc, &mut data) } == 0 {
|
||||
return Err(self.error("webp assemble failed"));
|
||||
}
|
||||
let out = unsafe { std::slice::from_raw_parts(data.bytes, data.size) }.to_vec();
|
||||
unsafe { ffi::WebPFree(data.bytes as *mut _) };
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
fn error(&self, what: &str) -> JsError {
|
||||
let message = unsafe { ffi::WebPAnimEncoderGetError(self.enc) };
|
||||
if message.is_null() {
|
||||
return JsError::new(what);
|
||||
}
|
||||
let detail = unsafe { CStr::from_ptr(message) }.to_string_lossy();
|
||||
JsError::new(&format!("{what}: {detail}"))
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for AnimEncoder {
|
||||
fn drop(&mut self) {
|
||||
unsafe { ffi::WebPAnimEncoderDelete(self.enc) };
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
fn frame(width: u32, height: u32, seed: u8) -> Vec<u8> {
|
||||
(0..width * height)
|
||||
.flat_map(|index| {
|
||||
let value = (index as u8).wrapping_mul(seed);
|
||||
[
|
||||
value,
|
||||
seed,
|
||||
value ^ seed,
|
||||
if index % 3 == 0 { 0 } else { 255 },
|
||||
]
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn encode(lossless: bool) -> Vec<u8> {
|
||||
let mut encoder = AnimEncoder::new(16, 8, 3, lossless).expect("encoder");
|
||||
let delays = [40, 70, 10];
|
||||
let mut start = 0;
|
||||
for (index, delay) in delays.iter().enumerate() {
|
||||
encoder
|
||||
.add(&frame(16, 8, index as u8 + 1), start, 75.0, 4)
|
||||
.expect("add");
|
||||
start += delay;
|
||||
}
|
||||
encoder.finish(start).expect("finish")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn probe_reports_canvas_frames_loop_alpha_and_lossless() {
|
||||
let lossless = encode(true);
|
||||
assert_eq!(
|
||||
&*webp_probe(&lossless).expect("probe"),
|
||||
&[16, 8, 3, 3, 1, 1]
|
||||
);
|
||||
let lossy = encode(false);
|
||||
let probe = webp_probe(&lossy).expect("probe");
|
||||
assert_eq!(&probe[..5], &[16, 8, 3, 3, 1]);
|
||||
assert_eq!(probe[5], 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lossless_round_trip_keeps_pixels_and_end_timestamps() {
|
||||
let bytes = encode(true);
|
||||
let mut decoder = AnimDecoder::new(bytes.into_boxed_slice()).expect("decoder");
|
||||
let mut ends = Vec::new();
|
||||
let mut index = 0u8;
|
||||
while decoder.next_frame().expect("next") {
|
||||
let pixels = unsafe { std::slice::from_raw_parts(decoder.frame, 16 * 8 * 4) };
|
||||
let expected = frame(16, 8, index + 1);
|
||||
for (got, want) in pixels.chunks(4).zip(expected.chunks(4)) {
|
||||
assert_eq!(got[3], want[3]);
|
||||
if want[3] != 0 {
|
||||
assert_eq!(got, want);
|
||||
}
|
||||
}
|
||||
ends.push(decoder.end_timestamp());
|
||||
index += 1;
|
||||
}
|
||||
assert_eq!(ends, [40, 110, 120]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
use std::alloc::{Layout, alloc, alloc_zeroed, dealloc};
|
||||
use std::ffi::{c_int, c_void};
|
||||
|
||||
const ALIGN: usize = 16;
|
||||
|
||||
unsafe fn shim_alloc(size: usize, zeroed: bool) -> *mut c_void {
|
||||
let Some(full) = size.checked_add(ALIGN) else {
|
||||
return std::ptr::null_mut();
|
||||
};
|
||||
let Ok(layout) = Layout::from_size_align(full, ALIGN) else {
|
||||
return std::ptr::null_mut();
|
||||
};
|
||||
unsafe {
|
||||
let ptr = if zeroed {
|
||||
alloc_zeroed(layout)
|
||||
} else {
|
||||
alloc(layout)
|
||||
};
|
||||
if ptr.is_null() {
|
||||
return std::ptr::null_mut();
|
||||
}
|
||||
ptr.cast::<usize>().write(full);
|
||||
ptr.add(ALIGN).cast()
|
||||
}
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub unsafe extern "C" fn fluxwebp_shim_malloc(size: usize) -> *mut c_void {
|
||||
unsafe { shim_alloc(size, false) }
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub unsafe extern "C" fn fluxwebp_shim_calloc(nmemb: usize, size: usize) -> *mut c_void {
|
||||
match nmemb.checked_mul(size) {
|
||||
Some(total) => unsafe { shim_alloc(total, true) },
|
||||
None => std::ptr::null_mut(),
|
||||
}
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub unsafe extern "C" fn fluxwebp_shim_free(ptr: *mut c_void) {
|
||||
if ptr.is_null() {
|
||||
return;
|
||||
}
|
||||
unsafe {
|
||||
let base = ptr.cast::<u8>().sub(ALIGN);
|
||||
let full = base.cast::<usize>().read();
|
||||
dealloc(base, Layout::from_size_align_unchecked(full, ALIGN));
|
||||
}
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub unsafe extern "C" fn fluxwebp_shim_qsort(
|
||||
base: *mut c_void,
|
||||
n: usize,
|
||||
size: usize,
|
||||
compar: unsafe extern "C" fn(*const c_void, *const c_void) -> c_int,
|
||||
) {
|
||||
if n < 2 || size == 0 {
|
||||
return;
|
||||
}
|
||||
unsafe {
|
||||
let bytes = std::slice::from_raw_parts_mut(base.cast::<u8>(), n * size);
|
||||
let copy = bytes.to_vec();
|
||||
let mut idx: Vec<usize> = (0..n).collect();
|
||||
idx.sort_by(|&a, &b| {
|
||||
let r = compar(
|
||||
copy.as_ptr().add(a * size).cast(),
|
||||
copy.as_ptr().add(b * size).cast(),
|
||||
);
|
||||
r.cmp(&0)
|
||||
});
|
||||
for (dst, &src) in idx.iter().enumerate() {
|
||||
bytes[dst * size..dst * size + size]
|
||||
.copy_from_slice(©[src * size..src * size + size]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn fluxwebp_shim_pow(x: f64, y: f64) -> f64 {
|
||||
x.powf(y)
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn fluxwebp_shim_log(x: f64) -> f64 {
|
||||
x.ln()
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn fluxwebp_shim_log10(x: f64) -> f64 {
|
||||
x.log10()
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn fluxwebp_shim_expf(x: f32) -> f32 {
|
||||
x.exp()
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn fluxwebp_shim_logf(x: f32) -> f32 {
|
||||
x.ln()
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn fluxwebp_shim_round(x: f64) -> f64 {
|
||||
x.round()
|
||||
}
|
||||
@@ -11,6 +11,18 @@ const FONT_LICENSE_FILES = [
|
||||
{source: 'LICENSE-IBM-PLEX.txt', asset: 'assets/fonts-LICENSE-IBM-PLEX.txt'},
|
||||
];
|
||||
|
||||
const WASM_LICENSE_FILES = [
|
||||
{source: 'libfluxcore/NOTICE.md', asset: 'assets/libfluxcore-NOTICE.txt'},
|
||||
{source: 'libfluxcore/LICENSE-ZSTD.txt', asset: 'assets/libfluxcore-LICENSE-ZSTD.txt'},
|
||||
{source: 'libfluxcore/LICENSE-ZSTD-SYS.txt', asset: 'assets/libfluxcore-LICENSE-ZSTD-SYS.txt'},
|
||||
{source: 'libfluxcore/LICENSE-ZSTD-RS.txt', asset: 'assets/libfluxcore-LICENSE-ZSTD-RS.txt'},
|
||||
{source: 'libfluxwebp/NOTICE.md', asset: 'assets/libfluxwebp-NOTICE.txt'},
|
||||
{source: 'libfluxwebp/LICENSE-LIBWEBP.txt', asset: 'assets/libfluxwebp-LICENSE-LIBWEBP.txt'},
|
||||
{source: 'libfluxwebp/PATENTS-LIBWEBP.txt', asset: 'assets/libfluxwebp-PATENTS-LIBWEBP.txt'},
|
||||
{source: 'libfluxwebp/LICENSE-LIBWEBP-SYS.txt', asset: 'assets/libfluxwebp-LICENSE-LIBWEBP-SYS.txt'},
|
||||
{source: 'libfluxwebp/simd/LICENSE', asset: 'assets/libfluxwebp-LICENSE-EMSCRIPTEN.txt'},
|
||||
];
|
||||
|
||||
function resolveStaticCdnEndpoint(staticCdnEndpoint) {
|
||||
const value = staticCdnEndpoint?.trim().replace(/\/+$/, '');
|
||||
return value || STATIC_CDN_ENDPOINT_PLACEHOLDER;
|
||||
@@ -86,17 +98,18 @@ export class StaticFilesPlugin {
|
||||
constructor(options = {}) {
|
||||
this.staticCdnEndpoint = options.staticCdnEndpoint;
|
||||
this.fontsDir = options.fontsDir;
|
||||
this.wasmCratesDir = options.wasmCratesDir;
|
||||
}
|
||||
|
||||
emitFontLicenses(compilation) {
|
||||
if (!this.fontsDir) {
|
||||
emitLicenseFiles(compilation, dir, files, subject) {
|
||||
if (!dir) {
|
||||
return;
|
||||
}
|
||||
for (const {source, asset} of FONT_LICENSE_FILES) {
|
||||
const sourcePath = path.join(this.fontsDir, source);
|
||||
for (const {source, asset} of files) {
|
||||
const sourcePath = path.join(dir, source);
|
||||
if (!fs.existsSync(sourcePath)) {
|
||||
throw new Error(
|
||||
`StaticFilesPlugin: ${sourcePath} is missing. The bundled fonts may not be redistributed without it.`,
|
||||
`StaticFilesPlugin: ${sourcePath} is missing. The bundled ${subject} may not be redistributed without it.`,
|
||||
);
|
||||
}
|
||||
compilation.emitAsset(asset, new sources.RawSource(fs.readFileSync(sourcePath)));
|
||||
@@ -117,7 +130,8 @@ export class StaticFilesPlugin {
|
||||
new sources.RawSource(generateBrowserConfig(this.staticCdnEndpoint)),
|
||||
);
|
||||
compilation.emitAsset('robots.txt', new sources.RawSource(generateRobotsTxt()));
|
||||
this.emitFontLicenses(compilation);
|
||||
this.emitLicenseFiles(compilation, this.fontsDir, FONT_LICENSE_FILES, 'fonts');
|
||||
this.emitLicenseFiles(compilation, this.wasmCratesDir, WASM_LICENSE_FILES, 'WebAssembly modules');
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
@@ -418,6 +418,16 @@ function formatGuildChannelDetail(guild: Guild | undefined, channel: Channel): s
|
||||
return detail === '' ? null : detail;
|
||||
}
|
||||
|
||||
function formatGroupDMDetail(channel: Channel): string | null {
|
||||
if (channel.type !== ChannelTypes.GROUP_DM || (channel.name?.trim() ?? '') === '') return null;
|
||||
const names: Array<string> = [];
|
||||
for (const recipientId of channel.recipientIds) {
|
||||
const recipient = Users.getUser(recipientId);
|
||||
if (recipient != null) names.push(NicknameUtils.getNickname(recipient, null, channel.id));
|
||||
}
|
||||
return names.length === 0 ? null : names.join(', ');
|
||||
}
|
||||
|
||||
function resolveGuildChannelDisableReason(
|
||||
channel: Channel,
|
||||
guild: Guild | undefined,
|
||||
@@ -469,7 +479,7 @@ function resolveForwardDestinationOption(
|
||||
return Object.freeze({
|
||||
channel,
|
||||
destination,
|
||||
detail: null,
|
||||
detail: formatGroupDMDetail(channel),
|
||||
disableReason: resolveAgeRestrictedDisableReason(channel, mediaNeeds, i18n),
|
||||
displayName: ChannelUtils.getDMDisplayName(channel),
|
||||
key,
|
||||
|
||||
@@ -20,6 +20,10 @@ export function hasRichEmbedContent(embed: RichEmbedContentFields): boolean {
|
||||
);
|
||||
}
|
||||
|
||||
export function embedAllowsMarkdown(embed: Pick<MessageEmbed, 'type'>): boolean {
|
||||
return embed.type === MessageEmbedTypes.RICH || embed.type === MessageEmbedTypes.BLUESKY;
|
||||
}
|
||||
|
||||
type MediaOnlyEmbedFields = RichEmbedContentFields & Pick<MessageEmbed, 'image' | 'thumbnail' | 'video' | 'audio'>;
|
||||
|
||||
export function isMediaOnlyEmbed(embed: MediaOnlyEmbedFields): boolean {
|
||||
|
||||
@@ -205,6 +205,7 @@ export const BlueskyEmbed: FC<BlueskyEmbedProps> = observer(
|
||||
<EmbedTitle
|
||||
title={embed.title}
|
||||
url={embed.url}
|
||||
markdown
|
||||
messageId={message.id}
|
||||
channelId={message.channelId}
|
||||
data-flx="channel.embeds.channel-embed.bluesky-embed.embed-title"
|
||||
@@ -212,6 +213,7 @@ export const BlueskyEmbed: FC<BlueskyEmbedProps> = observer(
|
||||
)}
|
||||
<EmbedDescription
|
||||
description={embed.description}
|
||||
markdown
|
||||
messageId={message.id}
|
||||
channelId={message.channelId}
|
||||
data-flx="channel.embeds.channel-embed.bluesky-embed.embed-description"
|
||||
@@ -255,8 +257,6 @@ export const BlueskyEmbed: FC<BlueskyEmbedProps> = observer(
|
||||
<EmbedFooterComponent
|
||||
footer={embed.footer}
|
||||
timestamp={embed.timestamp ? new Date(embed.timestamp) : undefined}
|
||||
messageId={message.id}
|
||||
channelId={message.channelId}
|
||||
data-flx="channel.embeds.channel-embed.bluesky-embed.embed-footer-component"
|
||||
/>
|
||||
)}
|
||||
|
||||
@@ -69,47 +69,58 @@ export const EmbedAuthorComponent: FC<{author?: EmbedAuthor}> = observer(({autho
|
||||
</div>
|
||||
);
|
||||
});
|
||||
export const EmbedTitle: FC<{title?: string; url?: string; messageId?: string; channelId?: string}> = observer(
|
||||
({title, url, messageId, channelId}) => {
|
||||
if (title == null || title.length === 0) return null;
|
||||
const options = {
|
||||
context: MarkdownContext.RESTRICTED_INLINE_REPLY,
|
||||
messageId,
|
||||
channelId,
|
||||
disableEmojiInteractions: Boolean(url),
|
||||
};
|
||||
return (
|
||||
<div className={styles.embedTitle} data-flx="channel.embeds.embed.embed-title.embed-title">
|
||||
{url ? (
|
||||
<EmbedLink url={url} data-flx="channel.embeds.channel-embed.embed-parts.embed-title.embed-link">
|
||||
<SafeMarkdown content={title} options={options} data-flx="channel.embeds.embed.embed-title.safe-markdown" />
|
||||
</EmbedLink>
|
||||
) : (
|
||||
<span data-flx="channel.embeds.embed.embed-title.span">
|
||||
<SafeMarkdown
|
||||
content={title}
|
||||
options={options}
|
||||
data-flx="channel.embeds.embed.embed-title.safe-markdown--2"
|
||||
/>
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
},
|
||||
);
|
||||
export const EmbedTitle: FC<{
|
||||
title?: string;
|
||||
url?: string;
|
||||
markdown: boolean;
|
||||
messageId?: string;
|
||||
channelId?: string;
|
||||
}> = observer(({title, url, markdown, messageId, channelId}) => {
|
||||
if (title == null || title.length === 0) return null;
|
||||
const content = markdown ? (
|
||||
<SafeMarkdown
|
||||
content={title}
|
||||
options={{
|
||||
context: MarkdownContext.RESTRICTED_INLINE_REPLY,
|
||||
messageId,
|
||||
channelId,
|
||||
disableEmojiInteractions: Boolean(url),
|
||||
}}
|
||||
data-flx="channel.embeds.embed.embed-title.safe-markdown"
|
||||
/>
|
||||
) : (
|
||||
title
|
||||
);
|
||||
return (
|
||||
<div className={styles.embedTitle} data-flx="channel.embeds.embed.embed-title.embed-title">
|
||||
{url ? (
|
||||
<EmbedLink url={url} data-flx="channel.embeds.channel-embed.embed-parts.embed-title.embed-link">
|
||||
{content}
|
||||
</EmbedLink>
|
||||
) : (
|
||||
<span data-flx="channel.embeds.embed.embed-title.span">{content}</span>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
export const EmbedDescription: FC<{
|
||||
messageId?: string;
|
||||
channelId?: string;
|
||||
description?: string;
|
||||
}> = observer(({messageId, channelId, description}) => {
|
||||
markdown: boolean;
|
||||
}> = observer(({messageId, channelId, description, markdown}) => {
|
||||
if (!description) return null;
|
||||
return (
|
||||
<div className={styles.embedDescription} data-flx="channel.embeds.embed.embed-description.embed-description">
|
||||
<SafeMarkdown
|
||||
content={description}
|
||||
options={{context: MarkdownContext.RESTRICTED_EMBED_DESCRIPTION, messageId, channelId}}
|
||||
data-flx="channel.embeds.embed.embed-description.safe-markdown"
|
||||
/>
|
||||
{markdown ? (
|
||||
<SafeMarkdown
|
||||
content={description}
|
||||
options={{context: MarkdownContext.RESTRICTED_EMBED_DESCRIPTION, messageId, channelId}}
|
||||
data-flx="channel.embeds.embed.embed-description.safe-markdown"
|
||||
/>
|
||||
) : (
|
||||
description
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
@@ -182,9 +193,7 @@ export const EmbedFields: FC<{fields?: ReadonlyArray<EmbedField>; messageId?: st
|
||||
export const EmbedFooterComponent: FC<{
|
||||
timestamp?: Date;
|
||||
footer?: EmbedFooter;
|
||||
messageId?: string;
|
||||
channelId?: string;
|
||||
}> = observer(({timestamp, footer, messageId, channelId}) => {
|
||||
}> = observer(({timestamp, footer}) => {
|
||||
const {i18n} = useLingui();
|
||||
const allowIconMotion = useShouldAnimate({kind: 'gif'});
|
||||
const formattedTimestamp = timestamp ? DateUtils.getRelativeDateString(timestamp, i18n) : undefined;
|
||||
@@ -206,13 +215,7 @@ export const EmbedFooterComponent: FC<{
|
||||
/>
|
||||
)}
|
||||
<div className={styles.embedFooterText} data-flx="channel.embeds.embed.embed-footer-component.embed-footer-text">
|
||||
{footer?.text && (
|
||||
<SafeMarkdown
|
||||
content={footer.text}
|
||||
options={{context: MarkdownContext.RESTRICTED_INLINE_REPLY, messageId, channelId}}
|
||||
data-flx="channel.embeds.embed.embed-footer-component.safe-markdown"
|
||||
/>
|
||||
)}
|
||||
{footer?.text}
|
||||
{formattedTimestamp && (
|
||||
<>
|
||||
{footer?.text && (
|
||||
|
||||
@@ -25,6 +25,7 @@ import {
|
||||
} from '@app/features/channel/components/embeds/channel_embed/EmbedParts';
|
||||
import {
|
||||
EMBED_TEXT_OUTER_WIDTH,
|
||||
embedAllowsMarkdown,
|
||||
formatResponsiveEmbedWidth,
|
||||
} from '@app/features/channel/components/embeds/EmbedRenderUtils';
|
||||
import markupStyles from '@app/features/theme/styles/Markup.module.css';
|
||||
@@ -83,6 +84,7 @@ export const RichEmbed: FC<EmbedProps> = observer(
|
||||
<EmbedTitle
|
||||
title={embed.title}
|
||||
url={embed.url}
|
||||
markdown={embedAllowsMarkdown(embed)}
|
||||
messageId={message.id}
|
||||
channelId={message.channelId}
|
||||
data-flx="channel.embeds.channel-embed.rich-embed.embed-title"
|
||||
@@ -90,6 +92,7 @@ export const RichEmbed: FC<EmbedProps> = observer(
|
||||
{!isYouTubeEmbed && (
|
||||
<EmbedDescription
|
||||
description={embed.description}
|
||||
markdown={embedAllowsMarkdown(embed)}
|
||||
messageId={message.id}
|
||||
channelId={message.channelId}
|
||||
data-flx="channel.embeds.channel-embed.rich-embed.embed-description"
|
||||
@@ -127,8 +130,6 @@ export const RichEmbed: FC<EmbedProps> = observer(
|
||||
<EmbedFooterComponent
|
||||
footer={embed.footer}
|
||||
timestamp={embed.timestamp ? new Date(embed.timestamp) : undefined}
|
||||
messageId={message.id}
|
||||
channelId={message.channelId}
|
||||
data-flx="channel.embeds.channel-embed.rich-embed.embed-footer-component"
|
||||
/>
|
||||
)}
|
||||
|
||||
@@ -33,7 +33,7 @@ import {Form} from '@app/features/ui/components/form/Form';
|
||||
import {Input} from '@app/features/ui/components/form/FormInput';
|
||||
import {Scroller} from '@app/features/ui/components/Scroller';
|
||||
import * as AvatarUtils from '@app/features/user/utils/AvatarUtils';
|
||||
import {canCropFormat} from '@app/features/voice/utils/MediaCapabilities';
|
||||
import {canCropFile} from '@app/features/voice/utils/MediaCapabilities';
|
||||
import {useRemoteFormReset} from '@app/lib/forms/RemoteFormReset';
|
||||
import {assignTransientUploadFieldMutation} from '@app/lib/forms/TransientUploadFields';
|
||||
import {msg} from '@lingui/core/macro';
|
||||
@@ -136,7 +136,7 @@ export const EditGroupBottomSheet: React.FC<EditGroupBottomSheetProps> = observe
|
||||
return;
|
||||
}
|
||||
const svg = isSvgFile(file);
|
||||
if (!svg && !(await canCropFormat(file.type))) {
|
||||
if (!svg && !(await canCropFile(file))) {
|
||||
showChannelErrorModal({
|
||||
title: i18n._(UNSUPPORTED_ICON_FORMAT_DESCRIPTOR),
|
||||
message: getAssetFormatErrorMessage(i18n, 'guild_icon', 'unsupported_mime'),
|
||||
@@ -159,7 +159,6 @@ export const EditGroupBottomSheet: React.FC<EditGroupBottomSheetProps> = observe
|
||||
<AssetCropModal
|
||||
assetType={AssetType.CHANNEL_ICON}
|
||||
imageUrl={base64}
|
||||
sourceMimeType={svg ? 'image/svg+xml' : file.type}
|
||||
onCropComplete={(croppedBlob) => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = () => {
|
||||
|
||||
@@ -32,7 +32,7 @@ import * as ToastCommands from '@app/features/ui/commands/ToastCommands';
|
||||
import {Form} from '@app/features/ui/components/form/Form';
|
||||
import {Input} from '@app/features/ui/components/form/FormInput';
|
||||
import * as AvatarUtils from '@app/features/user/utils/AvatarUtils';
|
||||
import {canCropFormat} from '@app/features/voice/utils/MediaCapabilities';
|
||||
import {canCropFile} from '@app/features/voice/utils/MediaCapabilities';
|
||||
import {useRemoteFormReset} from '@app/lib/forms/RemoteFormReset';
|
||||
import {assignTransientUploadFieldMutation} from '@app/lib/forms/TransientUploadFields';
|
||||
import {msg} from '@lingui/core/macro';
|
||||
@@ -127,7 +127,7 @@ export const EditGroupModal = observer(({channelId}: {channelId: string}) => {
|
||||
return;
|
||||
}
|
||||
const svg = isSvgFile(file);
|
||||
if (!svg && !(await canCropFormat(file.type))) {
|
||||
if (!svg && !(await canCropFile(file))) {
|
||||
showChannelErrorModal({
|
||||
title: i18n._(UNSUPPORTED_ICON_FORMAT_DESCRIPTOR),
|
||||
message: getAssetFormatErrorMessage(i18n, 'guild_icon', 'unsupported_mime'),
|
||||
@@ -150,7 +150,6 @@ export const EditGroupModal = observer(({channelId}: {channelId: string}) => {
|
||||
<AssetCropModal
|
||||
assetType={AssetType.CHANNEL_ICON}
|
||||
imageUrl={base64}
|
||||
sourceMimeType={svg ? 'image/svg+xml' : file.type}
|
||||
onCropComplete={(croppedBlob) => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = () => {
|
||||
|
||||
@@ -303,7 +303,8 @@ export class Channel {
|
||||
const otherOverwrites = Object.keys(other.permissionOverwrites);
|
||||
if (thisOverwrites.length !== otherOverwrites.length) return false;
|
||||
for (const key of thisOverwrites) {
|
||||
if (!this.permissionOverwrites[key].equals(other.permissionOverwrites[key])) {
|
||||
const otherOverwrite = other.permissionOverwrites[key];
|
||||
if (otherOverwrite == null || !this.permissionOverwrites[key].equals(otherOverwrite)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ import type {VoiceNoiseSuppressionAssignmentResponse} from '@fluxer/schema/src/d
|
||||
import {
|
||||
type ExperimentAssignmentsResponse,
|
||||
INERT_EXPERIMENT_ASSIGNMENTS_RESPONSE,
|
||||
readScreenShareDeliveryAssignment,
|
||||
readVoiceNoiseSuppressionAssignment,
|
||||
} from '@fluxer/schema/src/domains/experiment/ExperimentSchemas';
|
||||
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
|
||||
@@ -123,8 +122,6 @@ describe('ExperimentAssignments cold start', () => {
|
||||
await settle();
|
||||
expect(ExperimentAssignments.response).toBe(INERT_EXPERIMENT_ASSIGNMENTS_RESPONSE);
|
||||
expect(ExperimentAssignments.response.assignments.voice_noise_suppression).toBeUndefined();
|
||||
expect(ExperimentAssignments.response.assignments.screen_share_delivery).toBeUndefined();
|
||||
expect(readScreenShareDeliveryAssignment(ExperimentAssignments.response).enabled).toBe(false);
|
||||
});
|
||||
|
||||
it('keeps the inert envelope while unauthenticated and retries later', async () => {
|
||||
@@ -170,32 +167,6 @@ describe('ExperimentAssignments response handling', () => {
|
||||
expect(ExperimentAssignments.response).toEqual(CANARY_ENVELOPE);
|
||||
});
|
||||
|
||||
it('adopts a screen share delivery assignment beside the voice one', async () => {
|
||||
await adopt({
|
||||
...CANARY_ENVELOPE,
|
||||
assignments: {...CANARY_ENVELOPE.assignments, screen_share_delivery: {enabled: true}},
|
||||
});
|
||||
expect(readScreenShareDeliveryAssignment(ExperimentAssignments.response).enabled).toBe(true);
|
||||
expect(readVoiceNoiseSuppressionAssignment(ExperimentAssignments.response)).toEqual(CANARY_ASSIGNMENT);
|
||||
});
|
||||
|
||||
it('reads screen share delivery as disabled when the envelope omits it', async () => {
|
||||
await adopt(CANARY_ENVELOPE);
|
||||
expect(readScreenShareDeliveryAssignment(ExperimentAssignments.response).enabled).toBe(false);
|
||||
});
|
||||
|
||||
it('discards an envelope with a malformed screen share delivery assignment', async () => {
|
||||
await adopt(CANARY_ENVELOPE);
|
||||
vi.mocked(http.get).mockResolvedValue(
|
||||
reply(200, {
|
||||
...CANARY_ENVELOPE,
|
||||
assignments: {...CANARY_ENVELOPE.assignments, screen_share_delivery: {enabled: 'yes'}},
|
||||
}),
|
||||
);
|
||||
await vi.advanceTimersByTimeAsync(400_000);
|
||||
expect(ExperimentAssignments.response).toEqual(CANARY_ENVELOPE);
|
||||
});
|
||||
|
||||
it('accepts an envelope that carries no voice noise suppression assignment', async () => {
|
||||
await adopt({poll_interval_seconds: 600, poll_jitter_percent: 0, assignments: {}});
|
||||
expect(ExperimentAssignments.response.assignments.voice_noise_suppression).toBeUndefined();
|
||||
|
||||
@@ -218,7 +218,7 @@ export const getAssetAspectRatioRange = (type: AssetType) => {
|
||||
};
|
||||
export const clampAssetAspectRatio = (type: AssetType, aspectRatio: number | undefined): number | undefined =>
|
||||
clampAspectRatio(aspectRatio, getAssetAspectRatioRange(type));
|
||||
export const canSkipOriginalAssetImage = (type: AssetType, dimensions: ImageDimensions): boolean => {
|
||||
const canSkipOriginalAssetImage = (type: AssetType, dimensions: ImageDimensions): boolean => {
|
||||
const config = getAssetConfig(type);
|
||||
return isOriginalImageWithinAssetBounds(
|
||||
dimensions,
|
||||
@@ -298,20 +298,18 @@ const getErrorMessage = (i18n: I18n, assetType: AssetType): string => {
|
||||
|
||||
interface AssetCropModalProps {
|
||||
imageUrl: string;
|
||||
sourceMimeType: string;
|
||||
assetType: AssetType;
|
||||
onCropComplete: (croppedImageBlob: Blob) => void;
|
||||
onSkip?: () => void;
|
||||
}
|
||||
|
||||
export const AssetCropModal: React.FC<AssetCropModalProps> = observer(
|
||||
({imageUrl, sourceMimeType, assetType, onCropComplete, onSkip}) => {
|
||||
({imageUrl, assetType, onCropComplete, onSkip}) => {
|
||||
const {i18n} = useLingui();
|
||||
const config = getAssetConfig(assetType);
|
||||
return (
|
||||
<ImageCropModal
|
||||
imageUrl={imageUrl}
|
||||
sourceMimeType={sourceMimeType}
|
||||
onCropComplete={onCropComplete}
|
||||
onSkip={onSkip}
|
||||
title={getTitle(i18n, assetType)}
|
||||
|
||||
@@ -6,12 +6,15 @@ import * as ModalCommands from '@app/features/ui/commands/ModalCommands';
|
||||
import {modal} from '@app/features/ui/commands/ModalCommands';
|
||||
import type {I18n} from '@lingui/core';
|
||||
import {msg} from '@lingui/core/macro';
|
||||
import {Trans} from '@lingui/react/macro';
|
||||
|
||||
const ANIMATED_NOT_SUPPORTED_DESCRIPTOR = msg({
|
||||
message: 'Animated {avifFormatLabel} not supported',
|
||||
comment: 'Modal title shown when an animated AVIF upload is rejected by the client.',
|
||||
});
|
||||
const BROWSER_CAN_T_CROP_ANIMATED_DESCRIPTOR = msg({
|
||||
message: "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead.",
|
||||
comment: 'Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.',
|
||||
});
|
||||
|
||||
interface ShowAnimatedAvifUnsupportedModalOptions {
|
||||
i18n: I18n;
|
||||
@@ -22,11 +25,7 @@ export function showAnimatedAvifUnsupportedModal({i18n}: ShowAnimatedAvifUnsuppo
|
||||
modal(() => (
|
||||
<GenericErrorModal
|
||||
title={i18n._(ANIMATED_NOT_SUPPORTED_DESCRIPTOR, {avifFormatLabel: AVIF_FORMAT_LABEL})}
|
||||
message={
|
||||
<Trans>
|
||||
Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead.
|
||||
</Trans>
|
||||
}
|
||||
message={i18n._(BROWSER_CAN_T_CROP_ANIMATED_DESCRIPTOR, {avifFormatLabel: AVIF_FORMAT_LABEL})}
|
||||
data-flx="expressions.animated-avif-modal-utils.show-animated-avif-unsupported-modal.confirm-modal"
|
||||
/>
|
||||
)),
|
||||
|
||||
@@ -1,90 +1,35 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
const GIF_EXT = '.gif';
|
||||
const WEBP_EXT = '.webp';
|
||||
const PNG_EXT = '.png';
|
||||
const AVIF_EXT = '.avif';
|
||||
export type InspectedImageFormat = 'unknown' | 'png' | 'gif' | 'webp' | 'avif' | 'jpeg';
|
||||
|
||||
export type AnimatedImageFormat = 'gif' | 'webp' | 'avif' | 'apng';
|
||||
export interface InspectedImage {
|
||||
format: InspectedImageFormat;
|
||||
animated: boolean;
|
||||
}
|
||||
|
||||
function getFileExtension(file: File): string {
|
||||
const name = (file.name || '').toLowerCase();
|
||||
const dotIndex = name.lastIndexOf('.');
|
||||
return dotIndex === -1 ? '' : name.substring(dotIndex);
|
||||
const SNIFFED_FORMATS: ReadonlyArray<InspectedImageFormat> = ['unknown', 'png', 'gif', 'webp', 'avif', 'jpeg'];
|
||||
|
||||
export async function inspectImageBytes(bytes: Uint8Array): Promise<InspectedImage> {
|
||||
try {
|
||||
const {detectAnimatedImage, sniffImageFormat} = await import('@app/features/platform/utils/LibFluxcore');
|
||||
const format = SNIFFED_FORMATS[await sniffImageFormat(bytes)] ?? 'unknown';
|
||||
if (format === 'unknown' || format === 'jpeg') {
|
||||
return {format, animated: false};
|
||||
}
|
||||
return {format, animated: await detectAnimatedImage(bytes)};
|
||||
} catch {
|
||||
return {format: 'unknown', animated: false};
|
||||
}
|
||||
}
|
||||
|
||||
export async function inspectImageFile(file: File): Promise<InspectedImage> {
|
||||
try {
|
||||
return await inspectImageBytes(new Uint8Array(await file.arrayBuffer()));
|
||||
} catch {
|
||||
return {format: 'unknown', animated: false};
|
||||
}
|
||||
}
|
||||
|
||||
export async function isAnimatedFile(file: File): Promise<boolean> {
|
||||
try {
|
||||
const arrayBuffer = await file.arrayBuffer();
|
||||
const {detectAnimatedImage} = await import('@app/features/platform/utils/LibFluxcore');
|
||||
return await detectAnimatedImage(new Uint8Array(arrayBuffer));
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function getAnimatedFormatLabel(file: File): string | null {
|
||||
const mime = (file.type || '').toLowerCase();
|
||||
const ext = getFileExtension(file);
|
||||
if (mime.includes('gif') || ext === GIF_EXT) {
|
||||
return 'GIF';
|
||||
}
|
||||
if (mime.includes('webp') || ext === WEBP_EXT) {
|
||||
return 'WebP';
|
||||
}
|
||||
if (mime.includes('png') || ext === PNG_EXT) {
|
||||
return 'APNG';
|
||||
}
|
||||
if (mime.includes('avif') || ext === AVIF_EXT) {
|
||||
return 'AVIF';
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export function getAnimatedImageFormat(mime: string, ext?: string): AnimatedImageFormat {
|
||||
const lowerMime = mime.toLowerCase();
|
||||
const lowerExt = ext?.toLowerCase() || '';
|
||||
if (lowerMime.includes('gif') || lowerExt === '.gif') {
|
||||
return 'gif';
|
||||
}
|
||||
if (lowerMime.includes('webp') || lowerExt === '.webp') {
|
||||
return 'webp';
|
||||
}
|
||||
if (lowerMime.includes('avif') || lowerExt === '.avif') {
|
||||
return 'avif';
|
||||
}
|
||||
if (lowerMime.includes('png') || lowerExt === '.png') {
|
||||
return 'apng';
|
||||
}
|
||||
return 'gif';
|
||||
}
|
||||
|
||||
export interface HandleAnimatedNonGifOptions {
|
||||
file: File;
|
||||
isGif: boolean;
|
||||
animated: boolean;
|
||||
onAnimatedAvif: () => void;
|
||||
onOtherAnimated: () => void;
|
||||
}
|
||||
|
||||
export function shouldHandleAnimatedNonGifUpload({
|
||||
file,
|
||||
isGif,
|
||||
animated,
|
||||
onAnimatedAvif,
|
||||
onOtherAnimated,
|
||||
}: HandleAnimatedNonGifOptions): boolean {
|
||||
if (!animated) {
|
||||
return false;
|
||||
}
|
||||
const format = getAnimatedImageFormat(file.type);
|
||||
if (isGif || format === 'gif' || format === 'apng') {
|
||||
return false;
|
||||
}
|
||||
if (format === 'avif') {
|
||||
onAnimatedAvif();
|
||||
return true;
|
||||
}
|
||||
onOtherAnimated();
|
||||
return true;
|
||||
return (await inspectImageFile(file)).animated;
|
||||
}
|
||||
|
||||
@@ -19,13 +19,6 @@ export function isSvgFile(file: ImageUploadFileLike): boolean {
|
||||
return (file.name ?? '').toLowerCase().endsWith('.svg');
|
||||
}
|
||||
|
||||
export function getImageUploadMimeType(file: ImageUploadFileLike): string {
|
||||
if (isSvgFile(file)) return 'image/svg+xml';
|
||||
const type = normalizeImageMimeType(file.type);
|
||||
if (type.startsWith('image/')) return type;
|
||||
return 'image/png';
|
||||
}
|
||||
|
||||
function readBlobAsDataUrl(blob: Blob): Promise<string> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const reader = new FileReader();
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
type AnimatedCropSourceFormat,
|
||||
type CropParams,
|
||||
CropPipelineError,
|
||||
} from '@app/features/expressions/workers/AnimatedImageCropMessages';
|
||||
|
||||
export const MAX_SOURCE_CANVAS_PIXELS = 16_777_216;
|
||||
export const MAX_FRAMES = 20_000;
|
||||
export const MAX_OUTPUT_TOTAL_PIXELS = 1_073_741_824;
|
||||
export const MAX_SOURCE_TOTAL_PIXELS = 1_073_741_824;
|
||||
export const MAX_PLAYS = 65_535;
|
||||
export const LOSSLESS_MAX_WORK_PIXELS = 16_777_216;
|
||||
|
||||
export const QUALITY_RUNGS: ReadonlyArray<number> = [75, 60, 45, 30];
|
||||
export const SIZE_RATIO: ReadonlyArray<number> = [1, 0.889, 0.782, 0.595];
|
||||
|
||||
const LADDER_TARGET_FRACTION = 0.95;
|
||||
const LADDER_GIVE_UP_FRACTION = 1.15;
|
||||
const DEFAULT_AVIF_DELAY_MS = 100;
|
||||
|
||||
export interface EncodeRung {
|
||||
quality: number;
|
||||
method: number;
|
||||
lossless: boolean;
|
||||
}
|
||||
|
||||
export const LOSSLESS_RUNG: EncodeRung = {quality: 75, method: 4, lossless: true};
|
||||
|
||||
export function chooseMethod(workPixels: number): number {
|
||||
if (workPixels <= 67_108_864) return 4;
|
||||
if (workPixels <= 268_435_456) return 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
export function lossyRung(index: number, method: number): EncodeRung {
|
||||
return {quality: QUALITY_RUNGS[index], method, lossless: false};
|
||||
}
|
||||
|
||||
export function nextRung(index: number, sizeBytes: number, capBytes: number): number | 'too_large' {
|
||||
const last = QUALITY_RUNGS.length - 1;
|
||||
if (index >= last) return 'too_large';
|
||||
const target = LADDER_TARGET_FRACTION * capBytes;
|
||||
for (let candidate = index + 1; candidate <= last; candidate++) {
|
||||
if ((sizeBytes * SIZE_RATIO[candidate]) / SIZE_RATIO[index] <= target) return candidate;
|
||||
}
|
||||
if ((sizeBytes * SIZE_RATIO[last]) / SIZE_RATIO[index] > LADDER_GIVE_UP_FRACTION * capBytes) return 'too_large';
|
||||
return last;
|
||||
}
|
||||
|
||||
export function usesLosslessFirstRung(sourceLossless: boolean, workPixels: number): boolean {
|
||||
return sourceLossless && workPixels <= LOSSLESS_MAX_WORK_PIXELS;
|
||||
}
|
||||
|
||||
export function assertSourceBudget(width: number, height: number, frameCount: number): void {
|
||||
if (!(width > 0 && height > 0 && frameCount > 0)) {
|
||||
throw new CropPipelineError(
|
||||
'decode_failed',
|
||||
`Invalid animation header ${width}x${height} with ${frameCount} frames`,
|
||||
);
|
||||
}
|
||||
if (width * height > MAX_SOURCE_CANVAS_PIXELS) {
|
||||
throw new CropPipelineError('budget_exceeded', `Canvas ${width}x${height} is larger than the decode budget`);
|
||||
}
|
||||
if (frameCount > MAX_FRAMES) {
|
||||
throw new CropPipelineError('budget_exceeded', `${frameCount} frames is more than ${MAX_FRAMES}`);
|
||||
}
|
||||
if (frameCount * width * height > MAX_SOURCE_TOTAL_PIXELS) {
|
||||
throw new CropPipelineError(
|
||||
'budget_exceeded',
|
||||
`${frameCount} frames at ${width}x${height} is too much decode work`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function assertOutputBudget(frameCount: number, outputWidth: number, outputHeight: number): void {
|
||||
if (!(outputWidth > 0 && outputHeight > 0)) {
|
||||
throw new CropPipelineError('internal', `Invalid output size ${outputWidth}x${outputHeight}`);
|
||||
}
|
||||
if (frameCount * outputWidth * outputHeight > MAX_OUTPUT_TOTAL_PIXELS) {
|
||||
throw new CropPipelineError(
|
||||
'budget_exceeded',
|
||||
`${frameCount} frames at ${outputWidth}x${outputHeight} is too much output`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function isNoopCrop(
|
||||
crop: CropParams,
|
||||
canvasWidth: number,
|
||||
canvasHeight: number,
|
||||
format: AnimatedCropSourceFormat,
|
||||
sourceBytes: number,
|
||||
capBytes: number,
|
||||
): boolean {
|
||||
return (
|
||||
(format === 'gif' || format === 'webp') &&
|
||||
crop.x === 0 &&
|
||||
crop.y === 0 &&
|
||||
crop.width === canvasWidth &&
|
||||
crop.height === canvasHeight &&
|
||||
crop.rotation === 0 &&
|
||||
crop.outputWidth === canvasWidth &&
|
||||
crop.outputHeight === canvasHeight &&
|
||||
sourceBytes <= capBytes
|
||||
);
|
||||
}
|
||||
|
||||
export function clampPlays(plays: number): number {
|
||||
return Math.min(Math.max(Math.trunc(plays), 0), MAX_PLAYS);
|
||||
}
|
||||
|
||||
export function gifPlaysFromRepeat(repeat: number | null): number {
|
||||
if (repeat === null) return 1;
|
||||
if (repeat === 0) return 0;
|
||||
return clampPlays(repeat + 1);
|
||||
}
|
||||
|
||||
export function gifRepeatFromPlays(plays: number): number {
|
||||
if (plays === 1) return -1;
|
||||
if (plays === 0) return 0;
|
||||
return clampPlays(plays - 1);
|
||||
}
|
||||
|
||||
export function avifPlaysFromRepetitionCount(repetitionCount: number | undefined): number {
|
||||
if (repetitionCount === undefined || !Number.isFinite(repetitionCount)) return 0;
|
||||
return clampPlays(repetitionCount + 1);
|
||||
}
|
||||
|
||||
export function apngDelayMs(numerator: number, denominator: number): number {
|
||||
return (numerator * 1000) / (denominator || 100);
|
||||
}
|
||||
|
||||
export function avifDelayMs(durationMicros: number | null): number {
|
||||
return durationMicros == null ? DEFAULT_AVIF_DELAY_MS : durationMicros / 1000;
|
||||
}
|
||||
@@ -0,0 +1,662 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
apngDelayMs,
|
||||
assertSourceBudget,
|
||||
avifDelayMs,
|
||||
avifPlaysFromRepetitionCount,
|
||||
clampPlays,
|
||||
gifPlaysFromRepeat,
|
||||
gifRepeatFromPlays,
|
||||
MAX_SOURCE_CANVAS_PIXELS,
|
||||
} from '@app/features/expressions/workers/AnimatedCropPlan';
|
||||
import {CropPipelineError} from '@app/features/expressions/workers/AnimatedImageCropMessages';
|
||||
import {
|
||||
canDecodeAnimatedAvif,
|
||||
closeImageDecoder,
|
||||
drawVideoFrameToCanvas,
|
||||
type FluxerImageDecoderDecodedFrame,
|
||||
getImageDecoderConstructor,
|
||||
} from '@app/features/platform/utils/ImageDecoderInterop';
|
||||
import {Unzlib} from 'fflate';
|
||||
import {GIFEncoder, type GifPaletteColor} from 'gifenc';
|
||||
import {decompressFrame, type ParsedGif, parseGIF} from 'gifuct-js';
|
||||
import UPNG from 'upng-js';
|
||||
|
||||
export interface DecodedFrame {
|
||||
rgba: Uint8Array;
|
||||
delayMs: number;
|
||||
}
|
||||
|
||||
export interface FrameSource {
|
||||
width: number;
|
||||
height: number;
|
||||
frameCount: number;
|
||||
plays: number;
|
||||
next(): DecodedFrame | null | Promise<DecodedFrame | null>;
|
||||
close(): void;
|
||||
}
|
||||
|
||||
export interface GifFrameSink {
|
||||
add(rgba: Uint8Array, delayMs: number): boolean;
|
||||
finish(): Uint8Array;
|
||||
close(): void;
|
||||
}
|
||||
|
||||
interface Rect {
|
||||
x: number;
|
||||
y: number;
|
||||
width: number;
|
||||
height: number;
|
||||
}
|
||||
|
||||
type GifBlock = ParsedGif['frames'][number];
|
||||
type GifImageBlock = Extract<GifBlock, {image: unknown}>;
|
||||
|
||||
const PNG_SIGNATURE = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
||||
const GIF_EXTENSION_INTRODUCER = 0x21;
|
||||
const GIF_APPLICATION_LABEL = 0xff;
|
||||
const GIF_LOOP_APPLICATIONS = new Set(['NETSCAPE2.0', 'ANIMEXTS1.0']);
|
||||
const GIF_MAX_DELAY_CS = 0xffff;
|
||||
const GIF_TRANSPARENT_INDEX = 0;
|
||||
const GIF_MAX_OPAQUE_COLORS = 255;
|
||||
const GIF_MAX_LZW_CODE_SIZE = 11;
|
||||
const GIF_VERSION_87_MINOR = 0x37;
|
||||
const APNG_DISPOSE_BACKGROUND = 1;
|
||||
const APNG_DISPOSE_PREVIOUS = 2;
|
||||
const APNG_BLEND_OVER = 1;
|
||||
const PNG_CHANNELS: Readonly<Record<number, number>> = {0: 1, 2: 3, 3: 1, 4: 2, 6: 4};
|
||||
const ADAM7_PASSES: ReadonlyArray<readonly [number, number, number, number]> = [
|
||||
[0, 0, 8, 8],
|
||||
[4, 0, 8, 8],
|
||||
[0, 4, 4, 8],
|
||||
[2, 0, 4, 4],
|
||||
[0, 2, 2, 4],
|
||||
[1, 0, 2, 2],
|
||||
[0, 1, 1, 2],
|
||||
];
|
||||
const INFLATE_SLICE_BYTES = 16_384;
|
||||
const INFLATE_SLACK_BYTES = 65_536;
|
||||
|
||||
function decodeFailed(message: string): CropPipelineError {
|
||||
return new CropPipelineError('decode_failed', message);
|
||||
}
|
||||
|
||||
function toArrayBuffer(bytes: Uint8Array): ArrayBuffer {
|
||||
if (bytes.buffer instanceof ArrayBuffer && bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength) {
|
||||
return bytes.buffer;
|
||||
}
|
||||
return bytes.slice().buffer;
|
||||
}
|
||||
|
||||
function clipRect(rect: Rect, canvasWidth: number, canvasHeight: number): Rect {
|
||||
const x = Math.min(rect.x, canvasWidth);
|
||||
const y = Math.min(rect.y, canvasHeight);
|
||||
return {
|
||||
x,
|
||||
y,
|
||||
width: Math.max(0, Math.min(rect.x + rect.width, canvasWidth) - x),
|
||||
height: Math.max(0, Math.min(rect.y + rect.height, canvasHeight) - y),
|
||||
};
|
||||
}
|
||||
|
||||
function clearRect(canvas: Uint8Array, canvasWidth: number, rect: Rect): void {
|
||||
for (let row = 0; row < rect.height; row++) {
|
||||
const start = ((rect.y + row) * canvasWidth + rect.x) * 4;
|
||||
canvas.fill(0, start, start + rect.width * 4);
|
||||
}
|
||||
}
|
||||
|
||||
function saveRect(canvas: Uint8Array, canvasWidth: number, rect: Rect): Uint8Array {
|
||||
const saved = new Uint8Array(rect.width * rect.height * 4);
|
||||
for (let row = 0; row < rect.height; row++) {
|
||||
const start = ((rect.y + row) * canvasWidth + rect.x) * 4;
|
||||
saved.set(canvas.subarray(start, start + rect.width * 4), row * rect.width * 4);
|
||||
}
|
||||
return saved;
|
||||
}
|
||||
|
||||
function restoreRect(canvas: Uint8Array, canvasWidth: number, rect: Rect, saved: Uint8Array): void {
|
||||
for (let row = 0; row < rect.height; row++) {
|
||||
const start = ((rect.y + row) * canvasWidth + rect.x) * 4;
|
||||
canvas.set(saved.subarray(row * rect.width * 4, (row + 1) * rect.width * 4), start);
|
||||
}
|
||||
}
|
||||
|
||||
function readGifRepeat(bytes: Uint8Array): number | null {
|
||||
let pos = 13;
|
||||
if (bytes[10] & 0x80) pos += 3 * (2 << (bytes[10] & 0x07));
|
||||
while (pos + 1 < bytes.length && bytes[pos] === GIF_EXTENSION_INTRODUCER) {
|
||||
const label = bytes[pos + 1];
|
||||
pos += 2;
|
||||
let isLoopApplication = false;
|
||||
if (label === GIF_APPLICATION_LABEL && pos < bytes.length) {
|
||||
const blockSize = bytes[pos];
|
||||
isLoopApplication = GIF_LOOP_APPLICATIONS.has(
|
||||
String.fromCharCode(...bytes.subarray(pos + 1, pos + 1 + blockSize)),
|
||||
);
|
||||
pos += 1 + blockSize;
|
||||
}
|
||||
while (pos < bytes.length && bytes[pos] !== 0) {
|
||||
const size = bytes[pos];
|
||||
if (isLoopApplication && size >= 3 && bytes[pos + 1] === 1 && pos + 3 < bytes.length) {
|
||||
return bytes[pos + 2] | (bytes[pos + 3] << 8);
|
||||
}
|
||||
pos += size + 1;
|
||||
}
|
||||
pos += 1;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export function openGifFrameSource(bytes: Uint8Array): FrameSource {
|
||||
if (bytes.length < 13 || bytes[0] !== 0x47 || bytes[1] !== 0x49 || bytes[2] !== 0x46) {
|
||||
throw decodeFailed('Not a GIF file');
|
||||
}
|
||||
const plays = gifPlaysFromRepeat(readGifRepeat(bytes));
|
||||
const parsed = parseGIF(toArrayBuffer(bytes));
|
||||
const frames = parsed.frames.filter((block): block is GifImageBlock => 'image' in block && block.image != null);
|
||||
if (frames.some((frame) => !(frame.image.data.minCodeSize <= GIF_MAX_LZW_CODE_SIZE))) {
|
||||
throw decodeFailed('GIF frame has an invalid LZW code size');
|
||||
}
|
||||
const screenWidth = bytes[6] | (bytes[7] << 8);
|
||||
const screenHeight = bytes[8] | (bytes[9] << 8);
|
||||
const first = frames[0]?.image.descriptor;
|
||||
const width = Math.max(screenWidth, first ? first.left + first.width : 0);
|
||||
const height = Math.max(screenHeight, first ? first.top + first.height : 0);
|
||||
if (
|
||||
first &&
|
||||
(screenWidth < first.width || screenHeight < first.height || bytes[4] === GIF_VERSION_87_MINOR) &&
|
||||
(width !== first.width || height !== first.height)
|
||||
) {
|
||||
throw decodeFailed('GIF logical screen does not fit its first frame');
|
||||
}
|
||||
let canvas: Uint8Array | null = null;
|
||||
let index = 0;
|
||||
let pendingDisposal: {rect: Rect; saved: Uint8Array | null} | null = null;
|
||||
|
||||
return {
|
||||
width,
|
||||
height,
|
||||
frameCount: frames.length,
|
||||
plays,
|
||||
next() {
|
||||
if (index >= frames.length) return null;
|
||||
const frame = frames[index++];
|
||||
const descriptor = frame.image.descriptor;
|
||||
if (descriptor.width * descriptor.height > MAX_SOURCE_CANVAS_PIXELS) {
|
||||
throw new CropPipelineError(
|
||||
'budget_exceeded',
|
||||
`GIF frame ${descriptor.width}x${descriptor.height} is too large`,
|
||||
);
|
||||
}
|
||||
if (!canvas) {
|
||||
assertSourceBudget(width, height, frames.length);
|
||||
canvas = new Uint8Array(width * height * 4);
|
||||
}
|
||||
if (pendingDisposal) {
|
||||
if (pendingDisposal.saved) restoreRect(canvas, width, pendingDisposal.rect, pendingDisposal.saved);
|
||||
else clearRect(canvas, width, pendingDisposal.rect);
|
||||
pendingDisposal = null;
|
||||
}
|
||||
const decoded = decompressFrame(frame, parsed.gct, false);
|
||||
const rect = clipRect(
|
||||
{x: descriptor.left, y: descriptor.top, width: descriptor.width, height: descriptor.height},
|
||||
width,
|
||||
height,
|
||||
);
|
||||
const disposal = frame.gce?.extras.disposal ?? 0;
|
||||
if (disposal === 3) pendingDisposal = {rect, saved: saveRect(canvas, width, rect)};
|
||||
else if (disposal === 2) pendingDisposal = {rect, saved: null};
|
||||
const colorTable = decoded.colorTable ?? [];
|
||||
const transparentIndex = frame.gce?.extras.transparentColorGiven ? frame.gce.transparentColorIndex : -1;
|
||||
const pixels = decoded.pixels;
|
||||
for (let row = 0; row < rect.height; row++) {
|
||||
const sourceRow = (rect.y - descriptor.top + row) * descriptor.width + (rect.x - descriptor.left);
|
||||
let target = ((rect.y + row) * width + rect.x) * 4;
|
||||
for (let column = 0; column < rect.width; column++, target += 4) {
|
||||
const colorIndex = pixels[sourceRow + column];
|
||||
if (colorIndex === transparentIndex) continue;
|
||||
const color = colorTable[colorIndex];
|
||||
if (!color) continue;
|
||||
canvas[target] = color[0];
|
||||
canvas[target + 1] = color[1];
|
||||
canvas[target + 2] = color[2];
|
||||
canvas[target + 3] = 255;
|
||||
}
|
||||
}
|
||||
return {rgba: canvas, delayMs: (frame.gce?.delay ?? 0) * 10};
|
||||
},
|
||||
close() {
|
||||
canvas = null;
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
interface Range {
|
||||
start: number;
|
||||
end: number;
|
||||
}
|
||||
|
||||
interface IsoBox extends Range {
|
||||
type: string;
|
||||
}
|
||||
|
||||
interface ApngFrameChunks {
|
||||
rect: Rect;
|
||||
delayMs: number;
|
||||
dispose: number;
|
||||
blend: number;
|
||||
data: Array<Uint8Array>;
|
||||
}
|
||||
|
||||
function readU32(bytes: Uint8Array, offset: number): number {
|
||||
return ((bytes[offset] << 24) | (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3]) >>> 0;
|
||||
}
|
||||
|
||||
function readU16(bytes: Uint8Array, offset: number): number {
|
||||
return (bytes[offset] << 8) | bytes[offset + 1];
|
||||
}
|
||||
|
||||
function writeChunk(out: Uint8Array, offset: number, type: string, parts: Array<Uint8Array>): number {
|
||||
const length = parts.reduce((sum, part) => sum + part.length, 0);
|
||||
new DataView(out.buffer, out.byteOffset).setUint32(offset, length);
|
||||
for (let i = 0; i < 4; i++) out[offset + 4 + i] = type.charCodeAt(i);
|
||||
let cursor = offset + 8;
|
||||
for (const part of parts) {
|
||||
out.set(part, cursor);
|
||||
cursor += part.length;
|
||||
}
|
||||
return cursor + 4;
|
||||
}
|
||||
|
||||
function buildFrameHeaderPng(
|
||||
ihdr: Uint8Array,
|
||||
palette: Uint8Array | null,
|
||||
transparency: Uint8Array | null,
|
||||
rect: Rect,
|
||||
): Uint8Array {
|
||||
const header = ihdr.slice();
|
||||
new DataView(header.buffer).setUint32(0, rect.width);
|
||||
new DataView(header.buffer).setUint32(4, rect.height);
|
||||
const chunks: Array<[string, Array<Uint8Array>]> = [['IHDR', [header]]];
|
||||
if (palette) chunks.push(['PLTE', [palette]]);
|
||||
if (transparency) chunks.push(['tRNS', [transparency]]);
|
||||
chunks.push(['IEND', []]);
|
||||
const size = chunks.reduce(
|
||||
(sum, [, parts]) => sum + 12 + parts.reduce((partSum, part) => partSum + part.length, 0),
|
||||
PNG_SIGNATURE.length,
|
||||
);
|
||||
const out = new Uint8Array(size);
|
||||
out.set(PNG_SIGNATURE, 0);
|
||||
let offset = PNG_SIGNATURE.length;
|
||||
for (const [type, parts] of chunks) offset = writeChunk(out, offset, type, parts);
|
||||
return out;
|
||||
}
|
||||
|
||||
function filteredPngByteLength(ihdr: Uint8Array, width: number, height: number): number {
|
||||
const channels = PNG_CHANNELS[ihdr[9]];
|
||||
if (channels === undefined) throw decodeFailed(`PNG color type ${ihdr[9]} is not supported`);
|
||||
const bitsPerPixel = channels * ihdr[8];
|
||||
const rowBytes = (rowWidth: number) => 1 + Math.ceil((rowWidth * bitsPerPixel) / 8);
|
||||
if (ihdr[12] === 0) return height * rowBytes(width);
|
||||
let total = 0;
|
||||
for (const [column, row, columnStep, rowStep] of ADAM7_PASSES) {
|
||||
const passWidth = Math.ceil((width - column) / columnStep);
|
||||
const passHeight = Math.ceil((height - row) / rowStep);
|
||||
if (passWidth > 0 && passHeight > 0) total += passHeight * rowBytes(passWidth);
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
function inflateFrame(parts: Array<Uint8Array>, out: Uint8Array, frameIndex: number): Uint8Array {
|
||||
const filteredLength = out.length;
|
||||
const limit = filteredLength * 2 + INFLATE_SLACK_BYTES;
|
||||
let inflated = 0;
|
||||
const inflater = new Unzlib((chunk) => {
|
||||
if (inflated < filteredLength) out.set(chunk.subarray(0, filteredLength - inflated), inflated);
|
||||
inflated += chunk.length;
|
||||
if (inflated > limit) throw decodeFailed(`APNG frame ${frameIndex} inflates past its dimensions`);
|
||||
});
|
||||
for (const part of parts) {
|
||||
for (let offset = 0; offset < part.length && inflated < filteredLength; offset += INFLATE_SLICE_BYTES) {
|
||||
inflater.push(part.subarray(offset, offset + INFLATE_SLICE_BYTES));
|
||||
}
|
||||
}
|
||||
if (inflated < filteredLength) throw decodeFailed(`APNG frame ${frameIndex} is truncated`);
|
||||
return out;
|
||||
}
|
||||
|
||||
function blendOver(canvas: Uint8Array, target: number, rgba: Uint8Array, source: number): void {
|
||||
const sourceAlpha = rgba[source + 3];
|
||||
if (sourceAlpha === 0) return;
|
||||
const destinationAlpha = canvas[target + 3];
|
||||
if (sourceAlpha === 255 || destinationAlpha === 0) {
|
||||
canvas.set(rgba.subarray(source, source + 4), target);
|
||||
return;
|
||||
}
|
||||
const destinationWeight = destinationAlpha * (255 - sourceAlpha);
|
||||
const outAlpha = sourceAlpha * 255 + destinationWeight;
|
||||
for (let channel = 0; channel < 3; channel++) {
|
||||
canvas[target + channel] = Math.round(
|
||||
(rgba[source + channel] * sourceAlpha * 255 + canvas[target + channel] * destinationWeight) / outAlpha,
|
||||
);
|
||||
}
|
||||
canvas[target + 3] = Math.round(outAlpha / 255);
|
||||
}
|
||||
|
||||
export function openApngFrameSource(bytes: Uint8Array): FrameSource {
|
||||
for (let i = 0; i < PNG_SIGNATURE.length; i++) {
|
||||
if (bytes[i] !== PNG_SIGNATURE[i]) throw decodeFailed('Not a PNG file');
|
||||
}
|
||||
let ihdr: Uint8Array | null = null;
|
||||
let palette: Uint8Array | null = null;
|
||||
let transparency: Uint8Array | null = null;
|
||||
let plays = 0;
|
||||
let animated = false;
|
||||
const frames: Array<ApngFrameChunks> = [];
|
||||
let pos = PNG_SIGNATURE.length;
|
||||
for (;;) {
|
||||
if (pos + 8 > bytes.length) throw decodeFailed('PNG ended before IEND');
|
||||
const length = readU32(bytes, pos);
|
||||
const type = String.fromCharCode(bytes[pos + 4], bytes[pos + 5], bytes[pos + 6], bytes[pos + 7]);
|
||||
const dataStart = pos + 8;
|
||||
const dataEnd = dataStart + length;
|
||||
if (dataEnd + 4 > bytes.length) throw decodeFailed(`PNG chunk ${type} overruns the file`);
|
||||
const data = bytes.subarray(dataStart, dataEnd);
|
||||
pos = dataEnd + 4;
|
||||
if (type === 'IEND') break;
|
||||
if (type === 'IHDR' && length === 13) ihdr = data;
|
||||
else if (type === 'PLTE') palette = data;
|
||||
else if (type === 'tRNS') transparency = data;
|
||||
else if (type === 'acTL' && length >= 8) {
|
||||
animated = true;
|
||||
plays = clampPlays(readU32(data, 4));
|
||||
} else if (type === 'fcTL' && length >= 26) {
|
||||
frames.push({
|
||||
rect: {x: readU32(data, 12), y: readU32(data, 16), width: readU32(data, 4), height: readU32(data, 8)},
|
||||
delayMs: apngDelayMs(readU16(data, 20), readU16(data, 22)),
|
||||
dispose: data[24],
|
||||
blend: data[25],
|
||||
data: [],
|
||||
});
|
||||
} else if (type === 'IDAT' && frames.length === 1) frames[0].data.push(data);
|
||||
else if (type === 'fdAT' && frames.length > 0 && length > 4) frames[frames.length - 1].data.push(data.subarray(4));
|
||||
}
|
||||
if (!ihdr || !animated) throw decodeFailed('PNG is not animated');
|
||||
const header = ihdr;
|
||||
const width = readU32(header, 0);
|
||||
const height = readU32(header, 4);
|
||||
let canvas: Uint8Array | null = null;
|
||||
let scratch = new Uint8Array(0);
|
||||
let index = 0;
|
||||
let pendingDisposal: {rect: Rect; saved: Uint8Array | null} | null = null;
|
||||
|
||||
return {
|
||||
width,
|
||||
height,
|
||||
frameCount: frames.length,
|
||||
plays,
|
||||
next() {
|
||||
if (index >= frames.length) return null;
|
||||
const frameIndex = index++;
|
||||
const frame = frames[frameIndex];
|
||||
const {rect} = frame;
|
||||
if (
|
||||
rect.width === 0 ||
|
||||
rect.height === 0 ||
|
||||
rect.x + rect.width > width ||
|
||||
rect.y + rect.height > height ||
|
||||
frame.data.length === 0
|
||||
) {
|
||||
throw decodeFailed(`APNG frame ${frameIndex} is outside the canvas or empty`);
|
||||
}
|
||||
if (!canvas) {
|
||||
assertSourceBudget(width, height, frames.length);
|
||||
canvas = new Uint8Array(width * height * 4);
|
||||
}
|
||||
if (pendingDisposal) {
|
||||
if (pendingDisposal.saved) restoreRect(canvas, width, pendingDisposal.rect, pendingDisposal.saved);
|
||||
else clearRect(canvas, width, pendingDisposal.rect);
|
||||
pendingDisposal = null;
|
||||
}
|
||||
const filteredLength = filteredPngByteLength(header, rect.width, rect.height);
|
||||
if (scratch.length < filteredLength) scratch = new Uint8Array(filteredLength);
|
||||
const inflated = inflateFrame(frame.data, scratch.subarray(0, filteredLength), frameIndex);
|
||||
const image = UPNG.decode(toArrayBuffer(buildFrameHeaderPng(header, palette, transparency, rect)), inflated);
|
||||
const rgba = new Uint8Array(UPNG.toRGBA8(image)[0]);
|
||||
if (rgba.length !== rect.width * rect.height * 4) throw decodeFailed(`APNG frame ${frameIndex} did not decode`);
|
||||
const dispose =
|
||||
frameIndex === 0 && frame.dispose === APNG_DISPOSE_PREVIOUS ? APNG_DISPOSE_BACKGROUND : frame.dispose;
|
||||
if (dispose === APNG_DISPOSE_PREVIOUS) pendingDisposal = {rect, saved: saveRect(canvas, width, rect)};
|
||||
else if (dispose === APNG_DISPOSE_BACKGROUND) pendingDisposal = {rect, saved: null};
|
||||
for (let row = 0; row < rect.height; row++) {
|
||||
const target = ((rect.y + row) * width + rect.x) * 4;
|
||||
const source = row * rect.width * 4;
|
||||
if (frame.blend === APNG_BLEND_OVER) {
|
||||
for (let column = 0; column < rect.width; column++) {
|
||||
blendOver(canvas, target + column * 4, rgba, source + column * 4);
|
||||
}
|
||||
} else {
|
||||
canvas.set(rgba.subarray(source, source + rect.width * 4), target);
|
||||
}
|
||||
}
|
||||
return {rgba: canvas, delayMs: frame.delayMs};
|
||||
},
|
||||
close() {
|
||||
canvas = null;
|
||||
scratch = new Uint8Array(0);
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function readFourCc(bytes: Uint8Array, offset: number): string {
|
||||
return String.fromCharCode(bytes[offset], bytes[offset + 1], bytes[offset + 2], bytes[offset + 3]);
|
||||
}
|
||||
|
||||
function isoChildren(bytes: Uint8Array, parent: Range): Array<IsoBox> {
|
||||
const boxes: Array<IsoBox> = [];
|
||||
let pos = parent.start;
|
||||
while (pos + 8 <= parent.end) {
|
||||
let size = readU32(bytes, pos);
|
||||
let headerSize = 8;
|
||||
if (size === 1) {
|
||||
if (pos + 16 > parent.end) break;
|
||||
size = readU32(bytes, pos + 8) * 2 ** 32 + readU32(bytes, pos + 12);
|
||||
headerSize = 16;
|
||||
} else if (size === 0) {
|
||||
size = parent.end - pos;
|
||||
}
|
||||
if (size < headerSize || pos + size > parent.end) break;
|
||||
boxes.push({type: readFourCc(bytes, pos + 4), start: pos + headerSize, end: pos + size});
|
||||
pos += size;
|
||||
}
|
||||
return boxes;
|
||||
}
|
||||
|
||||
function isoChild(bytes: Uint8Array, parent: Range | undefined, type: string): IsoBox | undefined {
|
||||
return parent && isoChildren(bytes, parent).find((box) => box.type === type);
|
||||
}
|
||||
|
||||
function readTrackDelaysMs(bytes: Uint8Array, trak: IsoBox, frameCount: number): Array<number> | null {
|
||||
const mdia = isoChild(bytes, trak, 'mdia');
|
||||
const mdhd = isoChild(bytes, mdia, 'mdhd');
|
||||
const stts = isoChild(bytes, isoChild(bytes, isoChild(bytes, mdia, 'minf'), 'stbl'), 'stts');
|
||||
if (!mdhd || !stts || stts.end - stts.start < 8) return null;
|
||||
const timescaleOffset = mdhd.start + (bytes[mdhd.start] === 1 ? 20 : 12);
|
||||
if (timescaleOffset + 4 > mdhd.end) return null;
|
||||
const timescale = readU32(bytes, timescaleOffset);
|
||||
const entryCount = readU32(bytes, stts.start + 4);
|
||||
if (timescale === 0 || stts.start + 8 + entryCount * 8 > stts.end) return null;
|
||||
const delays: Array<number> = [];
|
||||
for (let entry = 0; entry < entryCount; entry++) {
|
||||
const sampleCount = readU32(bytes, stts.start + 8 + entry * 8);
|
||||
const delayMs = (readU32(bytes, stts.start + 12 + entry * 8) * 1000) / timescale;
|
||||
for (let sample = 0; sample < sampleCount; sample++) {
|
||||
if (delays.length === frameCount) return null;
|
||||
delays.push(delayMs);
|
||||
}
|
||||
}
|
||||
return delays.length === frameCount ? delays : null;
|
||||
}
|
||||
|
||||
function readAvifFrameDelaysMs(bytes: Uint8Array, frameCount: number): Array<number> | null {
|
||||
const moov = isoChild(bytes, {start: 0, end: bytes.length}, 'moov');
|
||||
if (!moov) return null;
|
||||
for (const trak of isoChildren(bytes, moov)) {
|
||||
if (trak.type !== 'trak') continue;
|
||||
const hdlr = isoChild(bytes, isoChild(bytes, trak, 'mdia'), 'hdlr');
|
||||
if (!hdlr || hdlr.end - hdlr.start < 12 || readFourCc(bytes, hdlr.start + 8) !== 'pict') continue;
|
||||
if (isoChild(bytes, isoChild(bytes, trak, 'tref'), 'auxl')) continue;
|
||||
return readTrackDelaysMs(bytes, trak, frameCount);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export async function openAvifFrameSource(bytes: Uint8Array): Promise<FrameSource> {
|
||||
const ImageDecoderConstructor = getImageDecoderConstructor();
|
||||
if (!ImageDecoderConstructor || !(await canDecodeAnimatedAvif())) {
|
||||
throw new CropPipelineError('animated_avif_unsupported', 'This browser cannot decode animated AVIF frames');
|
||||
}
|
||||
const decoder = new ImageDecoderConstructor({data: bytes, type: 'image/avif'});
|
||||
let pending: FluxerImageDecoderDecodedFrame | null = null;
|
||||
try {
|
||||
await Promise.all([decoder.tracks.ready, decoder.completed]);
|
||||
const track = decoder.tracks.selectedTrack;
|
||||
const frameCount = track?.frameCount ?? 0;
|
||||
if (frameCount === 0) throw decodeFailed('AVIF has no frames');
|
||||
pending = await decoder.decode({frameIndex: 0});
|
||||
const width = pending.image.displayWidth;
|
||||
const height = pending.image.displayHeight;
|
||||
assertSourceBudget(width, height, frameCount);
|
||||
const containerDelays = readAvifFrameDelaysMs(bytes, frameCount);
|
||||
let context: OffscreenCanvasRenderingContext2D | null = null;
|
||||
let index = 0;
|
||||
return {
|
||||
width,
|
||||
height,
|
||||
frameCount,
|
||||
plays: avifPlaysFromRepetitionCount(track?.repetitionCount),
|
||||
async next() {
|
||||
if (index >= frameCount) return null;
|
||||
const frameIndex = index++;
|
||||
const decoded = pending ?? (await decoder.decode({frameIndex}));
|
||||
pending = null;
|
||||
try {
|
||||
if (!context) {
|
||||
context = new OffscreenCanvas(width, height).getContext('2d', {willReadFrequently: true});
|
||||
if (!context) throw decodeFailed('OffscreenCanvas 2d context is unavailable');
|
||||
}
|
||||
context.clearRect(0, 0, width, height);
|
||||
drawVideoFrameToCanvas(context, decoded.image);
|
||||
const imageData = context.getImageData(0, 0, width, height);
|
||||
return {
|
||||
rgba: new Uint8Array(imageData.data.buffer, imageData.data.byteOffset, imageData.data.byteLength),
|
||||
delayMs: containerDelays?.[frameIndex] ?? avifDelayMs(decoded.image.duration),
|
||||
};
|
||||
} finally {
|
||||
decoded.image.close();
|
||||
}
|
||||
},
|
||||
close() {
|
||||
pending?.image.close();
|
||||
pending = null;
|
||||
closeImageDecoder(decoder);
|
||||
},
|
||||
};
|
||||
} catch (error) {
|
||||
pending?.image.close();
|
||||
closeImageDecoder(decoder);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
interface PendingGifFrame {
|
||||
index: Uint8Array;
|
||||
palette: Array<GifPaletteColor>;
|
||||
delayMs: number;
|
||||
dispose: number;
|
||||
}
|
||||
|
||||
export function openGifFrameSink(width: number, height: number, plays: number, capBytes: number): GifFrameSink {
|
||||
const encoder = GIFEncoder();
|
||||
const pixelCount = width * height;
|
||||
let previous: Uint8Array | null = null;
|
||||
let pending: PendingGifFrame | null = null;
|
||||
let wroteFirst = false;
|
||||
|
||||
function write(frame: PendingGifFrame): void {
|
||||
encoder.writeFrame(frame.index, width, height, {
|
||||
palette: frame.palette,
|
||||
delay: Math.min(frame.delayMs, GIF_MAX_DELAY_CS * 10),
|
||||
transparent: true,
|
||||
transparentIndex: GIF_TRANSPARENT_INDEX,
|
||||
dispose: frame.dispose,
|
||||
...(wroteFirst ? {} : {repeat: gifRepeatFromPlays(plays)}),
|
||||
});
|
||||
wroteFirst = true;
|
||||
}
|
||||
|
||||
function needsFullFrame(rgba: Uint8Array): boolean {
|
||||
if (!previous) return true;
|
||||
for (let offset = 3; offset < rgba.length; offset += 4) {
|
||||
if (previous[offset] === 255 && rgba[offset] === 0) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return {
|
||||
add(rgba, delayMs) {
|
||||
if (rgba.length !== pixelCount * 4) return false;
|
||||
for (let offset = 3; offset < rgba.length; offset += 4) {
|
||||
const alpha = rgba[offset];
|
||||
if (alpha !== 0 && alpha !== 255) return false;
|
||||
}
|
||||
const full = needsFullFrame(rgba);
|
||||
const index = new Uint8Array(pixelCount);
|
||||
const palette: Array<GifPaletteColor> = [[0, 0, 0]];
|
||||
const colors = new Map<number, number>();
|
||||
for (let pixel = 0, offset = 0; pixel < pixelCount; pixel++, offset += 4) {
|
||||
if (rgba[offset + 3] === 0) continue;
|
||||
if (
|
||||
!full &&
|
||||
previous &&
|
||||
previous[offset + 3] === 255 &&
|
||||
previous[offset] === rgba[offset] &&
|
||||
previous[offset + 1] === rgba[offset + 1] &&
|
||||
previous[offset + 2] === rgba[offset + 2]
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
const key = (rgba[offset] << 16) | (rgba[offset + 1] << 8) | rgba[offset + 2];
|
||||
let colorIndex = colors.get(key);
|
||||
if (colorIndex === undefined) {
|
||||
if (palette.length > GIF_MAX_OPAQUE_COLORS) return false;
|
||||
colorIndex = palette.length;
|
||||
colors.set(key, colorIndex);
|
||||
palette.push([rgba[offset], rgba[offset + 1], rgba[offset + 2]]);
|
||||
}
|
||||
index[pixel] = colorIndex;
|
||||
}
|
||||
if (pending) {
|
||||
pending.dispose = full ? 2 : 1;
|
||||
write(pending);
|
||||
if (encoder.bytesView().length > capBytes) return false;
|
||||
}
|
||||
pending = {index, palette, delayMs, dispose: 1};
|
||||
if (previous) previous.set(rgba);
|
||||
else previous = rgba.slice();
|
||||
return true;
|
||||
},
|
||||
finish() {
|
||||
if (pending) write(pending);
|
||||
pending = null;
|
||||
encoder.finish();
|
||||
return encoder.bytes();
|
||||
},
|
||||
close() {
|
||||
pending = null;
|
||||
previous = null;
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -1,103 +1,60 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
export type AnimatedImageFormat = 'gif' | 'webp' | 'avif' | 'apng';
|
||||
export type CropWorkerImageFormat = AnimatedImageFormat | 'png' | 'jpeg';
|
||||
export type CropOutputFormat = 'animated_webp' | 'apng' | 'gif' | 'webp' | 'png' | 'jpeg' | 'avif';
|
||||
export type AnimatedCropSourceFormat = 'gif' | 'png' | 'webp' | 'avif';
|
||||
export type AnimatedCropOutputMime = 'image/gif' | 'image/webp';
|
||||
export type CropErrorCode =
|
||||
| 'aborted'
|
||||
| 'timeout'
|
||||
| 'budget_exceeded'
|
||||
| 'too_large'
|
||||
| 'decode_failed'
|
||||
| 'animated_avif_unsupported'
|
||||
| 'wasm_unavailable'
|
||||
| 'encode_failed'
|
||||
| 'internal';
|
||||
export type CropProgressPhase = 'init' | 'crop' | 'compress';
|
||||
|
||||
export interface CropParams {
|
||||
x: number;
|
||||
y: number;
|
||||
width: number;
|
||||
height: number;
|
||||
imageRotation?: number;
|
||||
resizeWidth?: number | null;
|
||||
resizeHeight?: number | null;
|
||||
outputFormat?: CropOutputFormat;
|
||||
rotation: 0 | 90 | 180 | 270;
|
||||
outputWidth: number;
|
||||
outputHeight: number;
|
||||
}
|
||||
|
||||
export type CropWorkerErrorCode =
|
||||
| 'unsupported_mime'
|
||||
| 'lottie_unsupported'
|
||||
| 'heic_unsupported_in_browser'
|
||||
| 'decode_failed'
|
||||
| 'encode_failed'
|
||||
| 'internal';
|
||||
export type FrameBatchOperation = 'transform_rgba' | 'encode_apng_frame' | 'encode_gif_frame';
|
||||
|
||||
export interface FrameBatch {
|
||||
startIndex: number;
|
||||
operation?: FrameBatchOperation;
|
||||
frames: Array<{
|
||||
data: Uint8Array;
|
||||
delay: number;
|
||||
disposeOp: number;
|
||||
width?: number;
|
||||
height?: number;
|
||||
delayMs?: number;
|
||||
first?: boolean;
|
||||
}>;
|
||||
}
|
||||
|
||||
export enum CropAnimatedImageMessageType {
|
||||
CROP_ANIMATED_IMAGE_START = 0,
|
||||
CROP_ANIMATED_IMAGE_COMPLETE = 1,
|
||||
CROP_ANIMATED_IMAGE_ERROR = 2,
|
||||
PROCESS_BATCH = 3,
|
||||
BATCH_COMPLETE = 4,
|
||||
}
|
||||
|
||||
export interface DecodedFrameInput {
|
||||
rgba: Uint8Array;
|
||||
width: number;
|
||||
height: number;
|
||||
delayMs: number;
|
||||
}
|
||||
|
||||
export interface EncodedApngFrameInput {
|
||||
compressed: Uint8Array;
|
||||
width: number;
|
||||
height: number;
|
||||
delayMs: number;
|
||||
}
|
||||
|
||||
export interface EncodedGifChunkInput {
|
||||
data: Uint8Array;
|
||||
width: number;
|
||||
height: number;
|
||||
}
|
||||
|
||||
export interface CropAnimatedImageStartMessage extends CropParams {
|
||||
type: CropAnimatedImageMessageType.CROP_ANIMATED_IMAGE_START;
|
||||
imageBytes?: Uint8Array;
|
||||
format?: CropWorkerImageFormat;
|
||||
prefetchedFrames?: Array<DecodedFrameInput>;
|
||||
}
|
||||
|
||||
export interface CropAnimatedImageCompleteMessage {
|
||||
type: CropAnimatedImageMessageType.CROP_ANIMATED_IMAGE_COMPLETE;
|
||||
result: Uint8Array;
|
||||
}
|
||||
|
||||
export interface CropAnimatedImageErrorMessage {
|
||||
type: CropAnimatedImageMessageType.CROP_ANIMATED_IMAGE_ERROR;
|
||||
error: string;
|
||||
code?: CropWorkerErrorCode;
|
||||
}
|
||||
|
||||
export interface ProcessBatchMessage {
|
||||
type: CropAnimatedImageMessageType.PROCESS_BATCH;
|
||||
export interface CropWorkerRequest {
|
||||
type: 'crop';
|
||||
jobId: number;
|
||||
batch: FrameBatch;
|
||||
cropParams: CropParams;
|
||||
bytes: ArrayBuffer;
|
||||
format: AnimatedCropSourceFormat;
|
||||
crop: CropParams;
|
||||
sizeLimitBytes: number;
|
||||
}
|
||||
|
||||
export interface ProcessBatchCompleteMessage {
|
||||
type: CropAnimatedImageMessageType.BATCH_COMPLETE;
|
||||
jobId: number;
|
||||
processedFrames: Array<Uint8Array>;
|
||||
processedDecodedFrames?: Array<DecodedFrameInput>;
|
||||
encodedApngFrames?: Array<EncodedApngFrameInput>;
|
||||
encodedGifChunks?: Array<EncodedGifChunkInput>;
|
||||
export interface CropStats {
|
||||
variant: 'simd' | 'scalar' | 'none';
|
||||
passes: number;
|
||||
method: number;
|
||||
quality: number;
|
||||
lossless: boolean;
|
||||
framesDecoded: number;
|
||||
decodeMs: number;
|
||||
encodeMs: number;
|
||||
}
|
||||
|
||||
export type CropWorkerIncomingMessage = CropAnimatedImageStartMessage | ProcessBatchMessage;
|
||||
export type CropWorkerResponse =
|
||||
| {type: 'progress'; jobId: number; phase: CropProgressPhase; done: number; total: number}
|
||||
| {type: 'done'; jobId: number; bytes: ArrayBuffer; mime: AnimatedCropOutputMime; stats: CropStats}
|
||||
| {type: 'error'; jobId: number; code: CropErrorCode; message: string};
|
||||
|
||||
export class CropPipelineError extends Error {
|
||||
readonly code: CropErrorCode;
|
||||
|
||||
constructor(code: CropErrorCode, message: string) {
|
||||
super(message);
|
||||
this.code = code;
|
||||
this.name = 'CropPipelineError';
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,675 +1,135 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
type AnimatedImageFormat,
|
||||
CropAnimatedImageMessageType,
|
||||
type CropAnimatedImageStartMessage,
|
||||
type CropOutputFormat,
|
||||
type AnimatedCropOutputMime,
|
||||
type AnimatedCropSourceFormat,
|
||||
type CropErrorCode,
|
||||
type CropParams,
|
||||
type CropWorkerErrorCode,
|
||||
type CropWorkerImageFormat,
|
||||
type DecodedFrameInput,
|
||||
type ProcessBatchCompleteMessage,
|
||||
type ProcessBatchMessage,
|
||||
CropPipelineError,
|
||||
type CropProgressPhase,
|
||||
type CropStats,
|
||||
type CropWorkerRequest,
|
||||
type CropWorkerResponse,
|
||||
} from '@app/features/expressions/workers/AnimatedImageCropMessages';
|
||||
import {getNativeBridge, type NativeFrame, pickDecoderRouteFor} from '@app/features/messaging/utils/MediaNativeBridge';
|
||||
import {
|
||||
drawVideoFrameToCanvas,
|
||||
type FluxerImageDecoderInstance,
|
||||
getImageDecoderConstructor,
|
||||
} from '@app/features/platform/utils/ImageDecoderInterop';
|
||||
import {
|
||||
cropRotateRgba,
|
||||
ensureLibfluxcoreReady,
|
||||
releaseLibfluxcoreMemoryIfIdle,
|
||||
} from '@app/features/platform/utils/LibFluxcore';
|
||||
|
||||
interface WorkerRequest {
|
||||
resolve: (result: Uint8Array) => void;
|
||||
reject: (error: Error) => void;
|
||||
timeout: NodeJS.Timeout;
|
||||
export {CropPipelineError};
|
||||
|
||||
const STALL_TIMEOUT_MS = 45_000;
|
||||
|
||||
let lastJobId = 0;
|
||||
|
||||
export interface AnimatedCropRequest {
|
||||
bytes: ArrayBuffer;
|
||||
format: AnimatedCropSourceFormat;
|
||||
crop: CropParams;
|
||||
sizeLimitBytes: number;
|
||||
}
|
||||
|
||||
interface WorkerState {
|
||||
worker: Worker;
|
||||
busy: boolean;
|
||||
currentRequest: WorkerRequest | null;
|
||||
export interface AnimatedCropProgress {
|
||||
phase: CropProgressPhase;
|
||||
fraction: number;
|
||||
}
|
||||
|
||||
interface BatchRequest {
|
||||
reject: (error: Error) => void;
|
||||
cleanup: () => void;
|
||||
export interface AnimatedCropOptions {
|
||||
signal: AbortSignal;
|
||||
onProgress?: (progress: AnimatedCropProgress) => void;
|
||||
}
|
||||
|
||||
const PARALLEL_FRAME_THRESHOLD = 8;
|
||||
const PARALLEL_PIXEL_THRESHOLD = 1_000_000;
|
||||
const WORKER_IDLE_TIMEOUT_MS = 30_000;
|
||||
|
||||
export class CropPipelineError extends Error {
|
||||
readonly code: CropWorkerErrorCode;
|
||||
|
||||
constructor(code: CropWorkerErrorCode, message: string) {
|
||||
super(message);
|
||||
this.code = code;
|
||||
this.name = 'CropPipelineError';
|
||||
}
|
||||
}
|
||||
|
||||
export interface CropSource {
|
||||
export interface AnimatedCropResult {
|
||||
bytes: Uint8Array;
|
||||
mime: string;
|
||||
format?: CropWorkerImageFormat;
|
||||
mime: AnimatedCropOutputMime;
|
||||
stats: CropStats;
|
||||
}
|
||||
|
||||
export interface CropOptionsEx extends CropParams {
|
||||
outputFormat?: CropOutputFormat;
|
||||
function abortedError(): CropPipelineError {
|
||||
return new CropPipelineError('aborted', 'Animated crop was aborted');
|
||||
}
|
||||
|
||||
export class AnimatedImageCropWorkerManager {
|
||||
private static instance: AnimatedImageCropWorkerManager | null = null;
|
||||
private workers: Array<WorkerState> = [];
|
||||
private readonly pendingBatchRequests = new Set<BatchRequest>();
|
||||
private readonly maxWorkers: number;
|
||||
private terminated = false;
|
||||
private activeJobCount = 0;
|
||||
private idleTerminationTimeout: NodeJS.Timeout | null = null;
|
||||
private readonly workerTimeout: number = 30000;
|
||||
export function cropAnimatedImage(
|
||||
request: AnimatedCropRequest,
|
||||
options: AnimatedCropOptions,
|
||||
): Promise<AnimatedCropResult> {
|
||||
const {signal, onProgress} = options;
|
||||
if (signal.aborted) return Promise.reject(abortedError());
|
||||
const jobId = ++lastJobId;
|
||||
|
||||
private constructor() {
|
||||
this.maxWorkers = Math.max(1, Math.min(4, (navigator.hardwareConcurrency || 4) - 1));
|
||||
}
|
||||
|
||||
static getInstance(): AnimatedImageCropWorkerManager {
|
||||
if (!AnimatedImageCropWorkerManager.instance) {
|
||||
AnimatedImageCropWorkerManager.instance = new AnimatedImageCropWorkerManager();
|
||||
}
|
||||
return AnimatedImageCropWorkerManager.instance;
|
||||
}
|
||||
|
||||
private ensureWorkersInitialized(): void {
|
||||
if (this.workers.length < this.maxWorkers && !this.terminated) {
|
||||
const workersToCreate = this.maxWorkers - this.workers.length;
|
||||
for (let i = 0; i < workersToCreate; i++) {
|
||||
const worker = new Worker(
|
||||
new URL(/* webpackChunkName: "animated-image-crop.worker" */ './AnimatedImageCropWorker.ts', import.meta.url),
|
||||
{
|
||||
type: 'module',
|
||||
},
|
||||
);
|
||||
const workerState: WorkerState = {
|
||||
worker,
|
||||
busy: false,
|
||||
currentRequest: null,
|
||||
};
|
||||
worker.addEventListener('message', (event: MessageEvent) => {
|
||||
this.handleWorkerMessage(workerState, event);
|
||||
});
|
||||
worker.addEventListener('error', (error) => {
|
||||
this.handleWorkerError(workerState, error);
|
||||
});
|
||||
this.workers.push(workerState);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private handleWorkerMessage(workerState: WorkerState, event: MessageEvent): void {
|
||||
const msg = event.data;
|
||||
const request = workerState.currentRequest;
|
||||
if (!request) {
|
||||
return new Promise<AnimatedCropResult>((resolve, reject) => {
|
||||
let worker: Worker;
|
||||
try {
|
||||
worker = new Worker(
|
||||
new URL(/* webpackChunkName: "animated-image-crop.worker" */ './AnimatedImageCropWorker.ts', import.meta.url),
|
||||
{type: 'module'},
|
||||
);
|
||||
} catch (error) {
|
||||
reject(new CropPipelineError('internal', error instanceof Error ? error.message : String(error)));
|
||||
return;
|
||||
}
|
||||
if (msg.type === CropAnimatedImageMessageType.CROP_ANIMATED_IMAGE_COMPLETE) {
|
||||
clearTimeout(request.timeout);
|
||||
workerState.busy = false;
|
||||
workerState.currentRequest = null;
|
||||
if (msg.result) {
|
||||
request.resolve(msg.result);
|
||||
} else {
|
||||
request.reject(new CropPipelineError('internal', 'Empty result from worker'));
|
||||
}
|
||||
} else if (msg.type === CropAnimatedImageMessageType.CROP_ANIMATED_IMAGE_ERROR) {
|
||||
clearTimeout(request.timeout);
|
||||
workerState.busy = false;
|
||||
workerState.currentRequest = null;
|
||||
const code: CropWorkerErrorCode = msg.code ?? 'internal';
|
||||
request.reject(new CropPipelineError(code, msg.error || 'Unknown error from worker'));
|
||||
}
|
||||
}
|
||||
let settled = false;
|
||||
let stallTimer: ReturnType<typeof setTimeout> | null = null;
|
||||
|
||||
private handleWorkerError(workerState: WorkerState, error: ErrorEvent): void {
|
||||
const request = workerState.currentRequest;
|
||||
if (request) {
|
||||
clearTimeout(request.timeout);
|
||||
workerState.currentRequest = null;
|
||||
request.reject(
|
||||
new CropPipelineError(
|
||||
'internal',
|
||||
`Worker error: ${error.message || 'unknown error (worker script may have failed to load)'}`,
|
||||
),
|
||||
);
|
||||
}
|
||||
workerState.busy = false;
|
||||
try {
|
||||
workerState.worker.terminate();
|
||||
} catch {}
|
||||
const index = this.workers.indexOf(workerState);
|
||||
if (index !== -1) {
|
||||
this.workers.splice(index, 1);
|
||||
}
|
||||
}
|
||||
const settle = (finish: () => void): void => {
|
||||
if (settled) return;
|
||||
settled = true;
|
||||
if (stallTimer !== null) clearTimeout(stallTimer);
|
||||
stallTimer = null;
|
||||
worker.removeEventListener('message', handleMessage);
|
||||
worker.removeEventListener('error', handleError);
|
||||
worker.removeEventListener('messageerror', handleMessageError);
|
||||
signal.removeEventListener('abort', handleAbort);
|
||||
worker.terminate();
|
||||
finish();
|
||||
};
|
||||
const fail = (code: CropErrorCode, message: string): void => {
|
||||
settle(() => reject(new CropPipelineError(code, message)));
|
||||
};
|
||||
const armStallTimer = (): void => {
|
||||
if (stallTimer !== null) clearTimeout(stallTimer);
|
||||
stallTimer = setTimeout(() => fail('timeout', 'Animated crop worker stopped responding'), STALL_TIMEOUT_MS);
|
||||
};
|
||||
|
||||
async cropImage(imageBytes: Uint8Array, format: AnimatedImageFormat, options: CropParams): Promise<Uint8Array> {
|
||||
return this.cropImageEx({bytes: imageBytes, mime: mimeForAnimatedFormat(format), format}, options);
|
||||
}
|
||||
|
||||
async cropImageEx(source: CropSource, options: CropOptionsEx): Promise<Uint8Array> {
|
||||
if (this.terminated) {
|
||||
throw new CropPipelineError('internal', 'Worker manager has been terminated');
|
||||
}
|
||||
const mime = source.mime.toLowerCase();
|
||||
if (mime === 'application/json' || mime === 'application/lottie+json') {
|
||||
throw new CropPipelineError('lottie_unsupported', "Lottie can't be cropped. Upload a square JSON instead.");
|
||||
}
|
||||
const route = pickDecoderRouteFor(mime, getNativeBridge() !== null);
|
||||
const wasmFormat = inferWasmFormat(mime, source.format);
|
||||
if (route === 'unsupported') {
|
||||
if (mime === 'image/heic' || mime === 'image/heif') {
|
||||
throw new CropPipelineError(
|
||||
'heic_unsupported_in_browser',
|
||||
'HEIC decode requires the desktop app or a Safari browser',
|
||||
);
|
||||
}
|
||||
throw new CropPipelineError('unsupported_mime', `unsupported MIME type: ${mime}`);
|
||||
}
|
||||
if (route === 'libfluxcore' && wasmFormat) {
|
||||
return this.runLibfluxcoreWorker(source.bytes, wasmFormat, options, options.outputFormat);
|
||||
}
|
||||
if (route !== 'native' && route !== 'browser') {
|
||||
throw new CropPipelineError('unsupported_mime', `unhandled decoder route: ${route}`);
|
||||
}
|
||||
const frames = await this.decodeToFrames(source, route);
|
||||
return this.encodeCroppedFrames(frames, options);
|
||||
}
|
||||
|
||||
private runLibfluxcoreWorker(
|
||||
imageBytes: Uint8Array,
|
||||
format: CropWorkerImageFormat,
|
||||
options: CropParams,
|
||||
outputFormat: CropOutputFormat | undefined,
|
||||
): Promise<Uint8Array> {
|
||||
if (this.terminated) {
|
||||
throw new CropPipelineError('internal', 'Worker manager has been terminated');
|
||||
}
|
||||
this.beginJob();
|
||||
return this.dispatchLibfluxcoreWorker(imageBytes, format, options, outputFormat).finally(() => {
|
||||
this.endJob();
|
||||
});
|
||||
}
|
||||
|
||||
private dispatchLibfluxcoreWorker(
|
||||
imageBytes: Uint8Array,
|
||||
format: CropWorkerImageFormat,
|
||||
options: CropParams,
|
||||
outputFormat: CropOutputFormat | undefined,
|
||||
): Promise<Uint8Array> {
|
||||
if (this.terminated) {
|
||||
return Promise.reject(new CropPipelineError('internal', 'Worker manager has been terminated'));
|
||||
}
|
||||
this.ensureWorkersInitialized();
|
||||
const workerState = this.findAvailableWorker();
|
||||
if (!workerState) {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
this.dispatchLibfluxcoreWorker(imageBytes, format, options, outputFormat).then(resolve, reject);
|
||||
}, 50);
|
||||
});
|
||||
}
|
||||
return new Promise<Uint8Array>((resolve, reject) => {
|
||||
const timeout = setTimeout(() => {
|
||||
workerState.busy = false;
|
||||
workerState.currentRequest = null;
|
||||
reject(new CropPipelineError('internal', `Crop operation timed out after ${this.workerTimeout}ms`));
|
||||
}, this.workerTimeout);
|
||||
workerState.busy = true;
|
||||
workerState.currentRequest = {resolve, reject, timeout};
|
||||
const message: CropAnimatedImageStartMessage = {
|
||||
type: CropAnimatedImageMessageType.CROP_ANIMATED_IMAGE_START,
|
||||
imageBytes,
|
||||
format,
|
||||
...options,
|
||||
outputFormat,
|
||||
};
|
||||
const transferables: Array<Transferable> = [];
|
||||
if (imageBytes.buffer) {
|
||||
transferables.push(imageBytes.buffer);
|
||||
}
|
||||
workerState.worker.postMessage(message, transferables);
|
||||
});
|
||||
}
|
||||
|
||||
private async decodeToFrames(source: CropSource, route: 'native' | 'browser'): Promise<Array<NativeFrame>> {
|
||||
if (route === 'native') {
|
||||
const bridge = getNativeBridge();
|
||||
if (!bridge) {
|
||||
throw new CropPipelineError('decode_failed', 'native bridge unavailable');
|
||||
}
|
||||
try {
|
||||
if (source.mime === 'image/heic' || source.mime === 'image/heif') {
|
||||
const f = bridge.decodeHeic(source.bytes);
|
||||
return [{rgba: f.rgba, width: f.width, height: f.height, delayMs: 0}];
|
||||
}
|
||||
if (source.mime === 'image/jxl') {
|
||||
const f = bridge.decodeJxl(source.bytes);
|
||||
return [{rgba: f.rgba, width: f.width, height: f.height, delayMs: 0}];
|
||||
}
|
||||
const decoded = bridge.decodeImage(source.bytes);
|
||||
return decoded.frames;
|
||||
} catch (err) {
|
||||
throw new CropPipelineError(
|
||||
'decode_failed',
|
||||
err instanceof Error ? err.message : `failed to decode ${source.mime}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
return decodeViaImageDecoder(source);
|
||||
}
|
||||
|
||||
private async encodeCroppedFrames(frames: Array<NativeFrame>, options: CropOptionsEx): Promise<Uint8Array> {
|
||||
if (frames.length === 0) {
|
||||
throw new CropPipelineError('decode_failed', 'no frames decoded');
|
||||
}
|
||||
let cropped: Array<NativeFrame>;
|
||||
try {
|
||||
await ensureLibfluxcoreReady();
|
||||
cropped = await this.cropDecodedFrames(frames, options);
|
||||
} catch (err) {
|
||||
throw new CropPipelineError('internal', err instanceof Error ? err.message : 'wasm RGBA crop failed');
|
||||
} finally {
|
||||
releaseLibfluxcoreMemoryIfIdle();
|
||||
}
|
||||
const isAnimated = frames.length > 1;
|
||||
const outputFormat: CropOutputFormat = options.outputFormat ?? (isAnimated ? 'animated_webp' : 'webp');
|
||||
const bridge = getNativeBridge();
|
||||
if (outputFormat === 'animated_webp' || outputFormat === 'apng') {
|
||||
if (!bridge) {
|
||||
throw new CropPipelineError('encode_failed', 'animated output requires the native bridge (desktop app)');
|
||||
}
|
||||
try {
|
||||
if (outputFormat === 'animated_webp') return bridge.encodeAnimatedWebp(cropped);
|
||||
return bridge.encodeAnimatedApng(cropped);
|
||||
} catch (err) {
|
||||
throw new CropPipelineError('encode_failed', err instanceof Error ? err.message : 'animated encode failed');
|
||||
}
|
||||
}
|
||||
const first = cropped[0];
|
||||
if (first === undefined) {
|
||||
throw new CropPipelineError('encode_failed', 'no cropped frame available');
|
||||
}
|
||||
if (outputFormat === 'avif') {
|
||||
if (!bridge) throw new CropPipelineError('encode_failed', 'AVIF encode requires the native bridge');
|
||||
try {
|
||||
return bridge.encodeAvif(first.rgba, first.width, first.height, true);
|
||||
} catch (err) {
|
||||
throw new CropPipelineError('encode_failed', err instanceof Error ? err.message : 'AVIF encode failed');
|
||||
}
|
||||
}
|
||||
return encodeViaCanvas(first, outputFormat);
|
||||
}
|
||||
|
||||
private async cropDecodedFrames(frames: Array<NativeFrame>, options: CropOptionsEx): Promise<Array<NativeFrame>> {
|
||||
if (this.shouldCropFramesInWorkers(frames)) {
|
||||
return this.cropFramesInWorkerBatches(frames, options);
|
||||
}
|
||||
return frames.map((frame) => cropDecodedFrame(frame, options));
|
||||
}
|
||||
|
||||
private shouldCropFramesInWorkers(frames: Array<NativeFrame>): boolean {
|
||||
if (frames.length < PARALLEL_FRAME_THRESHOLD || this.maxWorkers <= 1) return false;
|
||||
let pixels = 0;
|
||||
for (const frame of frames) pixels += frame.width * frame.height;
|
||||
return pixels >= PARALLEL_PIXEL_THRESHOLD;
|
||||
}
|
||||
|
||||
private async cropFramesInWorkerBatches(
|
||||
frames: Array<NativeFrame>,
|
||||
options: CropOptionsEx,
|
||||
): Promise<Array<NativeFrame>> {
|
||||
this.beginJob();
|
||||
try {
|
||||
this.ensureWorkersInitialized();
|
||||
const availableWorkers = this.workers.filter((worker) => !worker.busy);
|
||||
if (availableWorkers.length <= 1) {
|
||||
return frames.map((frame) => cropDecodedFrame(frame, options));
|
||||
}
|
||||
const batches = createFrameBatches(frames, availableWorkers.length);
|
||||
const results = await Promise.all(
|
||||
batches.map((batch, index) =>
|
||||
this.processFrameBatchWithWorker(availableWorkers[index], index + 1, batch, options),
|
||||
),
|
||||
);
|
||||
const ordered: Array<NativeFrame | undefined> = new Array(frames.length);
|
||||
for (const batch of results) {
|
||||
for (const item of batch) ordered[item.index] = item.frame;
|
||||
}
|
||||
return ordered.map((frame, index) => {
|
||||
if (!frame) throw new CropPipelineError('internal', `Missing transformed frame ${index}`);
|
||||
return frame;
|
||||
});
|
||||
} finally {
|
||||
this.endJob();
|
||||
}
|
||||
}
|
||||
|
||||
private processFrameBatchWithWorker(
|
||||
workerState: WorkerState,
|
||||
jobId: number,
|
||||
batch: Array<{frame: NativeFrame; index: number}>,
|
||||
options: CropOptionsEx,
|
||||
): Promise<Array<{frame: NativeFrame; index: number}>> {
|
||||
return new Promise((resolve, reject) => {
|
||||
let pendingBatchRequest: BatchRequest | null = null;
|
||||
const timeout = setTimeout(() => {
|
||||
cleanup();
|
||||
workerState.busy = false;
|
||||
reject(new CropPipelineError('internal', `Frame batch timed out after ${this.workerTimeout}ms`));
|
||||
}, this.workerTimeout);
|
||||
const cleanup = () => {
|
||||
clearTimeout(timeout);
|
||||
workerState.worker.removeEventListener('message', handleMessage);
|
||||
workerState.worker.removeEventListener('error', handleError);
|
||||
if (pendingBatchRequest) {
|
||||
this.pendingBatchRequests.delete(pendingBatchRequest);
|
||||
pendingBatchRequest = null;
|
||||
}
|
||||
};
|
||||
const handleMessage = (event: MessageEvent<ProcessBatchCompleteMessage>) => {
|
||||
const msg = event.data;
|
||||
if (msg.type !== CropAnimatedImageMessageType.BATCH_COMPLETE || msg.jobId !== jobId) return;
|
||||
cleanup();
|
||||
workerState.busy = false;
|
||||
const processed = msg.processedDecodedFrames;
|
||||
if (!processed) {
|
||||
reject(new CropPipelineError('internal', 'Frame batch returned no decoded frames'));
|
||||
function handleMessage(event: MessageEvent<CropWorkerResponse>): void {
|
||||
const message = event.data;
|
||||
if (message?.jobId !== jobId) return;
|
||||
armStallTimer();
|
||||
switch (message.type) {
|
||||
case 'progress':
|
||||
onProgress?.({phase: message.phase, fraction: message.total > 0 ? message.done / message.total : 0});
|
||||
return;
|
||||
case 'done':
|
||||
settle(() => resolve({bytes: new Uint8Array(message.bytes), mime: message.mime, stats: message.stats}));
|
||||
return;
|
||||
case 'error':
|
||||
fail(message.code, message.message);
|
||||
return;
|
||||
}
|
||||
resolve(processed.map((frame, offset) => ({frame, index: batch[offset]?.index ?? offset})));
|
||||
};
|
||||
const handleError = (error: ErrorEvent) => {
|
||||
cleanup();
|
||||
workerState.busy = false;
|
||||
reject(
|
||||
new CropPipelineError(
|
||||
'internal',
|
||||
`Worker error: ${error.message || 'unknown error (frame batch worker failed)'}`,
|
||||
),
|
||||
);
|
||||
};
|
||||
workerState.busy = true;
|
||||
pendingBatchRequest = {reject, cleanup};
|
||||
this.pendingBatchRequests.add(pendingBatchRequest);
|
||||
workerState.worker.addEventListener('message', handleMessage);
|
||||
workerState.worker.addEventListener('error', handleError);
|
||||
const message: ProcessBatchMessage = {
|
||||
type: CropAnimatedImageMessageType.PROCESS_BATCH,
|
||||
jobId,
|
||||
cropParams: options,
|
||||
batch: {
|
||||
startIndex: 0,
|
||||
operation: 'transform_rgba',
|
||||
frames: batch.map(({frame}) => ({
|
||||
data: frame.rgba,
|
||||
width: frame.width,
|
||||
height: frame.height,
|
||||
delay: frame.delayMs,
|
||||
delayMs: frame.delayMs,
|
||||
disposeOp: 0,
|
||||
})),
|
||||
},
|
||||
};
|
||||
const transferables = batch.map(({frame}) => frame.rgba.buffer);
|
||||
workerState.worker.postMessage(message, transferables);
|
||||
});
|
||||
}
|
||||
|
||||
private findAvailableWorker(): WorkerState | null {
|
||||
for (const workerState of this.workers) {
|
||||
if (!workerState.busy) {
|
||||
return workerState;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private beginJob(): void {
|
||||
this.clearIdleTermination();
|
||||
this.activeJobCount += 1;
|
||||
}
|
||||
|
||||
private endJob(): void {
|
||||
this.activeJobCount = Math.max(0, this.activeJobCount - 1);
|
||||
this.scheduleIdleTermination();
|
||||
}
|
||||
|
||||
private isPoolIdle(): boolean {
|
||||
return (
|
||||
this.activeJobCount === 0 &&
|
||||
this.pendingBatchRequests.size === 0 &&
|
||||
this.workers.every((workerState) => !workerState.busy && workerState.currentRequest === null)
|
||||
);
|
||||
}
|
||||
|
||||
private clearIdleTermination(): void {
|
||||
if (this.idleTerminationTimeout === null) {
|
||||
return;
|
||||
function handleError(event: ErrorEvent): void {
|
||||
fail('internal', event.message || 'Animated crop worker failed');
|
||||
}
|
||||
clearTimeout(this.idleTerminationTimeout);
|
||||
this.idleTerminationTimeout = null;
|
||||
}
|
||||
|
||||
private scheduleIdleTermination(): void {
|
||||
this.clearIdleTermination();
|
||||
if (this.terminated || this.workers.length === 0 || !this.isPoolIdle()) {
|
||||
return;
|
||||
function handleMessageError(): void {
|
||||
fail('internal', 'Animated crop worker sent a message that could not be read');
|
||||
}
|
||||
this.idleTerminationTimeout = setTimeout(() => {
|
||||
this.idleTerminationTimeout = null;
|
||||
if (this.isPoolIdle()) {
|
||||
this.terminateIdleWorkers();
|
||||
}
|
||||
}, WORKER_IDLE_TIMEOUT_MS);
|
||||
}
|
||||
|
||||
private terminateIdleWorkers(): void {
|
||||
for (const workerState of this.workers) {
|
||||
try {
|
||||
workerState.worker.terminate();
|
||||
} catch {}
|
||||
function handleAbort(): void {
|
||||
settle(() => reject(abortedError()));
|
||||
}
|
||||
this.workers = [];
|
||||
}
|
||||
|
||||
getActiveWorkerCount(): number {
|
||||
return this.workers.filter((w) => w.busy).length;
|
||||
}
|
||||
|
||||
getTotalWorkerCount(): number {
|
||||
return this.workers.length;
|
||||
}
|
||||
|
||||
terminate(): void {
|
||||
if (this.terminated) {
|
||||
return;
|
||||
worker.addEventListener('message', handleMessage);
|
||||
worker.addEventListener('error', handleError);
|
||||
worker.addEventListener('messageerror', handleMessageError);
|
||||
signal.addEventListener('abort', handleAbort);
|
||||
armStallTimer();
|
||||
const message: CropWorkerRequest = {
|
||||
type: 'crop',
|
||||
jobId,
|
||||
bytes: request.bytes,
|
||||
format: request.format,
|
||||
crop: request.crop,
|
||||
sizeLimitBytes: request.sizeLimitBytes,
|
||||
};
|
||||
try {
|
||||
worker.postMessage(message, [request.bytes]);
|
||||
} catch (error) {
|
||||
fail('internal', error instanceof Error ? error.message : String(error));
|
||||
}
|
||||
this.terminated = true;
|
||||
this.clearIdleTermination();
|
||||
for (const workerState of this.workers) {
|
||||
if (workerState.currentRequest) {
|
||||
clearTimeout(workerState.currentRequest.timeout);
|
||||
workerState.currentRequest.reject(new CropPipelineError('internal', 'Worker manager terminated'));
|
||||
}
|
||||
workerState.worker.terminate();
|
||||
}
|
||||
const error = new CropPipelineError('internal', 'Worker manager terminated');
|
||||
for (const request of Array.from(this.pendingBatchRequests)) {
|
||||
request.cleanup();
|
||||
request.reject(error);
|
||||
}
|
||||
this.pendingBatchRequests.clear();
|
||||
this.workers = [];
|
||||
AnimatedImageCropWorkerManager.instance = null;
|
||||
}
|
||||
|
||||
restart(): void {
|
||||
if (!this.terminated) {
|
||||
return;
|
||||
}
|
||||
this.terminated = false;
|
||||
this.ensureWorkersInitialized();
|
||||
this.scheduleIdleTermination();
|
||||
}
|
||||
}
|
||||
|
||||
function inferWasmFormat(mime: string, hint: CropWorkerImageFormat | undefined): CropWorkerImageFormat | null {
|
||||
if (hint) return hint;
|
||||
switch (mime) {
|
||||
case 'image/png':
|
||||
return 'png';
|
||||
case 'image/apng':
|
||||
return 'apng';
|
||||
case 'image/jpeg':
|
||||
return 'jpeg';
|
||||
case 'image/gif':
|
||||
return 'gif';
|
||||
case 'image/webp':
|
||||
return 'webp';
|
||||
case 'image/avif':
|
||||
return 'avif';
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function mimeForAnimatedFormat(format: AnimatedImageFormat): string {
|
||||
switch (format) {
|
||||
case 'apng':
|
||||
return 'image/apng';
|
||||
case 'gif':
|
||||
return 'image/gif';
|
||||
case 'webp':
|
||||
return 'image/webp';
|
||||
case 'avif':
|
||||
return 'image/avif';
|
||||
}
|
||||
}
|
||||
|
||||
function cropDecodedFrame(frame: NativeFrame, options: CropOptionsEx): NativeFrame {
|
||||
const transformed = cropRotateRgba(
|
||||
frame.rgba,
|
||||
frame.width,
|
||||
frame.height,
|
||||
options.x,
|
||||
options.y,
|
||||
options.width,
|
||||
options.height,
|
||||
options.imageRotation ?? 0,
|
||||
options.resizeWidth ?? null,
|
||||
options.resizeHeight ?? null,
|
||||
);
|
||||
return {
|
||||
rgba: transformed.rgba,
|
||||
width: transformed.width,
|
||||
height: transformed.height,
|
||||
delayMs: frame.delayMs,
|
||||
};
|
||||
}
|
||||
|
||||
function createFrameBatches(
|
||||
frames: Array<NativeFrame>,
|
||||
workerCount: number,
|
||||
): Array<Array<{frame: DecodedFrameInput; index: number}>> {
|
||||
const batches: Array<Array<{frame: DecodedFrameInput; index: number}>> = Array.from({length: workerCount}, () => []);
|
||||
for (let index = 0; index < frames.length; index += 1) {
|
||||
batches[index % workerCount]?.push({frame: frames[index], index});
|
||||
}
|
||||
return batches.filter((batch) => batch.length > 0);
|
||||
}
|
||||
|
||||
async function encodeViaCanvas(frame: NativeFrame, format: 'webp' | 'png' | 'jpeg' | 'gif'): Promise<Uint8Array> {
|
||||
if (typeof OffscreenCanvas === 'undefined') {
|
||||
throw new CropPipelineError('encode_failed', 'OffscreenCanvas required for static encode fallback');
|
||||
}
|
||||
const canvas = new OffscreenCanvas(frame.width, frame.height);
|
||||
const ctx = canvas.getContext('2d');
|
||||
if (!ctx) throw new CropPipelineError('encode_failed', 'no 2d context');
|
||||
const imageData = new ImageData(new Uint8ClampedArray(frame.rgba), frame.width, frame.height);
|
||||
ctx.putImageData(imageData, 0, 0);
|
||||
const mime = format === 'jpeg' ? 'image/jpeg' : format === 'gif' ? 'image/gif' : `image/${format}`;
|
||||
let blob: Blob;
|
||||
try {
|
||||
blob = await canvas.convertToBlob({type: mime, quality: 0.92});
|
||||
} catch (err) {
|
||||
throw new CropPipelineError('encode_failed', err instanceof Error ? err.message : 'canvas encode failed');
|
||||
}
|
||||
const buffer = await blob.arrayBuffer();
|
||||
return new Uint8Array(buffer);
|
||||
}
|
||||
|
||||
async function decodeViaImageDecoder(source: CropSource): Promise<Array<NativeFrame>> {
|
||||
const Cls = getImageDecoderConstructor();
|
||||
if (!Cls) {
|
||||
throw new CropPipelineError('decode_failed', 'ImageDecoder unavailable in this browser');
|
||||
}
|
||||
let decoder: FluxerImageDecoderInstance | null = null;
|
||||
try {
|
||||
decoder = new Cls({data: source.bytes, type: source.mime, preferAnimation: true});
|
||||
await decoder.completed;
|
||||
const track = decoder.tracks.selectedTrack;
|
||||
const frameCount = Math.max(1, track?.frameCount ?? 1);
|
||||
const frames: Array<NativeFrame> = [];
|
||||
for (let i = 0; i < frameCount; i++) {
|
||||
const {image} = await decoder.decode({frameIndex: i, completeFramesOnly: true});
|
||||
try {
|
||||
const w = image.displayWidth;
|
||||
const h = image.displayHeight;
|
||||
if (typeof OffscreenCanvas === 'undefined') {
|
||||
throw new CropPipelineError('decode_failed', 'OffscreenCanvas required for ImageDecoder fallback');
|
||||
}
|
||||
const canvas = new OffscreenCanvas(w, h);
|
||||
const ctx = canvas.getContext('2d');
|
||||
if (!ctx) throw new CropPipelineError('decode_failed', 'no 2d context');
|
||||
drawVideoFrameToCanvas(ctx, image);
|
||||
const data = ctx.getImageData(0, 0, w, h);
|
||||
const delayMs = (image.duration ?? 0) / 1000;
|
||||
frames.push({rgba: new Uint8Array(data.data.buffer.slice(0)), width: w, height: h, delayMs});
|
||||
} finally {
|
||||
image.close();
|
||||
}
|
||||
}
|
||||
return frames;
|
||||
} catch (err) {
|
||||
throw new CropPipelineError(
|
||||
'decode_failed',
|
||||
err instanceof Error ? err.message : `failed to decode ${source.mime}`,
|
||||
);
|
||||
} finally {
|
||||
decoder?.close();
|
||||
}
|
||||
}
|
||||
|
||||
export async function cropAnimatedImageWithWorkerPool(
|
||||
imageBytes: Uint8Array,
|
||||
format: AnimatedImageFormat,
|
||||
options: CropParams,
|
||||
): Promise<Uint8Array> {
|
||||
const manager = AnimatedImageCropWorkerManager.getInstance();
|
||||
return manager.cropImage(imageBytes, format, options);
|
||||
}
|
||||
|
||||
export async function cropImageWithSource(source: CropSource, options: CropOptionsEx): Promise<Uint8Array> {
|
||||
const manager = AnimatedImageCropWorkerManager.getInstance();
|
||||
return manager.cropImageEx(source, options);
|
||||
}
|
||||
|
||||
export function getWorkerManager(): AnimatedImageCropWorkerManager {
|
||||
return AnimatedImageCropWorkerManager.getInstance();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,279 +0,0 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
type AnimatedImageFormat,
|
||||
type CropAnimatedImageCompleteMessage,
|
||||
type CropAnimatedImageErrorMessage,
|
||||
CropAnimatedImageMessageType,
|
||||
type CropAnimatedImageStartMessage,
|
||||
type CropParams,
|
||||
type FrameBatch,
|
||||
} from '@app/features/expressions/workers/AnimatedImageCropMessages';
|
||||
|
||||
interface WorkerJob {
|
||||
indices: Array<number>;
|
||||
frames: Array<Uint8Array>;
|
||||
resolve: (value: Uint8Array) => void;
|
||||
reject: (reason?: unknown) => void;
|
||||
timeout: NodeJS.Timeout;
|
||||
}
|
||||
|
||||
interface WorkerState {
|
||||
worker: Worker;
|
||||
busy: boolean;
|
||||
currentJob: WorkerJob | null;
|
||||
}
|
||||
|
||||
const DEFAULT_TIMEOUT = 30000;
|
||||
|
||||
export class AnimatedImageCropWorkerPool {
|
||||
private workers: Array<WorkerState>;
|
||||
private readonly timeout: number;
|
||||
private terminated: boolean = false;
|
||||
|
||||
constructor(workerCount?: number, timeout: number = DEFAULT_TIMEOUT) {
|
||||
const concurrency = workerCount ?? Math.max(1, (navigator.hardwareConcurrency || 4) - 1);
|
||||
this.timeout = timeout;
|
||||
this.workers = [];
|
||||
for (let i = 0; i < concurrency; i++) {
|
||||
const worker = new Worker(
|
||||
new URL(/* webpackChunkName: "animated-image-crop.worker" */ './AnimatedImageCropWorker.ts', import.meta.url),
|
||||
{
|
||||
type: 'module',
|
||||
},
|
||||
);
|
||||
this.workers.push({
|
||||
worker,
|
||||
busy: false,
|
||||
currentJob: null,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async processFramesParallel(
|
||||
frames: Array<Uint8Array>,
|
||||
cropParams: CropParams,
|
||||
format: AnimatedImageFormat = 'gif',
|
||||
): Promise<Array<Uint8Array>> {
|
||||
if (this.terminated) {
|
||||
throw new Error('Worker pool has been terminated');
|
||||
}
|
||||
if (frames.length === 0) {
|
||||
return [];
|
||||
}
|
||||
if (frames.length === 1) {
|
||||
return [await this.processSingleFrame(frames[0], cropParams, format)];
|
||||
}
|
||||
const batches = this.createBatches(frames);
|
||||
const workerCount = this.workers.length;
|
||||
const results: Array<{
|
||||
index: number;
|
||||
data: Uint8Array;
|
||||
}> = [];
|
||||
const batchPromises = batches.map((batch, batchIndex) => {
|
||||
const workerIndex = batchIndex % workerCount;
|
||||
return this.processBatchWithWorker(workerIndex, batch, cropParams, format);
|
||||
});
|
||||
const batchResults = await Promise.all(batchPromises);
|
||||
for (const batchResult of batchResults) {
|
||||
results.push(...batchResult);
|
||||
}
|
||||
results.sort((a, b) => a.index - b.index);
|
||||
return results.map((r) => r.data);
|
||||
}
|
||||
|
||||
private createBatches(frames: Array<Uint8Array>): Array<FrameBatch> {
|
||||
const workerCount = this.workers.length;
|
||||
const batches: Array<FrameBatch> = [];
|
||||
const framesPerBatch = Math.ceil(frames.length / workerCount);
|
||||
for (let i = 0; i < workerCount && i * framesPerBatch < frames.length; i++) {
|
||||
const startIndex = i * framesPerBatch;
|
||||
const endIndex = Math.min(startIndex + framesPerBatch, frames.length);
|
||||
const batchFrames = frames.slice(startIndex, endIndex);
|
||||
batches.push({
|
||||
startIndex,
|
||||
frames: batchFrames.map((data) => ({
|
||||
data,
|
||||
delay: 0,
|
||||
disposeOp: 0,
|
||||
})),
|
||||
});
|
||||
}
|
||||
return batches;
|
||||
}
|
||||
|
||||
private async processBatchWithWorker(
|
||||
workerIndex: number,
|
||||
batch: FrameBatch,
|
||||
cropParams: CropParams,
|
||||
format: AnimatedImageFormat,
|
||||
): Promise<
|
||||
Array<{
|
||||
index: number;
|
||||
data: Uint8Array;
|
||||
}>
|
||||
> {
|
||||
const workerState = this.workers[workerIndex];
|
||||
if (!workerState) {
|
||||
throw new Error(`Worker at index ${workerIndex} not found`);
|
||||
}
|
||||
const results: Array<{
|
||||
index: number;
|
||||
data: Uint8Array;
|
||||
}> = [];
|
||||
for (let i = 0; i < batch.frames.length; i++) {
|
||||
const frameData = batch.frames[i].data;
|
||||
const frameIndex = batch.startIndex + i;
|
||||
try {
|
||||
const croppedData = await this.processFrameWithWorker(workerIndex, frameData, cropParams, format);
|
||||
results.push({index: frameIndex, data: croppedData});
|
||||
} catch (error) {
|
||||
console.warn(`Worker ${workerIndex} failed for frame ${frameIndex}, attempting recovery:`, error);
|
||||
const recoveredWorkerIndex = (workerIndex + 1) % this.workers.length;
|
||||
try {
|
||||
const croppedData = await this.processFrameWithWorker(recoveredWorkerIndex, frameData, cropParams, format);
|
||||
results.push({index: frameIndex, data: croppedData});
|
||||
} catch (recoveryError) {
|
||||
const message = recoveryError instanceof Error ? recoveryError.message : String(recoveryError);
|
||||
throw new Error(`Failed to process frame ${frameIndex} after recovery attempt: ${message}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private processFrameWithWorker(
|
||||
workerIndex: number,
|
||||
frameData: Uint8Array,
|
||||
cropParams: CropParams,
|
||||
format: AnimatedImageFormat,
|
||||
): Promise<Uint8Array> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const workerState = this.workers[workerIndex];
|
||||
if (!workerState) {
|
||||
reject(new Error(`Worker at index ${workerIndex} not found`));
|
||||
return;
|
||||
}
|
||||
const timeout = setTimeout(() => {
|
||||
workerState.busy = false;
|
||||
workerState.currentJob = null;
|
||||
reject(new Error(`Worker timeout after ${this.timeout}ms`));
|
||||
}, this.timeout);
|
||||
const message: CropAnimatedImageStartMessage = {
|
||||
type: CropAnimatedImageMessageType.CROP_ANIMATED_IMAGE_START,
|
||||
imageBytes: frameData,
|
||||
format,
|
||||
...cropParams,
|
||||
};
|
||||
const handleMessage = (event: MessageEvent) => {
|
||||
const msg = event.data;
|
||||
if (msg.type === CropAnimatedImageMessageType.CROP_ANIMATED_IMAGE_COMPLETE) {
|
||||
clearTimeout(timeout);
|
||||
workerState.busy = false;
|
||||
workerState.currentJob = null;
|
||||
workerState.worker.removeEventListener('message', handleMessage);
|
||||
workerState.worker.removeEventListener('error', handleError);
|
||||
const completeMsg = msg as CropAnimatedImageCompleteMessage;
|
||||
if (completeMsg.result) {
|
||||
resolve(completeMsg.result);
|
||||
} else {
|
||||
reject(new Error('Empty result from worker'));
|
||||
}
|
||||
} else if (msg.type === CropAnimatedImageMessageType.CROP_ANIMATED_IMAGE_ERROR) {
|
||||
clearTimeout(timeout);
|
||||
workerState.busy = false;
|
||||
workerState.currentJob = null;
|
||||
workerState.worker.removeEventListener('message', handleMessage);
|
||||
workerState.worker.removeEventListener('error', handleError);
|
||||
const errorMsg = msg as CropAnimatedImageErrorMessage;
|
||||
reject(new Error(errorMsg.error || 'Unknown error from worker'));
|
||||
}
|
||||
};
|
||||
const handleError = (error: ErrorEvent) => {
|
||||
clearTimeout(timeout);
|
||||
workerState.busy = false;
|
||||
workerState.currentJob = null;
|
||||
workerState.worker.removeEventListener('message', handleMessage);
|
||||
workerState.worker.removeEventListener('error', handleError);
|
||||
reject(new Error(`Worker error: ${error.message || 'unknown error (worker script may have failed to load)'}`));
|
||||
};
|
||||
workerState.busy = true;
|
||||
workerState.currentJob = {
|
||||
indices: [0],
|
||||
frames: [frameData],
|
||||
resolve,
|
||||
reject,
|
||||
timeout,
|
||||
};
|
||||
workerState.worker.addEventListener('message', handleMessage);
|
||||
workerState.worker.addEventListener('error', handleError);
|
||||
const transferables: Array<Transferable> = [];
|
||||
if (frameData.buffer) {
|
||||
transferables.push(frameData.buffer);
|
||||
}
|
||||
workerState.worker.postMessage(message, transferables);
|
||||
});
|
||||
}
|
||||
|
||||
private async processSingleFrame(
|
||||
frame: Uint8Array,
|
||||
cropParams: CropParams,
|
||||
format: AnimatedImageFormat,
|
||||
): Promise<Uint8Array> {
|
||||
const workerIndex = this.workers.findIndex((w) => !w.busy);
|
||||
const targetWorkerIndex = workerIndex >= 0 ? workerIndex : 0;
|
||||
return this.processFrameWithWorker(targetWorkerIndex, frame, cropParams, format);
|
||||
}
|
||||
|
||||
getWorkerCount(): number {
|
||||
return this.workers.length;
|
||||
}
|
||||
|
||||
getBusyWorkerCount(): number {
|
||||
return this.workers.filter((w) => w.busy).length;
|
||||
}
|
||||
|
||||
isIdle(): boolean {
|
||||
return this.workers.every((w) => !w.busy);
|
||||
}
|
||||
|
||||
terminate(): void {
|
||||
if (this.terminated) {
|
||||
return;
|
||||
}
|
||||
this.terminated = true;
|
||||
for (const workerState of this.workers) {
|
||||
if (workerState.currentJob?.timeout) {
|
||||
clearTimeout(workerState.currentJob.timeout);
|
||||
}
|
||||
try {
|
||||
workerState.worker.terminate();
|
||||
} catch (error) {
|
||||
console.warn('Error terminating worker:', error);
|
||||
}
|
||||
}
|
||||
this.workers = [];
|
||||
}
|
||||
|
||||
restart(): void {
|
||||
if (!this.terminated) {
|
||||
this.terminate();
|
||||
}
|
||||
this.terminated = false;
|
||||
const concurrency = Math.max(1, (navigator.hardwareConcurrency || 4) - 1);
|
||||
this.workers = [];
|
||||
for (let i = 0; i < concurrency; i++) {
|
||||
const worker = new Worker(
|
||||
new URL(/* webpackChunkName: "animated-image-crop.worker" */ './AnimatedImageCropWorker.ts', import.meta.url),
|
||||
{
|
||||
type: 'module',
|
||||
},
|
||||
);
|
||||
this.workers.push({
|
||||
worker,
|
||||
busy: false,
|
||||
currentJob: null,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -116,7 +116,6 @@ export const GuildCreateForm = observer(() => {
|
||||
<AssetCropModal
|
||||
assetType={AssetType.GUILD_ICON}
|
||||
imageUrl={base64}
|
||||
sourceMimeType={svg ? 'image/svg+xml' : file.type}
|
||||
onCropComplete={(croppedBlob) => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = () => {
|
||||
|
||||
@@ -297,7 +297,6 @@ export const TemplateImportForm = observer(() => {
|
||||
<AssetCropModal
|
||||
assetType={AssetType.GUILD_ICON}
|
||||
imageUrl={base64}
|
||||
sourceMimeType={svg ? 'image/svg+xml' : file.type}
|
||||
onCropComplete={(croppedBlob) => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = () => {
|
||||
|
||||
+17
-81
@@ -1,26 +1,15 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import type {Gif} from '@app/features/expressions/commands/GifCommands';
|
||||
import {
|
||||
AssetCropModal,
|
||||
type AssetType,
|
||||
canSkipOriginalAssetImage,
|
||||
} from '@app/features/expressions/components/modals/AssetCropModal';
|
||||
import {AssetCropModal, type AssetType} from '@app/features/expressions/components/modals/AssetCropModal';
|
||||
import {openAssetSourceModal} from '@app/features/expressions/components/modals/AssetSourceModal';
|
||||
import {showAnimatedAvifUnsupportedModal} from '@app/features/expressions/utils/AnimatedAvifModalUtils';
|
||||
import {
|
||||
getAnimatedFormatLabel,
|
||||
isAnimatedFile,
|
||||
shouldHandleAnimatedNonGifUpload,
|
||||
} from '@app/features/expressions/utils/AnimatedImageUtils';
|
||||
import {inspectImageFile} from '@app/features/expressions/utils/AnimatedImageUtils';
|
||||
import {downloadGifAsImageFile} from '@app/features/expressions/utils/GifFileDownload';
|
||||
import {isSvgFile, readImageFileAsUploadDataUrl} from '@app/features/expressions/utils/ImageUploadFileUtils';
|
||||
import {showGuildErrorModal} from '@app/features/guild/components/alerts/GuildErrorModalUtils';
|
||||
import {
|
||||
blobToDataUrl,
|
||||
getImageDimensionsFromDataUrl,
|
||||
getSafeImageMimeType,
|
||||
isGif,
|
||||
MAX_IMAGE_BYTES,
|
||||
revokeObjectUrl,
|
||||
} from '@app/features/guild/components/modals/guild_tabs/guild_overview_tab/utils/ImageAsset';
|
||||
@@ -31,9 +20,9 @@ import {
|
||||
} from '@app/features/i18n/utils/CommonMessageDescriptors';
|
||||
import {openFilePicker} from '@app/features/messaging/utils/FilePickerUtils';
|
||||
import {formatFileSize} from '@app/features/messaging/utils/FileUtils';
|
||||
import {canDecodeAnimatedAvif} from '@app/features/platform/utils/ImageDecoderInterop';
|
||||
import * as ModalCommands from '@app/features/ui/commands/ModalCommands';
|
||||
import {modal} from '@app/features/ui/commands/ModalCommands';
|
||||
import * as ToastCommands from '@app/features/ui/commands/ToastCommands';
|
||||
import * as AvatarUtils from '@app/features/user/utils/AvatarUtils';
|
||||
import {msg} from '@lingui/core/macro';
|
||||
import {useLingui} from '@lingui/react/macro';
|
||||
@@ -55,26 +44,11 @@ const ANIMATED_IMAGES_ARE_NOT_SUPPORTED_FOR_THIS_ASSET_DESCRIPTOR = msg({
|
||||
message: 'Animated images are not supported for this asset.',
|
||||
comment: 'Confirmation modal body shown before using a non-croppable animated community image.',
|
||||
});
|
||||
const CROPPING_ANIMATED_FILES_ISN_T_SUPPORTED_YET_THE_DESCRIPTOR = msg({
|
||||
message: "Cropping animated {formatLabel} files isn't supported yet. The original image will be used.",
|
||||
comment:
|
||||
'Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.',
|
||||
});
|
||||
const CROPPING_ANIMATED_FILES_WITHOUT_FORMAT_ISN_T_SUPPORTED_YET_THE_DESCRIPTOR = msg({
|
||||
message: "Cropping animated files isn't supported yet. The original image will be used.",
|
||||
comment: 'Confirmation modal body shown before using an animated community image with an unknown format.',
|
||||
});
|
||||
const CROPPED_IMAGE_IS_TOO_LARGE_PLEASE_CHOOSE_A_DESCRIPTOR = msg({
|
||||
message: 'Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel}).',
|
||||
comment:
|
||||
'Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.',
|
||||
});
|
||||
const IMAGE_DIMENSIONS_DO_NOT_MATCH_THIS_ASSET_DESCRIPTOR = msg({
|
||||
message:
|
||||
'{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop.',
|
||||
comment:
|
||||
'Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.',
|
||||
});
|
||||
const IMAGE_COULDN_T_BE_USED_DESCRIPTOR = msg({
|
||||
message: "Image couldn't be used",
|
||||
comment: 'Error modal title shown when a community image upload cannot be accepted or processed.',
|
||||
@@ -197,22 +171,6 @@ export function useGuildImageAssetField({
|
||||
},
|
||||
[applyAspectRatio, aspectRatio, setFieldValue, setHasCleared, setPreviewUrl],
|
||||
);
|
||||
const canApplyOriginalDataUrl = useCallback(
|
||||
async (dataUrl: string) => {
|
||||
try {
|
||||
const dimensions = await getImageDimensionsFromDataUrl(dataUrl);
|
||||
if (canSkipOriginalAssetImage(assetType, dimensions)) {
|
||||
return true;
|
||||
}
|
||||
showErrorModal(i18n._(IMAGE_DIMENSIONS_DO_NOT_MATCH_THIS_ASSET_DESCRIPTOR, {label}));
|
||||
return false;
|
||||
} catch {
|
||||
showErrorModal(i18n._(INVALID_IMAGE_TRY_ANOTHER_DESCRIPTOR));
|
||||
return false;
|
||||
}
|
||||
},
|
||||
[assetType, i18n, label, showErrorModal],
|
||||
);
|
||||
const handleFile = useCallback(
|
||||
async (file: File | null) => {
|
||||
if (!file) return;
|
||||
@@ -224,7 +182,7 @@ export function useGuildImageAssetField({
|
||||
return;
|
||||
}
|
||||
const svg = isSvgFile(file);
|
||||
const animated = svg ? false : await isAnimatedFile(file);
|
||||
const {format, animated} = svg ? {format: 'unknown', animated: false} : await inspectImageFile(file);
|
||||
if (animated) {
|
||||
const policy = gif?.mode ?? 'disallow';
|
||||
if (policy === 'disallow') {
|
||||
@@ -246,6 +204,11 @@ export function useGuildImageAssetField({
|
||||
}
|
||||
}
|
||||
}
|
||||
const isAnimatedAvif = animated && format === 'avif';
|
||||
if (isAnimatedAvif && !(await canDecodeAnimatedAvif())) {
|
||||
showAnimatedAvifUnsupportedModal({i18n});
|
||||
return;
|
||||
}
|
||||
setIsProcessing(true);
|
||||
let sourceBase64: string;
|
||||
try {
|
||||
@@ -259,42 +222,12 @@ export function useGuildImageAssetField({
|
||||
setIsProcessing(false);
|
||||
return;
|
||||
}
|
||||
const animatedHandled = shouldHandleAnimatedNonGifUpload({
|
||||
file,
|
||||
isGif: isGif(file),
|
||||
animated,
|
||||
onAnimatedAvif: () => {
|
||||
setIsProcessing(false);
|
||||
showAnimatedAvifUnsupportedModal({i18n});
|
||||
},
|
||||
onOtherAnimated: async () => {
|
||||
if (!(await canApplyOriginalDataUrl(sourceBase64))) {
|
||||
setIsProcessing(false);
|
||||
return;
|
||||
}
|
||||
const formatLabel = getAnimatedFormatLabel(file);
|
||||
ToastCommands.createToast({
|
||||
type: 'info',
|
||||
children:
|
||||
formatLabel == null
|
||||
? i18n._(CROPPING_ANIMATED_FILES_WITHOUT_FORMAT_ISN_T_SUPPORTED_YET_THE_DESCRIPTOR)
|
||||
: i18n._(CROPPING_ANIMATED_FILES_ISN_T_SUPPORTED_YET_THE_DESCRIPTOR, {formatLabel}),
|
||||
});
|
||||
await applyDataUrl(sourceBase64, file, requestId);
|
||||
setIsProcessing(false);
|
||||
},
|
||||
});
|
||||
if (animatedHandled) {
|
||||
return;
|
||||
}
|
||||
setIsProcessing(false);
|
||||
const sourceMimeType = getSafeImageMimeType(file);
|
||||
ModalCommands.push(
|
||||
modal(() => (
|
||||
<AssetCropModal
|
||||
assetType={assetType}
|
||||
imageUrl={sourceBase64}
|
||||
sourceMimeType={sourceMimeType}
|
||||
onCropComplete={async (croppedBlob) => {
|
||||
if (requestId !== requestIdRef.current) return;
|
||||
setIsProcessing(true);
|
||||
@@ -314,10 +247,14 @@ export function useGuildImageAssetField({
|
||||
}
|
||||
}
|
||||
}}
|
||||
onSkip={async () => {
|
||||
if (requestId !== requestIdRef.current) return;
|
||||
await applyDataUrl(sourceBase64, file, requestId);
|
||||
}}
|
||||
onSkip={
|
||||
isAnimatedAvif
|
||||
? undefined
|
||||
: async () => {
|
||||
if (requestId !== requestIdRef.current) return;
|
||||
await applyDataUrl(sourceBase64, file, requestId);
|
||||
}
|
||||
}
|
||||
data-flx="guild.guild-tabs.guild-overview-tab.use-guild-image-asset-field.handle-file.asset-crop-modal"
|
||||
/>
|
||||
)),
|
||||
@@ -327,7 +264,6 @@ export function useGuildImageAssetField({
|
||||
applyAspectRatio,
|
||||
applyDataUrl,
|
||||
assetType,
|
||||
canApplyOriginalDataUrl,
|
||||
canManage,
|
||||
gif,
|
||||
label,
|
||||
|
||||
-38
@@ -1,17 +1,7 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import type {ImageDimensions} from '@app/features/expressions/utils/AssetImageGeometry';
|
||||
import {getImageUploadMimeType} from '@app/features/expressions/utils/ImageUploadFileUtils';
|
||||
|
||||
export const MAX_IMAGE_BYTES = 10 * 1024 * 1024;
|
||||
|
||||
export function isGif(file: File): boolean {
|
||||
const type = (file.type || '').toLowerCase();
|
||||
if (type === 'image/gif') return true;
|
||||
const name = (file.name || '').toLowerCase();
|
||||
return name.endsWith('.gif');
|
||||
}
|
||||
|
||||
export function revokeObjectUrl(url: string | null | undefined): void {
|
||||
if (!url) return;
|
||||
if (!url.startsWith('blob:')) return;
|
||||
@@ -28,31 +18,3 @@ export function blobToDataUrl(blob: Blob): Promise<string> {
|
||||
reader.readAsDataURL(blob);
|
||||
});
|
||||
}
|
||||
|
||||
export function getSafeImageMimeType(file: File): string {
|
||||
return getImageUploadMimeType(file);
|
||||
}
|
||||
|
||||
export function getImageDimensionsFromDataUrl(dataUrl: string): Promise<ImageDimensions> {
|
||||
if (typeof Image === 'undefined') {
|
||||
return Promise.reject(new Error('Image API is unavailable'));
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
const img = new Image();
|
||||
img.onload = () => {
|
||||
if (img.naturalWidth > 0 && img.naturalHeight > 0) {
|
||||
resolve({width: img.naturalWidth, height: img.naturalHeight});
|
||||
} else {
|
||||
reject(new Error('Invalid image dimensions'));
|
||||
}
|
||||
img.onload = null;
|
||||
img.onerror = null;
|
||||
};
|
||||
img.onerror = () => {
|
||||
reject(new Error('Failed to load image'));
|
||||
img.onload = null;
|
||||
img.onerror = null;
|
||||
};
|
||||
img.src = dataUrl;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {makeSyncedField} from '@app/features/user/state/SyncedField';
|
||||
import {GuildFolderExpandedStateSchema} from '@fluxer/schema/src/gen/fluxer/user/preferences/v1/preferences_pb';
|
||||
import {makePersistent} from '@app/features/platform/utils/MobXPersistence';
|
||||
import {makeAutoObservable} from 'mobx';
|
||||
|
||||
class GuildFolderExpanded {
|
||||
@@ -13,15 +12,7 @@ class GuildFolderExpanded {
|
||||
}
|
||||
|
||||
private async initPersistence(): Promise<void> {
|
||||
await makeSyncedField(this, {
|
||||
field: 'guildFolders',
|
||||
schema: GuildFolderExpandedStateSchema,
|
||||
persist: ['expandedFolderIds'],
|
||||
toMessage: (s) => ({expandedFolderIds: s.expandedFolderIds.map((n) => BigInt(n))}),
|
||||
applyMessage: (s, m) => {
|
||||
s.expandedFolderIds = m.expandedFolderIds.map((b) => Number(b));
|
||||
},
|
||||
});
|
||||
await makePersistent(this, 'GuildFolderExpanded', ['expandedFolderIds']);
|
||||
}
|
||||
|
||||
isExpanded(folderId: number): boolean {
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}، قريبًا"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} كيلوبت في الثانية"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "أبعاد {label} لا تطابق هذا العنصر. اختر صورة مختلفة أو حمّل صورة ثابتة يمكنك قصها."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "ملف {label} كبير جدًا. اختر ملفًا أصغر من {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "لا يمكن أن تكون صور {label} متحركة. استخدم صورة ثابتة."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "مشاركة النشاط"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "حد النشاط"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "السماح بـ {everyoneMention} و{hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "اسمح لـ {PRODUCT_NAME} بالوصول إلى الكاميرا في {MACOS_SYSTEM_SETTINGS_NAME} ← {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} ← {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "اسمح لـ {PRODUCT_NAME} بالوصول إلى الميكروفون الخاص بك في {MACOS_SYSTEM_SETTINGS_NAME} ← {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} ← {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "اسمح لـ {PRODUCT_NAME} بالوصول إلى الميكروفون الخاص بك. تحقق من شريط عنوان المتصفح أو الإعدادات."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "السماح للأعضاء الذين لا يملكون إذن {readMes
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "السماح بالإشارة إلى هذا الدور"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "السماح بالوصول إلى الميكروفون"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "و{remainingCount} أخرى"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "تحريك عند التفاعل"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "ملفات {AVIF_FORMAT_LABEL} المتحركة غير مدعومة. حمّل ملف {AVIF_FORMAT_LABEL} ثابتًا بدلاً من ذلك."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "صيغة {avifFormatLabel} المتحركة غير مدعومة"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "تتوفر الصور الرمزية المتحركة ({ANIMATED_AVATAR_FORMATS}) حصريًا لمشتركي {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "الصور الرمزية المتحركة ({ANIMATED_AVATAR_FORMATS}) غير متاحة في هذا المثيل. حمّل صورة ثابتة بدلاً من ذلك."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "تتطلب الصور الرمزية المتحركة ({animatedAvatarFormats}) {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "صور رمزية ولافتات ملف شخصي متحركة"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "الصور الرمزية المتحركة غير متاحة"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "تتطلب الصور الرمزية المتحركة {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "معاينة الصورة المتحركة"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "الصور المتحركة غير مدعومة لهذا العنصر."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "اكتشاف اللغة تلقائيًا"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "تعيين حد النشاط تلقائيًا"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "متوفر في تطبيق سطح المكتب."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "الصورة الرمزية"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "ملف الصورة الرمزية كبير جدًا. اختر ملفًا أصغر من {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "الصورة الرمزية كبيرة جدًا. اختر صورة أصغر من {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "اختيار وضع الصورة الرمزية"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "غير متواجد حاليًا"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "المستخدمون المحظورون"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "لافتة"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "ملف اللافتة كبير جدًا. اختر ملفًا أصغر من {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "اختيار وضع اللافتة"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "اشترِ هدية {premiumProductName} من علامة تبويب {pre
|
||||
msgid "Buy gift"
|
||||
msgstr "شراء هدية"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "بإنشائك مجتمعًا، فإنك توافق على اتباع <0>إرشادات مجتمع {PRODUCT_NAME}</0> والالتزام بها."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "لا يمكن تحميل الملفات هنا"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "في المنتصف"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "تغيير الصورة الرمزية"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "تغيير الخلفية"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "تغيير اللافتة"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "تغيير الاسم المستعار في المجموعة"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "تغيير الأيقونة"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "استلام الهدية"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "المطالبة بحسابك"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "مجتمع يسهّل الهجمات الجماعية أو الإساء
|
||||
msgid "Community filter"
|
||||
msgstr "تصفية المجتمعات"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "أيقونة المجتمع"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "أزرار مربع الرسالة"
|
||||
msgid "Composer focus"
|
||||
msgstr "التركيز على مربع الرسالة"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "جاري الضغط"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "وصّل كاميرا أو جهاز التقاط افتراضي، ثم
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "وصّل شاشة، ثم حاول مرة أخرى."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "وصّل ميكروفونًا وحاول مرة أخرى."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "تعذّر إنشاء هذا الملصق"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "تعذر قص الصورة"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "تعذر تحديث مشاركة النشاط الصوتي الآن"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "تعذر تحميل الصورة الرمزية"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "تعذّر تحميل اللافتة"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "إنشاء ومشاركة"
|
||||
msgid "Create a community"
|
||||
msgstr "إنشاء مجتمع"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "أنشئ مجتمعًا لك ولأصدقائك للدردشة."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "قص خلفية الدعوة"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "معاينة القص"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "قص لافتة الملف الشخصي"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "الصورة بعد القص كبيرة جدًا. اختر منطقة أصغر أو ملفًا أصغر (الحد الأقصى {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "قص ملفات {formatLabel} المتحركة غير مدعوم بعد. سيتم استخدام الصورة الأصلية."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "قص ملفات {formatLabel} المتحركة غير مدعوم بعد. سيتم استخدام الملف الأصلي الذي تم تحميله."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "قص الملفات المتحركة غير مدعوم بعد. سيتم استخدام الصورة الأصلية."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "قص الملفات المتحركة غير مدعوم بعد. سيتم استخدام الملف الأصلي الذي تم تحميله."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "جاري قص {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "ليس لديك حساب؟"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "عدم الإظهار"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "الصور الرمزية للمحادثات الجماعية باستخ
|
||||
msgid "Group DMs"
|
||||
msgstr "المحادثات الجماعية"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "أيقونة المجموعة"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "إعدادات المجموعة"
|
||||
msgid "Group typing states"
|
||||
msgstr "حالات الكتابة في المجموعة"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "تم تحديث المجموعة"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "قلب"
|
||||
msgid "Hebrew"
|
||||
msgstr "العبرية"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "الارتفاع"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "تم نسخ الصورة إلى الحافظة"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "تعذر استخدام الصورة"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "المظهر والشكل"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "يبدو أنك تستخدم {0}. قد تؤدي إضافة معالجة {PRODUCT_NAME} فوقه إلى تذبذب مستوى الصوت أو تشويهه. يمرّر الإدخال المباشر الصوت كما هو دون أي تعديل."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "لم يتم العثور على نتائج مطابقة"
|
||||
msgid "No mentions yet"
|
||||
msgstr "لا توجد إشارات بعد"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "لم يتم العثور على ميكروفون"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "فتح رسالة مباشرة من النظام"
|
||||
msgid "Open system picker"
|
||||
msgstr "فتح منتقي النظام"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "فتح قالب JSON"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "افتح مربع حوار الحظر لهذا المجتمع."
|
||||
msgid "Open the context menu"
|
||||
msgstr "فتح قائمة السياق"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "افتح الرابط أدناه في متصفحك، ثم انسخ استجابة JSON بالكامل والصقها في المربع."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "آخر 7 أيام"
|
||||
msgid "Paste"
|
||||
msgstr "لصق"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "الصق رابط قالب {theOtherPlatform} لاستيراد هيكله إلى مجتمع جديد."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "نوع Premium"
|
||||
msgid "Premium until date"
|
||||
msgstr "تاريخ انتهاء Premium"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "جاري التحضير"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "الملف الشخصي"
|
||||
msgid "Profile badge"
|
||||
msgstr "شارة الملف الشخصي"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "لافتات الملف الشخصي ميزة من {PREMIUM_PRODUCT_NAME}. احصل على {PREMIUM_PRODUCT_NAME} لإضافة لافتة إلى ملفك الشخصي."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "لافتات الملف الشخصي غير مفعّلة على هذا المثيل."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "تتطلب لافتات الملف الشخصي {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "تتطلب لافتات الملف الشخصي {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "الضغط للتحدث"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "الضغط للتحدث (محدود)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "يتم تجاهل الضغط للتحدث في وضع الإدخال المباشر. بدّل إلى الصوت المركّز أو المخصص لاستخدامه."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "إزالة المرفق"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "إزالة تطبيق المصادقة"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "إزالة الصورة الرمزية"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "إزالة الصورة الرمزية"
|
||||
msgid "Remove background"
|
||||
msgstr "إزالة الخلفية"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "إزالة اللافتة"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "إلغاء إبقاء النافذة في المقدمة"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "إزالة من صور GIF المفضلة (بالرابط فقط)"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "إزالة الأيقونة"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "أُعيد الإرسال"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "إعادة تعيين"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "الرومانية"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "تدوير باتجاه عقارب الساعة"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "التشبع"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "عناصر التحكم في مُرمِّز مشاركة الشاشة"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "انتهت مشاركة الشاشة"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "إظهار شارة حمراء على أيقونة التطبيق عند وجود رسائل غير مقروءة"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "إظهار لون التمييز فقط، مع تجاهل ملفك الشخصي العام"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "إظهار الرموز التعبيرية المخصصة في الإكمال التلقائي للتعبيرات"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "إظهار الصورة الرمزية الافتراضية، مع تجاهل ملفك الشخصي العام"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "إظهار مؤشر الرسائل غير المقروءة في القنوات المكتومة"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "إظهار الصورة الرمزية لملفك الشخصي العام في هذا المجتمع"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "إظهار لافتة ملفك الشخصي العام في هذا المجتمع"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "تخطي"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "تخطي تأكيد «وضع علامة على الكل كمقروء»"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "تخطي الاقتصاص"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "التبديل إلى التخطيط المريح"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "التبديل إلى التخطيط المضغوط"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "التبديل إلى الإدخال المباشر"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "المهام"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "جارٍ نقلك إلى منطقة صوتية أخرى..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "قالب"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "منح الدور {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "توقف مصدر مشاركة الشاشة عن إرسال الفيديو، لذلك أُوقفت مشاركة شاشتك."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "لا يمكن حظر هذا الحساب."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "لا يمكن التراجع عن هذا الإجراء. سيتم حذف جميع البيانات المرتبطة، بما في ذلك مستخدم البوت، نهائيًا."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "هذه الرسوم المتحركة طويلة جدًا أو كبيرة جدًا بحيث لا يمكن قصها. جرب ملفًا أقصر أو أصغر."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "هذا البوت ليس عامًا ولا يمكن للمستخدمين
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "يطلب هذا البوت إذن المسؤول. لا تمنحه هذا الإذن إلا إذا كنت تثق بالمطور تمامًا. اطلب من المطور طلب أذونات أقل بدلًا من ذلك. أغلق هذه الصفحة إذا لم تكن متأكدًا."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "لا يمكن لهذا المتصفح قص ملفات {avifFormatLabel} المتحركة. قم بتحميل ملف GIF أو WebP بدلاً من ذلك."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "وحدة تحكم المتصفح هذه أداة للمطورين."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "متصفحك هذا يعطل WebAssembly، لذا لا يمكن قص الصور المتحركة."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "هذه المجموعة ممتلئة. أزل شخصًا قبل إضاف
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "انتهت صلاحية رمز التسليم هذا. أنشئ رمزًا جديدًا للمتابعة."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "لم يمكن قراءة هذه الصورة. قد تكون تالفة."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "تحميل"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "تحميل صورة رمزية مخصصة لهذا المجتمع"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "تحميل لافتة مخصصة لهذا المجتمع"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "تحميل الملفات والوسائط في الرسائل."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "تحميل الملفات والوسائط في هذه القناة."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "تحميل أيقونة"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "استخدام سمة الفحم (أسطح سوداء حالكة)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "استخدام صورة مخصصة"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "استخدم الفلاتر أو أدخل كلمات مفتاحية لل
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "استخدام الملف الشخصي العام"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "المشاركون في المكالمة الصوتية"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "معالجة الصوت"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "ويسكونسن"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "مع {PREMIUM_PRODUCT_NAME}، يمكنك استخدام صور رمزية متحركة ({ANIMATED_AVATAR_FORMATS}) ولافتات الملف الشخصي، وتخصيص علامتك، وفتح الكثير من مزايا {PREMIUM_PRODUCT_NAME} الأخرى."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "أنت بحاجة إلى إذن \"{permissionLabel}\" لاستخدام
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "أنت بحاجة إلى إذن \"{permissionLabel}\" لاستخدام الملصقات من المجتمعات الأخرى هنا."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "يجب عليك المطالبة بحسابك قبل أن تتمكن من إنشاء مجتمع."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "يجب المطالبة بحسابك لإرسال الرسائل في ه
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "يجب عليك التحقق من رقم الهاتف لإرسال الرسائل في هذا المجتمع."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "يجب عليك التحقق من عنوان بريدك الإلكتروني قبل أن تتمكن من إنشاء مجتمع."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "تحتاج جودة الشاشة المحفوظة لديك بدقة {savedResolution} بمعدل إطارات {savedFrameRate} إطارًا في الثانية إلى {premiumProductName}، لذا تستخدم المشاركات دقة {resolution} بمعدل إطارات {frameRate} إطارًا في الثانية."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "تعذّر نشر مشاركة شاشتك باستخدام برنامج ترميز فيديو متوافق، لذا تم إيقافها. حاول المشاركة مرة أخرى."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "تم تعيين عنوان URL المخصص إلى {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "توقف مُرمّز الفيديو الخاص بك عن ترميز الإطارات، لذا تم إيقاف مشاركة شاشتك. حاول المشاركة مرة أخرى."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "مفتاح YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "تكبير/تصغير"
|
||||
|
||||
@@ -1761,6 +1761,12 @@
|
||||
{
|
||||
"msgid": "Community overrides"
|
||||
},
|
||||
{
|
||||
"msgid": "Compressing"
|
||||
},
|
||||
{
|
||||
"msgid": "Compressing {percent}%"
|
||||
},
|
||||
{
|
||||
"msgid": "Connect a camera and try again."
|
||||
},
|
||||
@@ -1803,6 +1809,9 @@
|
||||
{
|
||||
"msgid": "Create the administrator account"
|
||||
},
|
||||
{
|
||||
"msgid": "Cropping {percent}%"
|
||||
},
|
||||
{
|
||||
"msgid": "Custom emoji {emojiName} from a community"
|
||||
},
|
||||
@@ -2277,6 +2286,9 @@
|
||||
{
|
||||
"msgid": "Premium model"
|
||||
},
|
||||
{
|
||||
"msgid": "Preparing"
|
||||
},
|
||||
{
|
||||
"msgid": "Prevent <0>{targetUserTag}</0> from sending messages, reacting, and connecting to voice channels for the specified duration."
|
||||
},
|
||||
@@ -2982,12 +2994,27 @@
|
||||
{
|
||||
"msgid": "These options change how people use the instance. Some can only be chosen during setup."
|
||||
},
|
||||
{
|
||||
"msgid": "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
},
|
||||
{
|
||||
"msgid": "This browser can't crop animated {AVIF_FORMAT_LABEL} files. Upload a GIF or WebP instead."
|
||||
},
|
||||
{
|
||||
"msgid": "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
},
|
||||
{
|
||||
"msgid": "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
},
|
||||
{
|
||||
"msgid": "This device could not keep up with {targetResolution} at {targetFrameRate} FPS last time, so your stream started at {resolution} at {frameRate} FPS."
|
||||
},
|
||||
{
|
||||
"msgid": "This emoji is from"
|
||||
},
|
||||
{
|
||||
"msgid": "This image couldn't be read. It may be damaged."
|
||||
},
|
||||
{
|
||||
"msgid": "This instance currently allows screen share up to 720p at 30 FPS."
|
||||
},
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, очаквайте скоро"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Размерите на изображението за {label} не съответстват на този елемент. Избери друго изображение или качи статично изображение, което можеш да изрежеш."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "Файлът за {label} е твърде голям. Избери файл, по-малък от {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "Изображението за {label} не може да бъде анимирано. Използвай статично изображение."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Споделяне на активност"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Праг на активност"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Разрешаване на {everyoneMention} и {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Разреши на {PRODUCT_NAME} достъп до камерата ти в {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Разреши на {PRODUCT_NAME} достъп до микрофона ти в {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Разреши на {PRODUCT_NAME} достъп до микрофона ти. Провери адресната лента или настройките на браузъра си."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Позволява на членовете без разрешениет
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Разрешаване на споменавания за тази роля"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Разреши микрофона"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "и още {remainingCount}"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Анимирай при взаимодействие"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Анимираните файлове {AVIF_FORMAT_LABEL} не се поддържат. Качи статичен файл {AVIF_FORMAT_LABEL}."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Анимираният формат {avifFormatLabel} не се поддържа"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Анимираните аватари ({ANIMATED_AVATAR_FORMATS}) са достъпни само за абонати на {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Анимираните аватари ({ANIMATED_AVATAR_FORMATS}) не са налични в тази инстанция. Качи статично изображение."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Анимираните аватари ({animatedAvatarFormats}) изискват {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Анимирани аватари и банери на профили"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Анимираните аватари не са налични"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Анимираните аватари изискват {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Преглед на анимирано изображение"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Анимираните изображения не се поддържат за този елемент."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Автоматично разпознаване на език"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Автоматично задаване на праг за активност"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Налично в настолното приложение."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Аватар"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Файлът на аватара е твърде голям. Избери файл, по-малък от {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Аватарът е твърде голям. Избери такъв под {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Избор на режим за аватар"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "В момента ме няма"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Забранени потребители"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Банер"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Файлът на банера е твърде голям. Избери файл, по-малък от {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Избор на режим на банер"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Купи подарък {premiumProductName} от раздела {premiu
|
||||
msgid "Buy gift"
|
||||
msgstr "Купи подарък"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Със създаването на общност се съгласяваш да спазваш и поддържаш <0>насоките на общността на {PRODUCT_NAME}</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Тук не можеш да качваш файлове"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Центрирано"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Смяна на аватара"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Смяна на фона"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Смяна на банера"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Промяна на прякор в групата"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Смяна на икона"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Вземи подарък"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Заяви акаунта си"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Общността улеснява груповите атаки или
|
||||
msgid "Community filter"
|
||||
msgstr "Филтър за общности"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Икона на общността"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Бутони в полето за съобщение"
|
||||
msgid "Composer focus"
|
||||
msgstr "Фокус на текстовото поле"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Компресиране"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Свържи камера или виртуално устройство
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Свържи дисплей и опитай отново."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Свържи микрофон и опитай отново."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Стикерът не можа да бъде създаден"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Изображението не можа да бъде изрязано"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Споделянето на гласова активност не можа да бъде актуализирано в момента"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Неуспешно качване на аватара"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Неуспешно качване на банер"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Създаване и споделяне"
|
||||
msgid "Create a community"
|
||||
msgstr "Създаване на общност"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Създай общност, в която ти и приятелите ти да си чатите."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Изрязване на фона на поканата"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Преглед на изрязването"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Изрязване на банер на профил"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "Изрязаното изображение е твърде голямо. Избери по-малка област или по-малък файл (макс. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Изрязването на анимирани {formatLabel} файлове все още не се поддържа. Ще бъде използвано оригиналното изображение."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Изрязването на анимирани {formatLabel} файлове все още не се поддържа. Ще бъде използван оригиналният файл."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Изрязването на анимирани файлове все още не се поддържа. Ще бъде използвано оригиналното изображение."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Изрязването на анимирани файлове все още не се поддържа. Ще бъде използван оригиналният файл."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Обработване на {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Нямаш акаунт?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Не показвай"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Аватарите на груповите DM използват същ
|
||||
msgid "Group DMs"
|
||||
msgstr "Групови DM"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Икона на групата"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Настройки на групата"
|
||||
msgid "Group typing states"
|
||||
msgstr "Състояния на писане в група"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Групата е актуализирана"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Сърце"
|
||||
msgid "Hebrew"
|
||||
msgstr "Иврит"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Височина"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Изображението е копирано в клипборда"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Изображението не може да бъде използвано"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Външен вид"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Изглежда, че използваш {0}. Наслагването на обработката на {PRODUCT_NAME} отгоре може да причини пулсиране или изкривяване на звука. Директният вход предава звука ти непроменен."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Няма намерени съвпадения"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Все още няма споменавания"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Не е намерен микрофон"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Отваряне на системно DM"
|
||||
msgid "Open system picker"
|
||||
msgstr "Отваряне на системния инструмент за избор"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Отваряне на JSON на шаблона"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Отваряне на диалоговия прозорец за заб
|
||||
msgid "Open the context menu"
|
||||
msgstr "Отваряне на контекстното меню"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Отвори линка по-долу в браузъра си, след което копирай целия JSON отговор и го постави в полето."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Последните 7 дни"
|
||||
msgid "Paste"
|
||||
msgstr "Постави"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Постави URL адрес на шаблон от {theOtherPlatform}, за да импортираш структурата му в нова общност."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Премиум тип"
|
||||
msgid "Premium until date"
|
||||
msgstr "Премиум до дата"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Подготвяне"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Профил"
|
||||
msgid "Profile badge"
|
||||
msgstr "Значка на профил"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Профилните банери са функция на {PREMIUM_PRODUCT_NAME}. Вземи {PREMIUM_PRODUCT_NAME}, за да добавиш банер към профила си."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Профилните банери не са активирани в тази инстанция."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Профилните банери изискват {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Профилните банери изискват {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Натисни и говори"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Натисни и говори (ограничено)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "„Натисни и говори“ се игнорира при директен вход. Превключи на „Фокусиран глас“ или „По избор“, за да го използваш."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Премахване на прикачен файл"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Премахване на приложението за удостоверяване"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Премахване на аватара"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Премахване на аватара"
|
||||
msgid "Remove background"
|
||||
msgstr "Премахване на фон"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Премахване на банер"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Без задържане отгоре"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Премахване от любимите GIF файлове, запазени по URL адрес"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Премахване на икона"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Изпратено отново"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Нулиране"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Румънски"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Завъртане по часовниковата стрелка"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Наситеност"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Контроли за кодиране на споделяне на екрана"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Споделянето на екрана приключи"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Показване на червена значка върху иконата на приложението при наличие на непрочетени съобщения"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Показва само акцентния цвят, независимо от глобалния ти профил"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Показване на персонализирани емоджита в автоматичното довършване на изрази"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Показва аватара по подразбиране, независимо от глобалния ти профил"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Показване на индикатор за непрочетени съобщения в заглушени канали"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Показва аватара на глобалния ти профил в тази общност"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Показва банера на глобалния ти профил в тази общност"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Пропусни"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Пропускане на потвърждението за „Маркирай всички като прочетени“"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Пропусни изрязването"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Превключване към удобен изглед"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Превключване към сбит изглед"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Превключване към директен вход"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Задачи"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Прехвърляне към друг гласов регион..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Шаблон"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "Ролята предостави {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "Източникът на споделяне на екрана спря да изпраща видео, поради което споделянето на екрана беше прекратено."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Този акаунт не може да бъде блокиран."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Това действие не може да бъде отменено. Всички свързани данни, включително потребителят на бота, ще бъдат изтрити завинаги."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Анимацията е твърде дълга или твърде голяма, за да бъде изрязана. Опитайте с по-кратък или по-малък файл."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Този бот не е публичен и не може да бъде
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Този бот иска разрешението „Администратор“. Дай го само ако имаш пълно доверие на разработчика. Вместо това го помоли да поиска по-малко разрешения. Затвори тази страница, ако имаш съмнения."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Този браузър не може да обработва анимирани {avifFormatLabel} файлове. Вместо това качете GIF или WebP."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Тази конзола на браузъра е инструмент за разработчици."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "В този браузър WebAssembly е изключен, така че анимирани изображения не могат да бъдат изрязвани."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Тази група е пълна. Премахни някого, пре
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Този код за прехвърляне е изтекъл. Генерирай нов, за да продължиш."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Този образ не може да бъде прочетен. Може да е повреден."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Качване"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Качи персонализиран аватар за тази общност"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Качи персонализиран банер за тази общност"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Качване на файлове и медии в съобщения."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Качване на файлове и медии в този канал."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Качване на икона"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Използване на въгленова тема (наситено
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Използване на персонализирано изображение"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Използвай филтри или въведи ключови ду
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Използване на глобален профил"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Участници в гласов чат"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Обработка на глас"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Уисконсин"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "С {PREMIUM_PRODUCT_NAME} можеш да използваш анимирани аватари ({ANIMATED_AVATAR_FORMATS}) и банери за профил, да персонализираш тага си и да отключиш много други предимства на {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Нужно е разрешението „{permissionLabel}“, за д
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Нужно е разрешението „{permissionLabel}“, за да използваш стикери от други общности тук."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Трябва да заявиш акаунта си, преди да можеш да създадеш общност."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Трябва да заявиш акаунта си, за да изпра
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Трябва да потвърдиш телефонен номер, за да изпращаш съобщения в тази общност."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Трябва да потвърдиш имейл адреса си, преди да можеш да създадеш общност."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Вашата запазена настройка {savedResolution} при {savedFrameRate} FPS изисква {premiumProductName}, така че споделянията използват {resolution} при {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Споделянето на екрана ти не можа да бъде публикувано със съвместим видео кодек, затова беше спряно. Опитай да споделиш отново."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Персонализираният ти URL адрес е зададен на {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Видеоенкодерът ти спря да кодира кадри, затова споделянето на екрана беше спряно. Опитай да споделиш отново."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Мащабиране"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, již brzy"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Rozměry {label} neodpovídají tomuto prostředku. Vyberte jiný obrázek nebo nahrajte statický obrázek, který můžete oříznout."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "Soubor {label} je příliš velký. Vyberte soubor menší než {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "Obrázky {label} nemohou být animované. Použijte statický obrázek."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Sdílení aktivit"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Práh aktivity"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Povolit zmínky {everyoneMention} a {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Povolte aplikaci {PRODUCT_NAME} přístup k vaší kameře v {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Povolte aplikaci {PRODUCT_NAME} přístup k mikrofonu v: {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Povolte aplikaci {PRODUCT_NAME} přístup k mikrofonu. Zkontrolujte adresní řádek nebo nastavení prohlížeče."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Povolit členům bez oprávnění {readMessageHistoryPermissionLabel} zo
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Povolit zmínky pro tuto roli"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Povolit mikrofon"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "a {remainingCount, plural, one {# další} few {# další} many {# dalš
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animovat při interakci"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Animované soubory {AVIF_FORMAT_LABEL} nejsou podporovány. Nahrajte místo toho statický soubor {AVIF_FORMAT_LABEL}."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Animovaný formát {avifFormatLabel} není podporován"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Animované avatary ({ANIMATED_AVATAR_FORMATS}) jsou dostupné pouze předplatitelům {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Animované avatary ({ANIMATED_AVATAR_FORMATS}) nejsou na této instanci dostupné. Nahrajte místo toho statický obrázek."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Animované avatary ({animatedAvatarFormats}) vyžadují {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Animované avatary a bannery profilu"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Animované avatary nejsou k dispozici"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Animované avatary vyžadují {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Náhled animovaného obrázku"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Animované obrázky nejsou pro toto médium podporovány."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Automaticky rozpoznat jazyk"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Automaticky nastavit práh aktivity"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "K dispozici v desktopové aplikaci."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Soubor avatara je příliš velký. Vyberte soubor menší než {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Avatar je příliš velký – vyberte obrázek do {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Výběr režimu avatara"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Momentálně pryč"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Zabanovaní uživatelé"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Banner"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Soubor banneru je příliš velký. Vyberte soubor menší než {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Výběr režimu banneru"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Kupte dárkové předplatné {premiumProductName} na kartě {premiumProd
|
||||
msgid "Buy gift"
|
||||
msgstr "Koupit dárek"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Vytvořením komunity souhlasíte s dodržováním a prosazováním <0>pravidel komunity {PRODUCT_NAME}</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Sem nelze nahrávat soubory"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Na střed"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Změnit avatar"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Změnit pozadí"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Změnit banner"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Změnit přezdívku skupiny"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Změnit ikonu"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Převzít dárek"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Dokončit registraci účtu"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Komunita umožňuje hromadné útoky nebo cílené obtěžování."
|
||||
msgid "Community filter"
|
||||
msgstr "Filtr komunit"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Ikona komunity"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Tlačítka pro psaní zpráv"
|
||||
msgid "Composer focus"
|
||||
msgstr "Fokus v poli pro psaní zpráv"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Komprimuji"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Připojte kameru nebo virtuální záznamové zařízení a zkuste to zn
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Připojte displej a zkuste to znovu."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Připojte mikrofon a zkuste to znovu."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Nepodařilo se vytvořit tuto samolepku"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Obrázek se nepodařilo oříznout"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Teď se nepodařilo aktualizovat sdílení hlasové aktivity"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Nepodařilo se nahrát avatar"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Nepodařilo se nahrát banner"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Vytvořit a sdílet"
|
||||
msgid "Create a community"
|
||||
msgstr "Vytvořit komunitu"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Vytvořte komunitu pro sebe a své přátele, kde si můžete povídat."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Oříznout pozadí pozvánky"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Náhled ořezu"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Oříznout banner profilu"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "Oříznutý obrázek je příliš velký. Vyberte menší oblast nebo menší soubor (max. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Ořezávání animovaných souborů {formatLabel} zatím není podporováno. Použije se původní obrázek."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Ořezávání animovaných souborů {formatLabel} zatím není podporováno. Použije se původní nahraný soubor."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Ořezávání animovaných souborů zatím není podporováno. Použije se původní obrázek."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Ořezávání animovaných souborů zatím není podporováno. Použije se původní nahraný soubor."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Ořezávání {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Nemáte účet?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Nezobrazovat"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Avatary skupinových konverzací používají stejné masky stavů jako
|
||||
msgid "Group DMs"
|
||||
msgstr "Skupinové konverzace"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Ikona skupiny"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Nastavení skupiny"
|
||||
msgid "Group typing states"
|
||||
msgstr "Stavy psaní ve skupině"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Skupina aktualizována"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Srdce"
|
||||
msgid "Hebrew"
|
||||
msgstr "Hebrejština"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Výška"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Obrázek zkopírován do schránky"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Obrázek nelze použít"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Vzhled a ovládání"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Zdá se, že používáte {0}. Přidání dalšího zpracování zvuku v aplikaci {PRODUCT_NAME} může způsobit kolísání hlasitosti nebo zkreslení. Přímý vstup propouští zvuk beze změn."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Nic nebylo nalezeno"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Zatím žádné zmínky"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Mikrofon nenalezen"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Otevřít systémovou soukromou konverzaci"
|
||||
msgid "Open system picker"
|
||||
msgstr "Otevřít systémový výběr"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Otevřít šablonu JSON"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Otevřít dialog pro zabanování v této komunitě."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Otevřít kontextovou nabídku"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Otevřete odkaz níže ve svém prohlížeči, zkopírujte celou odpověď JSON a vložte ji do pole."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Posledních 7 dní"
|
||||
msgid "Paste"
|
||||
msgstr "Vložit"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Vložte URL šablony platformy {theOtherPlatform} a importujte její strukturu do nové komunity."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Typ předplatného"
|
||||
msgid "Premium until date"
|
||||
msgstr "Datum konce předplatného"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Připravuji"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Profil"
|
||||
msgid "Profile badge"
|
||||
msgstr "Odznak profilu"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Profilové bannery jsou funkce {PREMIUM_PRODUCT_NAME}. Získejte {PREMIUM_PRODUCT_NAME} a přidejte si banner do svého profilu."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Na této instanci nejsou zapnuté profilové bannery."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Bannery profilu vyžadují {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Bannery profilu vyžadují {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Stisknutím mluvit"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Stisknutím mluvit (omezená funkčnost)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "V režimu Přímý vstup se nastavení Stisknutím mluvit ignoruje. Chcete-li ho použít, přepněte na režim Hlas v popředí nebo Vlastní."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Odebrat přílohu"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Odebrat ověřovací aplikaci"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Odebrat avatar"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Odebrat avatar"
|
||||
msgid "Remove background"
|
||||
msgstr "Odebrat pozadí"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Odebrat banner"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Odebrat ze seznamu oken nahoře"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Odebrat z oblíbených GIFů uložených pouze jako URL"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Odebrat ikonu"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Znovu odesláno"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Resetovat"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Rumunština"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Otočit po směru hodinových ručiček"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Sytost"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Ovládací prvky enkodéru pro sdílení obrazovky"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Sdílení obrazovky ukončeno"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Zobrazit červený odznak na ikoně aplikace, když máte nepřečtené zprávy"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Zobrazit pouze barvu zvýraznění, ignorovat globální profil"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Zobrazovat vlastní emoji v automatickém doplňování výrazů"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Zobrazit výchozí avatar, ignorovat globální profil"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Zobrazit indikátor nepřečtených zpráv u ztlumených kanálů"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Zobrazit avatar globálního profilu v této komunitě"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Zobrazit banner globálního profilu v této komunitě"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Přeskočit"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Přeskočit potvrzení \"Označit vše jako přečtené\""
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Přeskočit oříznutí"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Přepnout na pohodlné rozvržení"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Přepnout na zhuštěné rozvržení"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Přepnout na přímý vstup"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Úkoly"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Přesouváme vás do jiného hlasového regionu..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Šablona"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "Role udělila {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "Zdroj sdílení obrazovky přestal odesílat video, takže bylo ukončeno sdílení obrazovky."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Tento účet nelze zablokovat."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Tuto akci nelze vrátit zpět. Všechna související data, včetně uživatele bota, budou trvale smazána."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Tato animace je příliš dlouhá nebo příliš velká na oříznutí. Zkuste kratší nebo menší soubor."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Tento bot není veřejný a ostatní uživatelé ho nemohou přidat."
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Tento bot vyžaduje administrátorská oprávnění. Udělte mu je, pouze pokud plně důvěřujete vývojáři. Požádejte ho, aby místo toho vyžadoval méně oprávnění. Pokud si nejste jisti, zavřete tuto stránku."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Tento prohlížeč neumí oříznout animované soubory {avifFormatLabel}. Nahrajte místo toho GIF nebo WebP."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Tato konzole prohlížeče je nástroj pro vývojáře."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "Ve vašem prohlížeči je vypnutá technologie WebAssembly, takže nelze oříznout animované obrázky."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Tato skupina je plná. Než přidáte další lidi, někoho odeberte."
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Tento kód pro předání vypršel. Vygenerujte si nový, abyste mohli pokračovat."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Tento obrázek se nepodařilo přečíst. Může být poškozený."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Nahrát"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Nahrajte vlastní avatar pro tuto komunitu"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Nahrát vlastní banner pro tuto komunitu"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Nahrávat soubory a média do zpráv."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Nahrávat soubory a média v tomto kanálu."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Nahrát ikonu"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Použít uhelný motiv (černočerné plochy)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Použít vlastní obrázek"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Použijte filtry nebo zadejte klíčová slova k nalezení zpráv"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Použít globální profil"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Účastníci hlasového chatu"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Zpracování hlasu"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "S {PREMIUM_PRODUCT_NAME} můžete používat animované avatary ({ANIMATED_AVATAR_FORMATS}) a profilové bannery, přizpůsobit si uživatelskou značku a odemknout mnoho dalších výhod {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "K používání emoji z jiných komunit zde potřebujete oprávnění \"
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "K používání samolepek z jiných komunit zde potřebujete oprávnění „{permissionLabel}“."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Než budete moci vytvořit komunitu, musíte dokončit registraci svého účtu."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Abyste mohli v této komunitě posílat zprávy, musíte dokončit regis
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Abyste mohli v této komunitě posílat zprávy, musíte si ověřit telefonní číslo."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Než budete moct vytvořit komunitu, musíte si ověřit e-mailovou adresu."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Vaše uložené rozlišení {savedResolution} s frekvencí {savedFrameRate} snímků za sekundu vyžaduje {premiumProductName}, takže sdílení používá rozlišení {resolution} s frekvencí {frameRate} snímků za sekundu."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Sdílení obrazovky se nepodařilo publikovat s kompatibilním video kodekem, proto bylo zastaveno. Zkuste sdílet znovu."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Váš vlastní odkaz na pozvánku byl nastaven na {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Enkodér videa přestal kódovat snímky, takže sdílení obrazovky bylo ukončeno. Zkuste sdílet znovu."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Přiblížení"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, kommer snart"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Billedets mål passer ikke til {label}. Vælg et andet billede, eller upload et statisk billede, du kan beskære."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "Filen for {label} er for stor. Vælg en fil, der er mindre end {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "{label}-billeder kan ikke være animerede. Brug et statisk billede."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Aktivitetsdeling"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Aktivitetstærskel"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Tillad {everyoneMention} og {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Tillad {PRODUCT_NAME} at få adgang til dit kamera i {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Tillad {PRODUCT_NAME} at få adgang til din mikrofon i {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Giv {PRODUCT_NAME} adgang til din mikrofon. Tjek din browsers adresselinje eller indstillinger."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Tillad medlemmer uden tilladelsen {readMessageHistoryPermissionLabel} at
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Tillad omtaler for denne rolle"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Tillad mikrofon"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "og yderligere {remainingCount}"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animer ved interaktion"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Animerede {AVIF_FORMAT_LABEL}-filer understøttes ikke. Upload i stedet en statisk {AVIF_FORMAT_LABEL}-fil."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Animeret {avifFormatLabel} understøttes ikke"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Animerede avatarer ({ANIMATED_AVATAR_FORMATS}) er kun tilgængelige for {PREMIUM_PRODUCT_NAME}-abonnenter."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Animerede avatarer ({ANIMATED_AVATAR_FORMATS}) er ikke tilgængelige på denne instans. Upload i stedet et statisk billede."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Animerede avatarer ({animatedAvatarFormats}) kræver {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Animerede avatarer og profilbannere"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Animerede avatarer er ikke tilgængelige"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Animerede avatarer kræver {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Forhåndsvisning af animeret billede"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Animerede billeder understøttes ikke for denne ressource."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Registrer sprog automatisk"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Indstil aktivitetstærskel automatisk"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Tilgængelig i computerappen."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Avatarfilen er for stor. Vælg en fil, der er mindre end {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Avataren er for stor – vælg en under {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Valg af avatartilstand"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Ikke til stede lige nu"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Udelukkede brugere"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Banner"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Bannerfilen er for stor. Vælg en fil, der er mindre end {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Valg af bannertilstand"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Køb en {premiumProductName}-gave fra fanen {premiumProductName} for at
|
||||
msgid "Buy gift"
|
||||
msgstr "Køb gave"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Ved at oprette et fællesskab accepterer du at følge og håndhæve <0>retningslinjerne for fællesskabet hos {PRODUCT_NAME}</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Kan ikke uploade filer her"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Centreret"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Skift profilbillede"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Skift baggrund"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Skift banner"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Skift kaldenavn i gruppen"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Skift ikon"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Indløs gave"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Fuldfør oprettelsen af din konto"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Fællesskabet fremmer koordinerede angreb eller målrettet chikane."
|
||||
msgid "Community filter"
|
||||
msgstr "Fællesskabsfilter"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Fællesskabsikon"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Knapper i skrivefeltet"
|
||||
msgid "Composer focus"
|
||||
msgstr "Fokus på skrivefelt"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Komprimerer"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Tilslut et kamera eller en virtuel optagelsesenhed, og prøv igen."
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Tilslut en skærm, og prøv igen."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Tilslut en mikrofon og prøv igen."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Kunne ikke oprette dette klistermærke"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Kunne ikke beskære billede"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Kunne ikke opdatere deling af taleaktivitet lige nu"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Kunne ikke uploade avatar"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Kunne ikke uploade banner"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Opret og del"
|
||||
msgid "Create a community"
|
||||
msgstr "Opret et fællesskab"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Opret et fællesskab, hvor du og dine venner kan chatte."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Beskær invitationens baggrund"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Beskæringsforhåndsvisning"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Beskær profilbanner"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "Det beskårede billede er for stort. Vælg et mindre område eller en mindre fil (maks. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Beskæring af animerede {formatLabel}-filer understøttes ikke endnu. Det originale billede vil blive brugt."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Beskæring af animerede {formatLabel}-filer understøttes ikke endnu. Den originale fil vil blive brugt."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Beskæring af animerede filer understøttes ikke endnu. Det originale billede vil blive brugt."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Beskæring af animerede filer understøttes ikke endnu. Den originale fil vil blive brugt."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Beskærer {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Har du ikke en konto?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Vis ikke"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Avatarer for gruppechats bruger de samme statusmasker som almindelige av
|
||||
msgid "Group DMs"
|
||||
msgstr "Gruppechats"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Gruppeikon"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Gruppeindstillinger"
|
||||
msgid "Group typing states"
|
||||
msgstr "Gruppens skriveindikatorer"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Gruppe opdateret"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Hjerte"
|
||||
msgid "Hebrew"
|
||||
msgstr "Hebraisk"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Højde"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Billede kopieret til udklipsholder"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Billedet kunne ikke bruges"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Udseende og funktionalitet"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Det ser ud til, at du bruger {0}. Ekstra lydbehandling fra {PRODUCT_NAME} kan få lyden til at pumpe eller blive forvrænget. Direkte input sender din lyd igennem uændret."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Ingen resultater fundet"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Ingen omtaler endnu"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Mikrofon ikke fundet"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Åbn system-DM"
|
||||
msgid "Open system picker"
|
||||
msgstr "Åbn systemvælger"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Åbn skabelon-JSON"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Åbn dialogboksen for udelukkelse for dette fællesskab."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Åbn genvejsmenuen"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Åbn linket herunder i din browser, kopier derefter hele JSON-svaret, og indsæt det i feltet."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Seneste 7 dage"
|
||||
msgid "Paste"
|
||||
msgstr "Sæt ind"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Indsæt en skabelon-URL fra {theOtherPlatform} for at importere strukturen til et nyt fællesskab."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Premium-type"
|
||||
msgid "Premium until date"
|
||||
msgstr "Premium indtil dato"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Forbereder"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Profil"
|
||||
msgid "Profile badge"
|
||||
msgstr "Profilbadge"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Profilbannere er en {PREMIUM_PRODUCT_NAME}-funktion. Få {PREMIUM_PRODUCT_NAME} for at tilføje et banner til din profil."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Profilbannere er ikke aktiveret på denne instans."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Profilbannere kræver {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Profilbannere kræver {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Tryk for at tale"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Tryk for at tale (begrænset)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "Tryk for at tale ignoreres ved direkte input. Skift til Fokuseret tale eller Tilpasset for at bruge det."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Fjern vedhæftet fil"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Fjern godkendelsesapp"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Fjern profilbillede"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Fjern profilbillede"
|
||||
msgid "Remove background"
|
||||
msgstr "Fjern baggrund"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Fjern banner"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Slå altid øverst fra"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Fjern fra URL-baserede GIF-favoritter"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Fjern ikon"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Sendt igen"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Nulstil"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Rumænsk"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Roter med uret"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Mætning"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Indstillinger for videokodning ved skærmdeling"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Skærmdeling afsluttet"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Vis et rødt badge på appikonet, når du har ulæste beskeder"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Vis kun accentfarve, ignorer din globale profil"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Vis tilpassede emojis i autofuldførelse af udtryk"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Vis standardavatar, ignorer din globale profil"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Vis indikator for ulæste beskeder i kanaler sat på lydløs"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Vis din globale profilavatar i dette fællesskab"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Vis dit globale profilbanner i dette fællesskab"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Spring over"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Spring \"Markér alle som læst\"-bekræftelse over"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Spring beskæring over"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Skift til rummeligt layout"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Skift til kompakt visning"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Skift til direkte input"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Opgaver"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Flytter dig til en anden taleregion…"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Skabelon"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "Rollen gav {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "Skærmdelingskilden er stoppet med at sende video, så din skærmdeling blev stoppet."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Denne konto kan ikke blokeres."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Denne handling kan ikke fortrydes. Alle tilknyttede data, inklusive botbrugeren, slettes permanent."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Denne animation er for lang eller for stor til at beskære. Prøv en kortere eller mindre fil."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Denne bot er ikke offentlig og kan ikke tilføjes af andre brugere."
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Denne bot anmoder om administratorrettigheder. Giv kun adgang, hvis du har fuld tillid til udvikleren. Bed dem i stedet om at anmode om færre tilladelser. Luk denne side, hvis du er i tvivl."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Denne browser kan ikke beskære animerede {avifFormatLabel}-filer. Upload en GIF eller WebP i stedet."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Denne browserkonsol er et udviklerværktøj."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "Denne browser har WebAssembly slået fra, så animerede billeder kan ikke beskæres."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Denne gruppe er fuld. Fjern en person, før du tilføjer flere."
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Denne overdragelseskode er udløbet. Generer en ny for at fortsætte."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Dette billede kunne ikke læses. Det er muligvis beskadiget."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Upload"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Upload et brugerdefineret avatarbillede til dette fællesskab"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Upload et brugerdefineret banner til dette fællesskab"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Upload filer og medier i beskeder."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Upload filer og medier i denne kanal."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Upload ikon"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Brug kulsort tema (kulsorte overflader)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Brug et tilpasset billede"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Brug filtre eller indtast søgeord for at finde beskeder"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Brug global profil"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Deltagere i taleopkald"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Talebehandling"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "Med {PREMIUM_PRODUCT_NAME} kan du bruge animerede avatarer ({ANIMATED_AVATAR_FORMATS}) og profilbannere, tilpasse dit tag og låse op for mange andre {PREMIUM_PRODUCT_NAME}-fordele."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Du skal have tilladelsen \"{permissionLabel}\" for at bruge emojis fra a
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Du skal have tilladelsen \"{permissionLabel}\" for at bruge klistermærker fra andre fællesskaber her."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Du skal fuldføre oprettelsen af din konto, før du kan oprette et fællesskab."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Du skal fuldføre oprettelsen af din konto for at sende beskeder i dette
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Du skal bekræfte et telefonnummer for at sende beskeder i dette fællesskab."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Du skal bekræfte din e-mailadresse, før du kan oprette et fællesskab."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Din gemte {savedResolution} med {savedFrameRate} FPS kræver {premiumProductName}, så delinger bruger {resolution} med {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Din skærmdeling kunne ikke sendes med et kompatibelt videokodek, så den blev stoppet. Prøv at dele igen."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Dit brugerdefinerede invitationslink er nu {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Din video-encoder stoppede med at kode billeder, så din skærmdeling blev stoppet. Prøv at dele igen."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zoom"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, bald verfügbar"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Die Abmessungen von {label} passen nicht zu diesem Asset. Wähle ein anderes Bild oder lade ein statisches Bild hoch, das du zuschneiden kannst."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "Die Datei \"{label}\" ist zu groß. Wähle eine Datei, die kleiner als {maxSizeLabel} ist."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "{label}-Bilder dürfen nicht animiert sein. Verwende ein statisches Bild."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Aktivitätsfreigabe"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Aktivitätsschwelle"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "{everyoneMention} und {hereMention} erlauben"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Erlaube {PRODUCT_NAME} unter {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME} den Zugriff auf deine Kamera."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Erlaube {PRODUCT_NAME} den Zugriff auf dein Mikrofon in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Erlaube {PRODUCT_NAME}, auf dein Mikrofon zuzugreifen. Überprüfe die Adressleiste oder die Einstellungen deines Browsers."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Erlaube Mitgliedern ohne die Berechtigung „{readMessageHistoryPermissi
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Erwähnungen für diese Rolle zulassen"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Mikrofonzugriff erlauben"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "und {remainingCount} weitere"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animation bei Interaktion"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Animierte {AVIF_FORMAT_LABEL}-Dateien werden nicht unterstützt. Lade stattdessen eine statische {AVIF_FORMAT_LABEL}-Datei hoch."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Animiertes {avifFormatLabel} wird nicht unterstützt"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Animierte Avatare ({ANIMATED_AVATAR_FORMATS}) sind exklusiv für {PREMIUM_PRODUCT_NAME}-Abonnenten verfügbar."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Animierte Avatare ({ANIMATED_AVATAR_FORMATS}) sind auf dieser Instanz nicht verfügbar. Lade stattdessen ein statisches Bild hoch."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Animierte Avatare ({animatedAvatarFormats}) erfordern {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Animierte Avatare und Profilbanner"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Animierte Avatare nicht verfügbar"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Animierte Avatare erfordern {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Vorschau des animierten Bildes"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Animierte Bilder werden für dieses Asset nicht unterstützt."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Sprache automatisch erkennen"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Aktivitätsschwelle automatisch festlegen"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Verfügbar in der Desktop-App."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Die Avatar-Datei ist zu groß. Wähle eine Datei, die kleiner als {imageMaxSizeLabel} ist."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Der Avatar ist zu groß – wähle ein Bild unter {imageMaxSizeLabel} aus."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Avatar-Modus auswählen"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Gerade abwesend"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Gebannte Nutzer"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Banner"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Die Bannerdatei ist zu groß. Wähle eine Datei, die kleiner als {imageMaxSizeLabel} ist."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Bannermodus auswählen"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Kaufe ein {premiumProductName}-Geschenk im Tab „{premiumProductName}
|
||||
msgid "Buy gift"
|
||||
msgstr "Geschenk kaufen"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Durch das Erstellen einer Community stimmst du zu, die <0>Community-Richtlinien von {PRODUCT_NAME}</0> zu befolgen und einzuhalten."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Dateien können hier nicht hochgeladen werden"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Zentriert"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Profilbild ändern"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Hintergrund ändern"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Banner ändern"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Spitznamen in der Gruppe ändern"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Symbol ändern"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Geschenk einlösen"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Deinen Account beanspruchen"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Community fördert kollektive Angriffe oder gezielte Belästigung."
|
||||
msgid "Community filter"
|
||||
msgstr "Community-Filter"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Community-Icon"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Schaltflächen der Nachrichteneingabe"
|
||||
msgid "Composer focus"
|
||||
msgstr "Fokus auf Nachrichteneingabe"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Komprimieren"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Schließe eine Kamera oder ein virtuelles Aufnahmegerät an und versuche
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Schließe einen Bildschirm an und versuche es erneut."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Verbinde ein Mikrofon und versuche es erneut."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Sticker konnte nicht erstellt werden"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Bild konnte nicht zugeschnitten werden"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Freigabe der Sprachaktivität konnte derzeit nicht aktualisiert werden"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Avatar konnte nicht hochgeladen werden"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Banner konnte nicht hochgeladen werden"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Erstellen & teilen"
|
||||
msgid "Create a community"
|
||||
msgstr "Community erstellen"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Erstelle eine Community, in der du und deine Freunde chatten können."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Einladungshintergrund zuschneiden"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Vorschau zuschneiden"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Profilbanner zuschneiden"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "Das zugeschnittene Bild ist zu groß. Wähle einen kleineren Bereich oder eine kleinere Datei (max. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Das Zuschneiden von animierten {formatLabel}-Dateien wird noch nicht unterstützt. Das Originalbild wird verwendet."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Das Zuschneiden von animierten {formatLabel}-Dateien wird noch nicht unterstützt. Der ursprüngliche Upload wird verwendet."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Das Zuschneiden animierter Dateien wird noch nicht unterstützt. Das Originalbild wird verwendet."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Das Zuschneiden animierter Dateien wird noch nicht unterstützt. Es wird der ursprüngliche Upload verwendet."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Zuschneiden von {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Du hast noch keinen Account?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Nicht anzeigen"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Gruppen-DM-Avatare verwenden dieselben Statusmasken wie normale Avatare,
|
||||
msgid "Group DMs"
|
||||
msgstr "Gruppen-DMs"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Gruppensymbol"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Gruppeneinstellungen"
|
||||
msgid "Group typing states"
|
||||
msgstr "Gruppen-Tippstatus"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Gruppe aktualisiert"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Herz"
|
||||
msgid "Hebrew"
|
||||
msgstr "Hebräisch"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Höhe"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Bild in Zwischenablage kopiert"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Bild konnte nicht verwendet werden"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Aussehen und Verhalten"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Es sieht so aus, als würdest du {0} verwenden. Wenn du die Verarbeitung von {PRODUCT_NAME} zusätzlich aktivierst, kann dies zu Pumpen oder Verzerrungen führen. Eine direkte Eingabe leitet dein Audio unverändert weiter."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Keine Treffer gefunden"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Noch keine Erwähnungen"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Kein Mikrofon gefunden"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "System-DM öffnen"
|
||||
msgid "Open system picker"
|
||||
msgstr "Systemauswahl öffnen"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Vorlagen-JSON öffnen"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Banndialog für diese Community öffnen."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Kontextmenü öffnen"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Öffne den Link unten in deinem Browser, kopiere dann die gesamte JSON-Antwort und füge sie in das Feld ein."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Letzte 7 Tage"
|
||||
msgid "Paste"
|
||||
msgstr "Einfügen"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Füge eine {theOtherPlatform}-Vorlagen-URL ein, um ihre Struktur in eine neue Community zu importieren."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Premium-Typ"
|
||||
msgid "Premium until date"
|
||||
msgstr "Premium bis"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Vorbereiten"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Profil"
|
||||
msgid "Profile badge"
|
||||
msgstr "Profilabzeichen"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Profilbanner sind eine {PREMIUM_PRODUCT_NAME}-Funktion. Mit {PREMIUM_PRODUCT_NAME} kannst du deinem Profil ein Banner hinzufügen."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Profilbanner sind auf dieser Instanz nicht aktiviert."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Für Profilbanner ist {premiumProductName} erforderlich"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Profilbanner erfordern {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Push-to-Talk"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Push-to-Talk (begrenzt)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "Push-to-Talk wird bei direkter Eingabe ignoriert. Wechsle zu „Fokussierter Sprachchat“ oder „Benutzerdefiniert“, um es zu verwenden."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Anhang entfernen"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Authenticator-App entfernen"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Profilbild entfernen"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Profilbild entfernen"
|
||||
msgid "Remove background"
|
||||
msgstr "Hintergrund entfernen"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Banner entfernen"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Nicht mehr obenan anzeigen"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Aus der Liste der per URL gespeicherten GIFs entfernen"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Symbol entfernen"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Erneut gesendet"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Zurücksetzen"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Rumänisch"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Im Uhrzeigersinn drehen"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Sättigung"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Encoder-Einstellungen für die Bildschirmfreigabe"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Bildschirmfreigabe beendet"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Rotes Badge auf dem App-Icon bei ungelesenen Nachrichten anzeigen"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Nur Akzentfarbe anzeigen, globale Profileinstellungen ignorieren"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Eigene Emojis in der Ausdrucksvervollständigung anzeigen"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Standard-Avatar anzeigen, globales Profil ignorieren"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Markierung für ungelesene Nachrichten bei stummgeschalteten Kanälen anzeigen"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Zeige dein globales Profilbild in dieser Community"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Zeige dein globales Profilbanner in dieser Community"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Überspringen"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Bestätigung für \"Alle als gelesen markieren\" überspringen"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Zuschneiden überspringen"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Zu \"Komfortabel\" wechseln"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Zu kompakter Ansicht wechseln"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Direkte Eingabe nutzen"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Aufgaben"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Wird zu einer anderen Sprachregion teleportiert …"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Vorlage"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "Die Rolle gewährte {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "Die Quelle der Bildschirmfreigabe hat keine Videodaten mehr gesendet. Deshalb wurde deine Bildschirmfreigabe beendet."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Dieser Account kann nicht blockiert werden."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Diese Aktion kann nicht rückgängig gemacht werden. Alle zugehörigen Daten, einschließlich des Bot-Benutzers, werden dauerhaft gelöscht."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Diese Animation ist zu lang oder zu groß zum Zuschneiden. Versuche es mit einer kürzeren oder kleineren Datei."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Dieser Bot ist nicht öffentlich und kann nicht von anderen Nutzern hinz
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Dieser Bot fordert die Administratorberechtigung an. Erteile sie nur, wenn du dem Entwickler vollständig vertraust. Bitte ihn stattdessen, weniger Berechtigungen anzufordern. Schließe diese Seite, wenn du unsicher bist."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Dieser Browser kann keine animierten {avifFormatLabel}-Dateien zuschneiden. Lade stattdessen eine GIF- oder WebP-Datei hoch."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Diese Browser-Konsole ist ein Entwickler-Tool."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "In diesem Browser ist WebAssembly deaktiviert, daher können animierte Bilder nicht zugeschnitten werden."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Diese Gruppe ist voll. Entferne jemanden, bevor du weitere Personen hinz
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Dieser Übergabecode ist abgelaufen. Erstelle einen neuen, um fortzufahren."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Dieses Bild konnte nicht gelesen werden. Es ist möglicherweise beschädigt."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Hochladen"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Lade ein eigenes Profilbild für diese Community hoch"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Lade ein eigenes Banner für diese Community hoch"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Dateien und Medien in Nachrichten hochladen."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Dateien und Medien in diesem Kanal hochladen."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Symbol hochladen"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Kohlrabenschwarz (pechschwarze Oberflächen)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Eigenes Bild verwenden"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Nachrichten mit Filtern oder Stichwörtern finden"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Globales Profil verwenden"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Sprachchat-Teilnehmer"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Sprachverarbeitung"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "Mit {PREMIUM_PRODUCT_NAME} kannst du animierte Avatare ({ANIMATED_AVATAR_FORMATS}) und Profilbanner verwenden, deinen Tag anpassen und viele weitere {PREMIUM_PRODUCT_NAME}-Vorteile freischalten."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Du benötigst die Berechtigung \"{permissionLabel}\", um hier Emojis aus
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Du benötigst die Berechtigung \"{permissionLabel}\", um hier Sticker aus anderen Communitys zu verwenden."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Du musst zuerst deinen Account beanspruchen, bevor du eine Community erstellen kannst."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Du musst deinen Account beanspruchen, um Nachrichten in dieser Community
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Du musst eine Telefonnummer verifizieren, um Nachrichten in dieser Community senden zu können."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Du musst deine E-Mail-Adresse bestätigen, bevor du eine Community erstellen kannst."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Deine gespeicherte {savedResolution} mit {savedFrameRate} FPS benötigt {premiumProductName}, daher werden Shares mit {resolution} mit {frameRate} FPS verwendet."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Deine Bildschirmfreigabe konnte nicht mit einem kompatiblen Videocodec veröffentlicht werden und wurde daher beendet. Versuche es erneut."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Deine Vanity-URL wurde auf {inviteEndpoint}/{vanitySlug} festgelegt"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Dein Video-Encoder hat aufgehört, Frames zu kodieren, daher wurde deine Bildschirmfreigabe beendet. Versuche es erneut."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zoomen"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, σύντομα διαθέσιμο"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Οι διαστάσεις για {label} δεν ταιριάζουν με αυτό το στοιχείο. Επιλέξτε διαφορετική εικόνα ή ανεβάστε μια στατική εικόνα που μπορείτε να περικόψετε."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "Το αρχείο {label} είναι πολύ μεγάλο. Επιλέξτε ένα αρχείο μικρότερο από {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "Οι εικόνες για {label} δεν μπορούν να είναι κινούμενες. Χρησιμοποιήστε μια στατική εικόνα."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Κοινή χρήση δραστηριοτήτων"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Όριο δραστηριότητας"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Να επιτρέπονται οι αναφορές {everyoneMention} κ
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Επιτρέψτε στο {PRODUCT_NAME} να έχει πρόσβαση στην κάμερά σας στις {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Επιτρέψτε στο {PRODUCT_NAME} να έχει πρόσβαση στο μικρόφωνό σας στις {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Επιτρέψτε στο {PRODUCT_NAME} να έχει πρόσβαση στο μικρόφωνό σας. Ελέγξτε τη γραμμή διευθύνσεων ή τις ρυθμίσεις του προγράμματος περιήγησής σας."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Να επιτρέπεται στα μέλη χωρίς το δικαίω
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Να επιτρέπονται οι αναφορές για αυτόν τον ρόλο"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Να επιτρέπεται το μικρόφωνο"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "και {remainingCount} ακόμη"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Εφέ κίνησης στην αλληλεπίδραση"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Τα κινούμενα αρχεία {AVIF_FORMAT_LABEL} δεν υποστηρίζονται. Ανεβάστε ένα στατικό αρχείο {AVIF_FORMAT_LABEL} αντ' αυτού."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Τα κινούμενα {avifFormatLabel} δεν υποστηρίζονται"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Τα κινούμενα avatar ({ANIMATED_AVATAR_FORMATS}) είναι διαθέσιμα αποκλειστικά στους συνδρομητές {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Τα κινούμενα avatar ({ANIMATED_AVATAR_FORMATS}) δεν είναι διαθέσιμα σε αυτήν την παρουσία. Ανεβάστε μια στατική εικόνα αντ' αυτού."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Τα κινούμενα avatar ({animatedAvatarFormats}) απαιτούν {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Κινούμενα avatar και banner προφίλ"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Τα κινούμενα avatar δεν είναι διαθέσιμα"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Τα κινούμενα avatar απαιτούν {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Προεπισκόπηση κινούμενης εικόνας"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Οι κινούμενες εικόνες δεν υποστηρίζονται για αυτό το στοιχείο."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Αυτόματη ανίχνευση γλώσσας"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Αυτόματη ρύθμιση ορίου δραστηριότητας"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Διαθέσιμο στην εφαρμογή για υπολογιστέ
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Εικόνα προφίλ"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Το αρχείο avatar είναι πολύ μεγάλο. Επιλέξτε ένα αρχείο μικρότερο από {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Το avatar είναι πολύ μεγάλο. Επιλέξτε ένα μικρότερο από {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Επιλογή λειτουργίας avatar"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Απών τώρα"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Αποκλεισμένοι χρήστες"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Banner"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Το αρχείο του banner είναι πολύ μεγάλο. Επιλέξτε ένα αρχείο μικρότερο από {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Επιλογή λειτουργίας banner"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Αγοράστε ένα δώρο {premiumProductName} από την κα
|
||||
msgid "Buy gift"
|
||||
msgstr "Αγορά δώρου"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Δημιουργώντας μια κοινότητα, συμφωνείτε να ακολουθείτε και να τηρείτε τις <0>οδηγίες κοινότητας του {PRODUCT_NAME}</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Δεν μπορείτε να ανεβάσετε αρχεία εδώ"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Στο κέντρο"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Αλλαγή avatar"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Αλλαγή φόντου"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Αλλαγή banner"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Αλλαγή ψευδώνυμου στην ομάδα"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Αλλαγή εικονιδίου"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Παραλαβή δώρου"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Διεκδικήστε τον λογαριασμό σας"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Η κοινότητα διευκολύνει τις ομαδικές ε
|
||||
msgid "Community filter"
|
||||
msgstr "Φίλτρο κοινότητας"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Εικονίδιο κοινότητας"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Κουμπιά σύνταξης"
|
||||
msgid "Composer focus"
|
||||
msgstr "Εστίαση στο πεδίο σύνταξης"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Συμπίεση"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Συνδέστε μια κάμερα ή μια συσκευή εικον
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Συνδέστε μια οθόνη και δοκιμάστε ξανά."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Συνδέστε ένα μικρόφωνο και δοκιμάστε ξανά."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Δεν ήταν δυνατή η δημιουργία αυτού του αυτοκόλλητου"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Δεν ήταν δυνατή η περικοπή της εικόνας"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Δεν ήταν δυνατή η ενημέρωση της κοινοποίησης φωνητικής δραστηριότητας αυτή τη στιγμή"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Δεν ήταν δυνατή η μεταφόρτωση της εικόνας προφίλ"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Δεν ήταν δυνατή η μεταφόρτωση της εικόνας εξωφύλλου"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Δημιουργία και κοινή χρήση"
|
||||
msgid "Create a community"
|
||||
msgstr "Δημιουργία κοινότητας"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Δημιουργήστε μια κοινότητα για να συνομιλείτε με τους φίλους σας."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Περικοπή φόντου πρόσκλησης"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Προεπισκόπηση περικοπής"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Περικοπή banner προφίλ"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "Η περικομμένη εικόνα είναι πολύ μεγάλη. Επιλέξτε μια μικρότερη περιοχή ή ένα μικρότερο αρχείο (μέγ. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Η περικοπή κινούμενων αρχείων {formatLabel} δεν υποστηρίζεται ακόμα. Θα χρησιμοποιηθεί η αρχική εικόνα."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Η περικοπή κινούμενων αρχείων {formatLabel} δεν υποστηρίζεται ακόμα. Θα χρησιμοποιηθεί η αρχική μεταφόρτωση."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Η περικοπή κινούμενων αρχείων δεν υποστηρίζεται ακόμα. Θα χρησιμοποιηθεί η αρχική εικόνα."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Η περικοπή κινούμενων αρχείων δεν υποστηρίζεται ακόμα. Θα χρησιμοποιηθεί η αρχική μεταφόρτωση."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Κοπή {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Δεν έχεις λογαριασμό;"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Να μην εμφανίζεται"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Τα avatar ομαδικών συνομιλιών χρησιμοποιο
|
||||
msgid "Group DMs"
|
||||
msgstr "Ομαδικές συνομιλίες"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Εικονίδιο ομάδας"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Ρυθμίσεις ομάδας"
|
||||
msgid "Group typing states"
|
||||
msgstr "Καταστάσεις πληκτρολόγησης ομάδας"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Η ομάδα ενημερώθηκε"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Καρδιά"
|
||||
msgid "Hebrew"
|
||||
msgstr "Εβραϊκά"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Ύψος"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Η εικόνα αντιγράφηκε στο πρόχειρο"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Η εικόνα δεν ήταν δυνατό να χρησιμοποιηθεί"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Εμφάνιση και αίσθηση"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Φαίνεται ότι χρησιμοποιείτε {0}. Η προσθήκη της επεξεργασίας του {PRODUCT_NAME} από πάνω μπορεί να προκαλέσει διακυμάνσεις έντασης ή παραμόρφωση. Η άμεση είσοδος περνάει τον ήχο σας χωρίς επεξεργασία."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Δεν βρέθηκαν αποτελέσματα"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Δεν υπάρχουν αναφορές ακόμα"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Δεν βρέθηκε μικρόφωνο"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Άνοιγμα DM συστήματος"
|
||||
msgid "Open system picker"
|
||||
msgstr "Άνοιγμα επιλογέα συστήματος"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Άνοιγμα JSON προτύπου"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Άνοιγμα του παραθύρου διαλόγου αποκλει
|
||||
msgid "Open the context menu"
|
||||
msgstr "Άνοιγμα του μενού περιβάλλοντος"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Ανοίξτε τον παρακάτω σύνδεσμο στο πρόγραμμα περιήγησής σας, μετά αντιγράψτε ολόκληρη την απόκριση JSON και επικολλήστε την στο πλαίσιο."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Τελευταίες 7 ημέρες"
|
||||
msgid "Paste"
|
||||
msgstr "Επικόλληση"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Επικολλήστε ένα URL προτύπου {theOtherPlatform} για να εισαγάγετε τη δομή του σε μια νέα κοινότητα."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Τύπος Premium"
|
||||
msgid "Premium until date"
|
||||
msgstr "Ημερομηνία λήξης Premium"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Ετοιμασία"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Προφίλ"
|
||||
msgid "Profile badge"
|
||||
msgstr "Σήμα προφίλ"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Τα banner προφίλ είναι λειτουργία του {PREMIUM_PRODUCT_NAME}. Αποκτήστε το {PREMIUM_PRODUCT_NAME} για να προσθέσετε banner στο προφίλ σας."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Τα banner προφίλ δεν είναι ενεργοποιημένα σε αυτήν την παρουσία."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Τα banner προφίλ απαιτούν {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Τα banner προφίλ απαιτούν {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Push-to-talk"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Push-to-talk (περιορισμένο)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "Η λειτουργία push-to-talk αγνοείται στην άμεση εισαγωγή. Μεταβείτε σε εστιασμένη φωνή ή προσαρμοσμένη για να τη χρησιμοποιήσετε."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Κατάργηση συνημμένου"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Κατάργηση εφαρμογής ελέγχου ταυτότητας"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Κατάργηση avatar"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Κατάργηση avatar"
|
||||
msgid "Remove background"
|
||||
msgstr "Κατάργηση φόντου"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Κατάργηση banner"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Αφαίρεση από την κορυφή"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Αφαίρεση από τα αγαπημένα GIF που αποθηκεύονται μόνο μέσω URL"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Αφαίρεση εικονιδίου"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Εστάλη ξανά"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Επαναφορά"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Ρουμανικά"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Περιστροφή δεξιόστροφα"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Κορεσμός"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Έλεγχος κωδικοποιητή κοινής χρήσης οθόνης"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Η κοινή χρήση οθόνης διακόπηκε"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Εμφάνιση κόκκινης ένδειξης στο εικονίδιο της εφαρμογής όταν έχετε μη αναγνωσμένα μηνύματα"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Εμφάνιση μόνο χρώματος έμφασης, αγνοώντας το καθολικό προφίλ σας"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Εμφάνιση προσαρμοσμένων emoji στην αυτόματη συμπλήρωση εκφράσεων"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Εμφάνιση προεπιλεγμένου avatar, αγνοώντας το καθολικό προφίλ σας"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Εμφάνιση ένδειξης μη αναγνωσμένων στα κανάλια σε σίγαση"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Εμφάνιση του avatar του καθολικού προφίλ σας σε αυτήν την κοινότητα"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Εμφάνιση του banner του καθολικού προφίλ σας σε αυτήν την κοινότητα"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Παράλειψη"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Παράλειψη επιβεβαίωσης \"Επισήμανση όλων ως αναγνωσμένων\""
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Παράλειψη περικοπής"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Εναλλαγή σε άνετη διάταξη"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Εναλλαγή σε συμπαγή διάταξη"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Εναλλαγή σε απευθείας εισαγωγή"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Εργασίες"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Σας μεταφέρουμε σε άλλη περιοχή φωνής..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Πρότυπο"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "Ο ρόλος παραχώρησε {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "Η πηγή κοινής χρήσης οθόνης σταμάτησε να στέλνει βίντεο, επομένως η κοινή χρήση της οθόνης σας διακόπηκε."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Αυτός ο λογαριασμός δεν μπορεί να μπλοκ
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Όλα τα σχετικά δεδομένα, συμπεριλαμβανομένου του χρήστη bot, θα διαγραφούν οριστικά."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Αυτό το κινούμενο σχέδιο είναι πολύ μεγάλο ή έχει πάρα πολλά καρέ για να γίνει περικοπή. Δοκιμάστε ένα μικρότερο αρχείο."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Αυτό το bot δεν είναι δημόσιο και δεν μπο
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Αυτό το bot ζητά το δικαίωμα διαχειριστή. Παραχωρήστε το μόνο αν εμπιστεύεστε πλήρως τον προγραμματιστή. Καλύτερα ζητήστε του να περιορίσει τα δικαιώματα που ζητά. Κλείστε αυτήν τη σελίδα αν δεν είστε σίγουροι."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Αυτό το πρόγραμμα περιήγησης δεν μπορεί να περικόψει κινούμενα αρχεία {avifFormatLabel}. Ανεβάστε ένα αρχείο GIF ή WebP αντ' αυτού."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Αυτή η κονσόλα του προγράμματος περιήγησης είναι ένα εργαλείο προγραμματιστών."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "Αυτός ο περιηγητής έχει απενεργοποιημένη τη WebAssembly, οπότε οι κινούμενες εικόνες δεν μπορούν να περικοπούν."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Αυτή η ομάδα είναι πλήρης. Αφαιρέστε κά
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Αυτός ο κωδικός παράδοσης έχει λήξει. Δημιουργήστε έναν νέο για να συνεχίσετε."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Αυτή η εικόνα δεν διαβάστηκε. Μπορεί να είναι κατεστραμμένη."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Ανέβασμα"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Ανέβασμα προσαρμοσμένου avatar για αυτήν την κοινότητα"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Ανέβασμα προσαρμοσμένου banner για αυτήν την κοινότητα"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Ανέβασμα αρχείων και πολυμέσων σε μηνύ
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Ανέβασμα αρχείων και πολυμέσων σε αυτό το κανάλι."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Ανέβασμα εικονιδίου"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Χρήση θέματος Coal (κατάμαυρες επιφάνειε
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Χρήση προσαρμοσμένης εικόνας"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Χρησιμοποιήστε φίλτρα ή πληκτρολογήστ
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Χρήση καθολικού προφίλ"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Συμμετέχοντες φωνητικής συνομιλίας"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Επεξεργασία φωνής"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Ουισκόνσιν"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "Με το {PREMIUM_PRODUCT_NAME}, μπορείτε να χρησιμοποιείτε κινούμενα avatar ({ANIMATED_AVATAR_FORMATS}) και banner προφίλ, να προσαρμόζετε την ετικέτα σας και να ξεκλειδώνετε πολλά άλλα προνόμια του {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Χρειάζεστε το δικαίωμα «{permissionLabel}» για
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Χρειάζεστε το δικαίωμα «{permissionLabel}» για να χρησιμοποιήσετε αυτοκόλλητα από άλλες κοινότητες εδώ."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Πρέπει να διεκδικήσετε τον λογαριασμό σας πριν δημιουργήσετε μια κοινότητα."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Πρέπει να διεκδικήσετε τον λογαριασμό
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Πρέπει να επαληθεύσετε έναν αριθμό τηλεφώνου για να στείλετε μηνύματα σε αυτήν την κοινότητα."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Πρέπει να επαληθεύσετε τη διεύθυνση email σας πριν δημιουργήσετε μια κοινότητα."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Η αποθηκευμένη ποιότητα {savedResolution} στα {savedFrameRate} FPS απαιτεί {premiumProductName}, οπότε οι κοινοποιήσεις χρησιμοποιούν {resolution} στα {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Η κοινή χρήση οθόνης σας δεν μπόρεσε να δημοσιευτεί με συμβατό κωδικοποιητή βίντεο, επομένως διακόπηκε. Δοκιμάστε να μοιραστείτε ξανά."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Η προσαρμοσμένη διεύθυνση URL έχει οριστεί σε {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Ο κωδικοποιητής βίντεο σταμάτησε να κωδικοποιεί καρέ, οπότε η κοινή χρήση οθόνης διακόπηκε. Δοκιμάστε να την μοιραστείτε ξανά."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Ζουμ"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, coming soon"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "{label} images cannot be animated. Use a static image."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Activity sharing"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Activity threshold"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Allow {everyoneMention} and {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Allow members without the {readMessageHistoryPermissionLabel} permission
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Allow mentions for this role"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Allow microphone"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "and {remainingCount} more"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animate on interaction"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Animated {avifFormatLabel} not supported"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Animated avatars & profile banners"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Animated avatars not available"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Animated avatars require {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Animated image preview"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Animated images are not supported for this asset."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Auto-detect language"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Auto-set activity threshold"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Available in the desktop app."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Avatar mode selection"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Away right now"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Banned users"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Banner"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Banner mode selection"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Buy a {premiumProductName} gift from the {premiumProductName} tab to sha
|
||||
msgid "Buy gift"
|
||||
msgstr "Buy gift"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Can't upload files here"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Centred"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Change avatar"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Change background"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Change banner"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Change group nickname"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Change icon"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Claim gift"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Claim your account"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Community facilitates pile-ons or targeted abuse."
|
||||
msgid "Community filter"
|
||||
msgstr "Community filter"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Community icon"
|
||||
|
||||
@@ -8763,6 +8754,12 @@ msgstr "Composer buttons"
|
||||
msgid "Composer focus"
|
||||
msgstr "Composer focus"
|
||||
|
||||
# auto-i18n: reviewed unchanged
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Compressing"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8914,7 @@ msgstr "Connect a camera or virtual capture device, then try again."
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Connect a display, then try again."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Connect a microphone and try again."
|
||||
|
||||
@@ -9783,7 +9780,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Couldn't create this sticker"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Couldn't crop image"
|
||||
|
||||
@@ -10159,12 +10156,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Couldn't update voice activity sharing right now"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Couldn't upload avatar"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Couldn't upload banner"
|
||||
|
||||
@@ -10230,7 +10227,7 @@ msgstr "Create & share"
|
||||
msgid "Create a community"
|
||||
msgstr "Create a community"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Create a community for you and your friends to chat."
|
||||
|
||||
@@ -10489,7 +10486,7 @@ msgid "Crop invite background"
|
||||
msgstr "Crop invite background"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Crop preview"
|
||||
|
||||
@@ -10500,30 +10497,15 @@ msgstr "Crop profile banner"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Cropping animated files isn't supported yet. The original image will be used."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Cropping {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12579,8 @@ msgstr "Don't have an account?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Don't show"
|
||||
|
||||
@@ -16560,8 +16542,8 @@ msgstr "Group DM avatars using the same status masks as regular avatars, includi
|
||||
msgid "Group DMs"
|
||||
msgstr "Group DMs"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Group icon"
|
||||
|
||||
@@ -16624,8 +16606,8 @@ msgstr "Group settings"
|
||||
msgid "Group typing states"
|
||||
msgstr "Group typing states"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Group updated"
|
||||
|
||||
@@ -16803,7 +16785,7 @@ msgstr "Heart"
|
||||
msgid "Hebrew"
|
||||
msgstr "Hebrew"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Height"
|
||||
|
||||
@@ -17510,7 +17492,7 @@ msgstr "Image copied to clipboard"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Image couldn't be used"
|
||||
|
||||
@@ -19671,7 +19653,7 @@ msgid "Look and feel"
|
||||
msgstr "Look and feel"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
|
||||
@@ -22577,7 +22559,7 @@ msgstr "No matches found"
|
||||
msgid "No mentions yet"
|
||||
msgstr "No mentions yet"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "No microphone found"
|
||||
|
||||
@@ -23806,7 +23788,7 @@ msgstr "Open system DM"
|
||||
msgid "Open system picker"
|
||||
msgstr "Open system picker"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Open template JSON"
|
||||
|
||||
@@ -23820,7 +23802,7 @@ msgstr "Open the ban dialog for this community."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Open the context menu"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
|
||||
@@ -24331,7 +24313,7 @@ msgstr "Past 7 days"
|
||||
msgid "Paste"
|
||||
msgstr "Paste"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
|
||||
@@ -25191,6 +25173,11 @@ msgstr "Premium type"
|
||||
msgid "Premium until date"
|
||||
msgstr "Premium until date"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Preparing"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25484,22 @@ msgstr "Profile"
|
||||
msgid "Profile badge"
|
||||
msgstr "Profile badge"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Profile banners are not enabled on this instance."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Profile banners require {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Profile banners require {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25825,7 @@ msgstr "Push-to-talk"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Push-to-talk (limited)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
|
||||
@@ -26551,8 +26538,8 @@ msgstr "Remove attachment"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Remove authenticator app"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Remove avatar"
|
||||
|
||||
@@ -26561,8 +26548,8 @@ msgstr "Remove avatar"
|
||||
msgid "Remove background"
|
||||
msgstr "Remove background"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Remove banner"
|
||||
|
||||
@@ -26625,10 +26612,10 @@ msgstr "Remove from top"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Remove from URL-only GIF favourites"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Remove icon"
|
||||
|
||||
@@ -27331,7 +27318,7 @@ msgstr "Resent"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Reset"
|
||||
|
||||
@@ -28074,7 +28061,7 @@ msgstr "Romanian"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Rotate clockwise"
|
||||
@@ -28153,8 +28140,8 @@ msgstr "Saturation"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28354,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Screen share encoder controls"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Screen share ended"
|
||||
@@ -30035,7 +30022,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Show a red badge on the app icon when you have unread messages"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Show accent colour only, ignoring your global profile"
|
||||
|
||||
@@ -30104,7 +30091,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Show custom emojis in expression autocomplete"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Show default avatar, ignoring your global profile"
|
||||
|
||||
@@ -30443,12 +30430,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Show unread indicator on muted channels"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Show your global profile avatar in this community"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Show your global profile banner in this community"
|
||||
|
||||
@@ -30720,7 +30707,7 @@ msgstr "Skip"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Skip \"Mark all as read\" confirmation"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Skip cropping"
|
||||
|
||||
@@ -32346,7 +32333,7 @@ msgstr "Switch to comfy layout"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Switch to dense layout"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Switch to direct input"
|
||||
|
||||
@@ -32734,7 +32721,7 @@ msgstr "Tasks"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Teleporting you to another voice region..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Template"
|
||||
|
||||
@@ -33236,7 +33223,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "The role granted {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "The screen share source stopped sending video, so your screen share was stopped."
|
||||
@@ -33453,6 +33440,11 @@ msgstr "This account can't be blocked."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33464,23 @@ msgstr "This bot is not public and cannot be added by other users."
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "This browser console is a developer tool."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33762,11 @@ msgstr "This group is full. Remove someone before adding more people."
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "This handoff code has expired. Generate a new one to continue."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "This image couldn't be read. It may be damaged."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36087,12 @@ msgid "Upload"
|
||||
msgstr "Upload"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Upload a custom avatar for this community"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Upload a custom banner for this community"
|
||||
|
||||
@@ -36155,10 +36164,10 @@ msgstr "Upload files and media in messages."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Upload files and media in this channel."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Upload icon"
|
||||
@@ -36401,8 +36410,8 @@ msgstr "Use coal theme (pitch-black surfaces)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Use custom image"
|
||||
|
||||
@@ -36462,8 +36471,8 @@ msgstr "Use filters or enter keywords to find messages"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Use global profile"
|
||||
|
||||
@@ -37826,7 +37835,7 @@ msgid "Voice participants"
|
||||
msgstr "Voice participants"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Voice processing"
|
||||
@@ -38077,7 +38086,6 @@ msgstr "We couldn't import that theme library file."
|
||||
msgid "We couldn't reach the attachment upload service. {PRODUCT_NAME} can fall back to the standard upload path for messages up to {fallbackSizeFormatted} total, but these attachments exceed that combined limit and can't be sent until connectivity is restored. Try again later or contact <0>{SUPPORT_EMAIL}</0> if this keeps happening."
|
||||
msgstr "We couldn't reach the attachment upload service. {PRODUCT_NAME} can fall back to the standard upload path for messages up to {fallbackSizeFormatted} total, but these attachments exceed that combined limit and can't be sent until connectivity is restored. Try again later or contact <0>{SUPPORT_EMAIL}</0> if this keeps happening."
|
||||
|
||||
# auto-i18n: reviewed unchanged
|
||||
#: src/features/messaging/components/alerts/AttachmentUploadConnectivityModal.tsx:25
|
||||
msgid "We couldn't reach the attachment upload service. {PRODUCT_NAME} can fall back to the standard upload path for messages up to {fallbackSizeFormatted} total, but these attachments exceed that combined limit and can't be sent until connectivity is restored. Try again later or contact the administrators of this instance if this keeps happening."
|
||||
msgstr "We couldn't reach the attachment upload service. {PRODUCT_NAME} can fall back to the standard upload path for messages up to {fallbackSizeFormatted} total, but these attachments exceed that combined limit and can't be sent until connectivity is restored. Try again later or contact the administrators of this instance if this keeps happening."
|
||||
@@ -38685,7 +38693,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customise your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
|
||||
@@ -38935,7 +38943,6 @@ msgstr "You can remove the <0>{readMessageHistoryPermissionLabel}</0> permission
|
||||
msgid "You can sign back in at any time."
|
||||
msgstr "You can sign back in at any time."
|
||||
|
||||
# auto-i18n: reviewed unchanged
|
||||
#. Last line of the set-aside confirmation in the required-action modal on a self-hosted instance. The instance is run by its own administrators, not by the app maker.
|
||||
#: src/features/auth/components/modals/required_action/RequiredActionDescriptors.ts:342
|
||||
msgid "You can still ask the administrators of this instance for a human review at any time."
|
||||
@@ -39336,8 +39343,8 @@ msgstr "You need the \"{permissionLabel}\" permission to use emoji from other co
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "You need to claim your account before you can create a community."
|
||||
|
||||
@@ -39358,8 +39365,8 @@ msgstr "You need to claim your account to send messages in this community."
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "You need to verify a phone number to send messages in this community."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "You need to verify your email address before you can create a community."
|
||||
|
||||
@@ -39982,7 +39989,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProductName}, so shares use {resolution} at {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
@@ -40081,7 +40088,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
@@ -40102,7 +40109,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zoom"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, coming soon"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "{label} images cannot be animated. Use a static image."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Activity sharing"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Activity threshold"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Allow {everyoneMention} and {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Allow members without the {readMessageHistoryPermissionLabel} permission
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Allow mentions for this role"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Allow microphone"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "and {remainingCount} more"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animate on interaction"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Animated {avifFormatLabel} not supported"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Animated avatars & profile banners"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Animated avatars not available"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Animated avatars require {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Animated image preview"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Animated images are not supported for this asset."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Auto-detect language"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Auto-set activity threshold"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Available in the desktop app."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Avatar mode selection"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Away right now"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Banned users"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Banner"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Banner mode selection"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Buy a {premiumProductName} gift from the {premiumProductName} tab to sha
|
||||
msgid "Buy gift"
|
||||
msgstr "Buy gift"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Can't upload files here"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Centered"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Change avatar"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Change background"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Change banner"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Change group nickname"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Change icon"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Claim gift"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Claim your account"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Community facilitates pile-ons or targeted abuse."
|
||||
msgid "Community filter"
|
||||
msgstr "Community filter"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Community icon"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Composer buttons"
|
||||
msgid "Composer focus"
|
||||
msgstr "Composer focus"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Compressing"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Connect a camera or virtual capture device, then try again."
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Connect a display, then try again."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Connect a microphone and try again."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Couldn't create this sticker"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Couldn't crop image"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Couldn't update voice activity sharing right now"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Couldn't upload avatar"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Couldn't upload banner"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Create & share"
|
||||
msgid "Create a community"
|
||||
msgstr "Create a community"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Create a community for you and your friends to chat."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Crop invite background"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Crop preview"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Crop profile banner"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Cropping animated files isn't supported yet. The original image will be used."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Cropping {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Don't have an account?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Don't show"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Group DM avatars using the same status masks as regular avatars, includi
|
||||
msgid "Group DMs"
|
||||
msgstr "Group DMs"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Group icon"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Group settings"
|
||||
msgid "Group typing states"
|
||||
msgstr "Group typing states"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Group updated"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Heart"
|
||||
msgid "Hebrew"
|
||||
msgstr "Hebrew"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Height"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Image copied to clipboard"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Image couldn't be used"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Look and feel"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "No matches found"
|
||||
msgid "No mentions yet"
|
||||
msgstr "No mentions yet"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "No microphone found"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Open system DM"
|
||||
msgid "Open system picker"
|
||||
msgstr "Open system picker"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Open template JSON"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Open the ban dialog for this community."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Open the context menu"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Past 7 days"
|
||||
msgid "Paste"
|
||||
msgstr "Paste"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Premium type"
|
||||
msgid "Premium until date"
|
||||
msgstr "Premium until date"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Preparing"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Profile"
|
||||
msgid "Profile badge"
|
||||
msgstr "Profile badge"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Profile banners are not enabled on this instance."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Profile banners require {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Profile banners require {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Push-to-talk"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Push-to-talk (limited)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Remove attachment"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Remove authenticator app"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Remove avatar"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Remove avatar"
|
||||
msgid "Remove background"
|
||||
msgstr "Remove background"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Remove banner"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Remove from top"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Remove from URL-only GIF favorites"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Remove icon"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Resent"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Reset"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Romanian"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Rotate clockwise"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Saturation"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Screen share encoder controls"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Screen share ended"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Show a red badge on the app icon when you have unread messages"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Show accent color only, ignoring your global profile"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Show custom emojis in expression autocomplete"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Show default avatar, ignoring your global profile"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Show unread indicator on muted channels"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Show your global profile avatar in this community"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Show your global profile banner in this community"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Skip"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Skip \"Mark all as read\" confirmation"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Skip cropping"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Switch to comfy layout"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Switch to dense layout"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Switch to direct input"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Tasks"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Teleporting you to another voice region..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Template"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "The role granted {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "The screen share source stopped sending video, so your screen share was stopped."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "This account can't be blocked."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "This bot is not public and cannot be added by other users."
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "This browser console is a developer tool."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "This group is full. Remove someone before adding more people."
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "This handoff code has expired. Generate a new one to continue."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "This image couldn't be read. It may be damaged."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Upload"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Upload a custom avatar for this community"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Upload a custom banner for this community"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Upload files and media in messages."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Upload files and media in this channel."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Upload icon"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Use coal theme (pitch-black surfaces)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Use custom image"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Use filters or enter keywords to find messages"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Use global profile"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Voice participants"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Voice processing"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "You need the \"{permissionLabel}\" permission to use emoji from other co
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "You need to claim your account before you can create a community."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "You need to claim your account to send messages in this community."
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "You need to verify a phone number to send messages in this community."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "You need to verify your email address before you can create a community."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProductName}, so shares use {resolution} at {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zoom"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, próximamente"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Las dimensiones de {label} no coinciden con este recurso. Elige otra imagen o sube una imagen estática que puedas recortar."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "El archivo {label} es demasiado grande. Elige un archivo de menos de {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "Las imágenes de {label} no pueden tener animación. Usa una imagen estática."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Compartir actividad"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Umbral de actividad"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Permitir {everyoneMention} y {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Permite que {PRODUCT_NAME} acceda a tu cámara en {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Permite que {PRODUCT_NAME} acceda a tu micrófono en {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Permite que {PRODUCT_NAME} acceda a tu micrófono. Revisa la barra de direcciones o la configuración de tu navegador."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Permitir que los miembros sin el permiso {readMessageHistoryPermissionLa
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Permitir menciones para este rol"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Permitir micrófono"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "y {remainingCount} más"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animar al interactuar"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Los archivos {AVIF_FORMAT_LABEL} animados no son compatibles. Sube un archivo {AVIF_FORMAT_LABEL} estático en su lugar."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "El formato {avifFormatLabel} animado no es compatible"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Los avatares animados ({ANIMATED_AVATAR_FORMATS}) están disponibles exclusivamente para suscriptores de {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Los avatares animados ({ANIMATED_AVATAR_FORMATS}) no están disponibles en esta instancia. Sube una imagen estática en su lugar."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Los avatares animados ({animatedAvatarFormats}) requieren {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Avatares y banners de perfil animados"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Avatares animados no disponibles"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Los avatares animados requieren {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Vista previa de imagen animada"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Las imágenes animadas no son compatibles con este recurso."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Detectar idioma automáticamente"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Establecer umbral de actividad automáticamente"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Disponible en la aplicación de escritorio."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "El archivo del avatar es demasiado grande. Elige un archivo de menos de {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "El avatar es demasiado grande. Elige uno de menos de {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Selección de modo de avatar"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Ausente en este momento"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Usuarios baneados"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Banner"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "El archivo del banner es demasiado grande. Elige un archivo de menos de {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Selección del modo del banner"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Compra un regalo de {premiumProductName} desde la pestaña {premiumProdu
|
||||
msgid "Buy gift"
|
||||
msgstr "Comprar regalo"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Al crear una comunidad, aceptas seguir y respetar las <0>normas de la comunidad de {PRODUCT_NAME}</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "No se pueden subir archivos aquí"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Centrado"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Cambiar avatar"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Cambiar fondo"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Cambiar banner"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Cambiar apodo en el grupo"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Cambiar ícono"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Reclamar regalo"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Completa el registro de tu cuenta"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "La comunidad facilita los ataques masivos o el acoso dirigido."
|
||||
msgid "Community filter"
|
||||
msgstr "Filtro de comunidad"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Ícono de la comunidad"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Botones del editor de mensajes"
|
||||
msgid "Composer focus"
|
||||
msgstr "Foco del editor de mensajes"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Comprimiendo"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Conecta una cámara o un dispositivo de captura virtual y vuelve a inten
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Conecta una pantalla y vuelve a intentarlo."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Conecta un micrófono e inténtalo de nuevo."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "No se pudo crear este sticker"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "No se pudo recortar la imagen"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "No se pudo actualizar la opción de compartir actividad de voz en este momento"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "No se pudo subir el avatar"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "No se pudo subir el banner"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Crear y compartir"
|
||||
msgid "Create a community"
|
||||
msgstr "Crear una comunidad"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Crea una comunidad para chatear con tus amigos."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Recortar fondo de invitación"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Vista previa del recorte"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Recortar banner de perfil"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "La imagen recortada es demasiado grande. Elige un área más pequeña o un archivo más pequeño (máx. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Todavía no se admite recortar archivos {formatLabel} animados. Se usará la imagen original."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Todavía no se admite recortar archivos {formatLabel} animados. Se usará el archivo original subido."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Aún no se admite recortar archivos animados. Se usará la imagen original."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Todavía no se admite recortar archivos animados. Se usará el archivo original subido."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Recortando {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "¿No tienes una cuenta?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "No mostrar"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Los avatares de MD de grupo usan las mismas máscaras de estado que los
|
||||
msgid "Group DMs"
|
||||
msgstr "MD grupales"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Ícono del grupo"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Configuración del grupo"
|
||||
msgid "Group typing states"
|
||||
msgstr "Estados de escritura del grupo"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Grupo actualizado"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Corazón"
|
||||
msgid "Hebrew"
|
||||
msgstr "Hebreo"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Altura"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Imagen copiada al portapapeles"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "No se pudo usar la imagen"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Apariencia y estilo"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Parece que estás usando {0}. Si agregas el procesamiento de {PRODUCT_NAME} encima, puede causar bombeo o distorsión. La entrada directa pasa tu audio sin modificaciones."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "No se encontraron resultados"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Aún no hay menciones"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "No se encontró ningún micrófono"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Abrir MD del sistema"
|
||||
msgid "Open system picker"
|
||||
msgstr "Abrir selector del sistema"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Abrir plantilla JSON"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Abrir el diálogo de baneo para esta comunidad."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Abrir el menú contextual"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Abre el siguiente enlace en tu navegador, luego copia la respuesta JSON completa y pégala en el cuadro."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Últimos 7 días"
|
||||
msgid "Paste"
|
||||
msgstr "Pegar"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Pega la URL de una plantilla de {theOtherPlatform} para importar su estructura a una nueva comunidad."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Tipo de premium"
|
||||
msgid "Premium until date"
|
||||
msgstr "Fecha de fin de premium"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Preparando"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Perfil"
|
||||
msgid "Profile badge"
|
||||
msgstr "Insignia de perfil"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Los banners de perfil son una función de {PREMIUM_PRODUCT_NAME}. Obtén {PREMIUM_PRODUCT_NAME} para agregar un banner a tu perfil."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Los banners de perfil no están habilitados en esta instancia."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Los banners de perfil requieren {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Los banners de perfil requieren {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Pulsar para hablar"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Pulsar para hablar (limitado)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "La función pulsar para hablar se ignora en la entrada directa. Cambia a voz enfocada o personalizada para usarla."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Eliminar archivo adjunto"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Eliminar app de autenticación"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Eliminar avatar"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Eliminar avatar"
|
||||
msgid "Remove background"
|
||||
msgstr "Eliminar fondo"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Eliminar banner"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Quitar de la parte superior"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Quitar de los GIF favoritos guardados por URL"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Quitar ícono"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Reenviado"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Restablecer"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Rumano"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Girar a la derecha"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Saturación"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Controles del codificador para compartir pantalla"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Se detuvo el uso compartido de pantalla"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Mostrar una insignia roja en el ícono de la app cuando tengas mensajes sin leer"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Mostrar solo el color de énfasis, ignorando tu perfil global"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Mostrar emojis personalizados en el autocompletado de expresiones"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Mostrar avatar predeterminado, ignorando tu perfil global"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Mostrar indicador de no leídos en canales silenciados"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Mostrar tu avatar de perfil global en esta comunidad"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Mostrar tu banner de perfil global en esta comunidad"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Omitir"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Omitir la confirmación de \"Marcar todo como leído\""
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Omitir recorte"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Cambiar a diseño cómodo"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Cambiar a diseño compacto"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Cambiar a entrada directa"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Tareas"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Teletransportándote a otra región de voz..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Plantilla"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "El rol otorgaba {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "La fuente de uso compartido de pantalla dejó de enviar video, por lo que se detuvo el uso compartido de pantalla."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "No se puede bloquear esta cuenta."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Esta acción no se puede deshacer. Todos los datos asociados, incluyendo el bot, se eliminarán permanentemente."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Esta animación es demasiado larga o grande para recortarla. Intenta con un archivo más corto o pequeño."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Este bot no es público y no puede ser añadido por otros usuarios."
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Este bot solicita el permiso de administrador. Concédeselo solo si confías plenamente en el desarrollador. Pídele que solicite menos permisos. Cierra esta página si no estás seguro."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Este navegador no puede recortar archivos animados de {avifFormatLabel}. Sube un GIF o WebP en su lugar."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Esta consola del navegador es una herramienta para desarrolladores."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "Este navegador tiene WebAssembly desactivado, por lo que no se pueden recortar imágenes animadas."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Este grupo está lleno. Elimina a alguien antes de agregar a más person
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Este código de transferencia ha expirado. Genera uno nuevo para continuar."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Esta imagen no se pudo leer. Podría estar dañada."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Subir"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Subir un avatar personalizado para esta comunidad"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Sube un banner personalizado para esta comunidad"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Sube archivos y contenido multimedia en los mensajes."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Sube archivos y contenido multimedia en este canal."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Subir ícono"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Usar tema carbón (superficies negro intenso)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Usar imagen personalizada"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Usa filtros o ingresa palabras clave para encontrar mensajes"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Usar perfil global"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Participantes en la llamada"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Procesamiento de voz"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "Con {PREMIUM_PRODUCT_NAME}, puedes usar avatares animados ({ANIMATED_AVATAR_FORMATS}) y banners de perfil, personalizar tu etiqueta y desbloquear muchos otros beneficios de {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Necesitas el permiso \"{permissionLabel}\" para usar emojis de otras com
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Necesitas el permiso \"{permissionLabel}\" para usar stickers de otras comunidades aquí."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Debes completar el registro de tu cuenta antes de poder crear una comunidad."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Debes completar el registro de tu cuenta para enviar mensajes en esta co
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Necesitas verificar un número de teléfono para enviar mensajes en esta comunidad."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Necesitas verificar tu dirección de correo electrónico antes de poder crear una comunidad."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Tu {savedResolution} guardado a {savedFrameRate} FPS requiere {premiumProductName}, por lo que los envíos usan {resolution} a {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "No se pudo publicar tu pantalla compartida con un códec de video compatible, por lo que se detuvo. Intenta compartir de nuevo."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Tu URL personalizada se estableció en {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Tu codificador de video dejó de procesar fotogramas, por lo que se detuvo tu uso compartido de pantalla. Intenta compartir de nuevo."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zoom"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, próximamente"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Las dimensiones de {label} no coinciden con este recurso. Elige otra imagen o sube una imagen estática que puedas recortar."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "El archivo {label} es demasiado grande. Elige un archivo de menos de {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "Las imágenes de {label} no pueden estar animadas. Usa una imagen estática."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Compartir actividad"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Umbral de actividad"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Permitir {everyoneMention} y {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Permite que {PRODUCT_NAME} acceda a tu cámara en {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Permite que {PRODUCT_NAME} acceda a tu micrófono en {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Permite que {PRODUCT_NAME} acceda a tu micrófono. Comprueba la barra de direcciones o los ajustes de tu navegador."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Permitir que los miembros sin el permiso {readMessageHistoryPermissionLa
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Permitir menciones para este rol"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Permitir micrófono"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "y {remainingCount} más"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animar al interactuar"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "No se admiten archivos {AVIF_FORMAT_LABEL} animados. Sube un archivo {AVIF_FORMAT_LABEL} estático en su lugar."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "El formato {avifFormatLabel} animado no es compatible"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Los avatares animados ({ANIMATED_AVATAR_FORMATS}) están disponibles exclusivamente para los suscriptores de {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Los avatares animados ({ANIMATED_AVATAR_FORMATS}) no están disponibles en esta instancia. Sube una imagen estática en su lugar."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Los avatares animados ({animatedAvatarFormats}) requieren {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Avatares y banners de perfil animados"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Avatares animados no disponibles"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Los avatares animados requieren {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Vista previa de imagen animada"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Las imágenes animadas no son compatibles con este recurso."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Detectar idioma automáticamente"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Establecer umbral de actividad automáticamente"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Disponible en la aplicación de escritorio."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "El archivo del avatar es demasiado grande. Elige un archivo de menos de {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "El avatar es demasiado grande. Elige uno de menos de {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Selección del modo de avatar"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Ausente ahora mismo"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Usuarios baneados"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Imagen de banner"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "El archivo del banner es demasiado grande. Elige un archivo de menos de {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Selección del modo del banner"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Compra un regalo de {premiumProductName} en la pestaña {premiumProductN
|
||||
msgid "Buy gift"
|
||||
msgstr "Comprar regalo"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Al crear una comunidad, aceptas seguir y respetar las <0>normas de la comunidad de {PRODUCT_NAME}</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "No se pueden subir archivos aquí"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Centrado"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Cambiar avatar"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Cambiar fondo"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Cambiar banner"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Cambiar apodo en el grupo"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Cambiar icono"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Reclamar regalo"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Completa el registro de tu cuenta"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "La comunidad facilita los ataques masivos o el acoso dirigido."
|
||||
msgid "Community filter"
|
||||
msgstr "Filtro de comunidades"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Icono de la comunidad"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Botones del editor de mensajes"
|
||||
msgid "Composer focus"
|
||||
msgstr "Foco del editor de mensajes"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Comprimiendo"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Conecta una cámara o un dispositivo de captura virtual y vuelve a inten
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Conecta una pantalla y vuelve a intentarlo."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Conecta un micrófono y vuelve a intentarlo."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "No se pudo crear esta pegatina"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "No se pudo recortar la imagen"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "No se ha podido actualizar la opción de compartir actividad de voz ahora mismo"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "No se pudo subir el avatar"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "No se pudo subir el banner"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Crear y compartir"
|
||||
msgid "Create a community"
|
||||
msgstr "Crear una comunidad"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Crea una comunidad para chatear con tus amigos."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Recortar fondo de invitación"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Vista previa del recorte"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Recortar el banner del perfil"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "La imagen recortada es demasiado grande. Elige un área o un archivo más pequeño (máx. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Aún no se admite recortar archivos {formatLabel} animados. Se usará la imagen original."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Todavía no se admite recortar archivos {formatLabel} animados. Se usará el archivo original subido."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Todavía no se admite recortar archivos animados. Se usará la imagen original."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Todavía no se admite recortar archivos animados. Se usará el archivo original subido."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Recortando {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "¿No tienes una cuenta?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "No mostrar"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Los avatares de MD de grupo usan las mismas máscaras de estado que los
|
||||
msgid "Group DMs"
|
||||
msgstr "MD de grupo"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Icono del grupo"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Ajustes del grupo"
|
||||
msgid "Group typing states"
|
||||
msgstr "Estados de escritura del grupo"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Grupo actualizado"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Corazón"
|
||||
msgid "Hebrew"
|
||||
msgstr "Hebreo"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Altura"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Imagen copiada al portapapeles"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "No se ha podido usar la imagen"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Apariencia y estilo"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Parece que estás usando {0}. Añadir el procesamiento de {PRODUCT_NAME} puede causar bombeo o distorsión. La entrada directa transmite el audio sin modificar."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "No se encontraron coincidencias"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Aún no hay menciones"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "No se ha encontrado ningún micrófono"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Abrir MD del sistema"
|
||||
msgid "Open system picker"
|
||||
msgstr "Abrir selector del sistema"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Abrir JSON de plantilla"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Abrir el diálogo de baneo para esta comunidad."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Abrir el menú contextual"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Abre el siguiente enlace en tu navegador, luego copia la respuesta JSON completa y pégala en el cuadro."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Últimos 7 días"
|
||||
msgid "Paste"
|
||||
msgstr "Pegar"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Pega la URL de una plantilla de {theOtherPlatform} para importar su estructura a una nueva comunidad."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Tipo de premium"
|
||||
msgid "Premium until date"
|
||||
msgstr "Fecha de fin de premium"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Preparando"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Perfil"
|
||||
msgid "Profile badge"
|
||||
msgstr "Insignia de perfil"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Los banners de perfil son una función de {PREMIUM_PRODUCT_NAME}. Obtén {PREMIUM_PRODUCT_NAME} para añadir un banner a tu perfil."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Los banners de perfil no están habilitados en esta instancia."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Los banners de perfil requieren {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Los banners de perfil requieren {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Pulsar para hablar"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Pulsar para hablar (limitado)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "La función \"Pulsar para hablar\" se ignora en la entrada directa. Cambia a voz enfocada o personalizada para usarla."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Eliminar archivo adjunto"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Eliminar aplicación de autenticación"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Eliminar avatar"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Eliminar avatar"
|
||||
msgid "Remove background"
|
||||
msgstr "Eliminar fondo"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Eliminar banner"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Quitar de la parte superior"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Eliminar de los GIF favoritos guardados por URL"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Eliminar icono"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Reenviado"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Restablecer"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Rumano"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Girar a la derecha"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Saturación"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Controles del codificador para compartir pantalla"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Finalizó el uso compartido de pantalla"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Mostrar un distintivo rojo en el icono de la aplicación cuando tengas mensajes sin leer"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Mostrar solo el color de énfasis, ignorando tu perfil global"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Mostrar emojis personalizados en el autocompletado de expresiones"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Mostrar avatar predeterminado, ignorando tu perfil global"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Mostrar indicador de no leídos en canales silenciados"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Mostrar tu avatar de perfil global en esta comunidad"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Mostrar tu banner de perfil global en esta comunidad"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Omitir"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Omitir la confirmación de \"Marcar todo como leído\""
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Omitir recorte"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Cambiar a diseño cómodo"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Cambiar a diseño compacto"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Cambiar a entrada directa"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Tareas"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Teletransportando a otra región de voz..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Plantilla"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "El rol otorgaba {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "La fuente de uso compartido de pantalla dejó de enviar vídeo, por lo que se detuvo el uso compartido de pantalla."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "No se puede bloquear esta cuenta."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Esta acción no se puede deshacer. Todos los datos asociados, incluido el usuario bot, se eliminarán permanentemente."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Esta animación es demasiado larga o grande para recortarla. Prueba con un archivo más corto o pequeño."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Este bot no es público y no puede ser añadido por otros usuarios."
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Este bot solicita permiso de administrador. Concédeselo solo si confías plenamente en el desarrollador. Pídele que solicite menos permisos. Cierra esta página si no estás seguro."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Este navegador no puede recortar archivos animados de {avifFormatLabel}. Sube un GIF o WebP en su lugar."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Esta consola del navegador es una herramienta para desarrolladores."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "Este navegador tiene WebAssembly desactivado, por lo que no se pueden recortar imágenes animadas."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Este grupo está lleno. Elimina a alguien antes de añadir a más person
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Este código de transferencia ha caducado. Genera uno nuevo para continuar."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "No se ha podido leer esta imagen. Es posible que esté dañada."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Subir"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Sube un avatar personalizado para esta comunidad"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Sube un banner personalizado para esta comunidad"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Sube archivos y contenido multimedia en los mensajes."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Sube archivos y contenido multimedia a este canal."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Subir icono"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Usar tema carbón (superficies totalmente negras)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Usar imagen personalizada"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Usa filtros o introduce palabras clave para encontrar mensajes"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Usar perfil global"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Participantes en el chat de voz"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Procesamiento de voz"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "Con {PREMIUM_PRODUCT_NAME}, puedes usar avatares animados ({ANIMATED_AVATAR_FORMATS}), banners de perfil, personalizar tu etiqueta y desbloquear muchas otras ventajas de {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Necesitas el permiso \"{permissionLabel}\" para usar aquí los emojis de
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Necesitas el permiso \"{permissionLabel}\" para usar pegatinas de otras comunidades aquí."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Debes completar el registro de tu cuenta antes de poder crear una comunidad."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Debes completar el registro de tu cuenta para enviar mensajes en esta co
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Tienes que verificar un número de teléfono para enviar mensajes en esta comunidad."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Tienes que verificar tu dirección de correo electrónico antes de poder crear una comunidad."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Tu {savedResolution} a {savedFrameRate} FPS requiere {premiumProductName}, por lo que las comparticiones usan {resolution} a {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "No se ha podido publicar tu pantalla compartida con un códec de vídeo compatible, por lo que se ha detenido. Intenta compartir de nuevo."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Tu URL personalizada se ha establecido en {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "El codificador de vídeo dejó de codificar fotogramas, por lo que se detuvo el uso compartido de pantalla. Intenta compartir de nuevo."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zoom"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, tulossa pian"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Kuva ei vastaa kohteen {label} mittoja. Valitse toinen kuva tai lähetä staattinen kuva, jonka voit rajata."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "{label}-tiedosto on liian suuri. Valitse tiedosto, joka on pienempi kuin {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "{label}-kuvat eivät voi olla animoituja. Käytä staattista kuvaa."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Aktiviteetin jakaminen"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Aktiivisuuskynnys"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Salli {everyoneMention} ja {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Salli {PRODUCT_NAME}-sovelluksen käyttää kameraasi kohdassa {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Salli {PRODUCT_NAME}-sovelluksen käyttää mikrofonia kohdassa {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Salli {PRODUCT_NAME}-sovelluksen käyttää mikrofonia. Tarkista selaimesi osoitepalkki tai asetukset."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Salli jäsenten, joilla ei ole {readMessageHistoryPermissionLabel} -käy
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Salli maininnat tälle roolille"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Salli mikrofonin käyttö"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "ja {remainingCount} muuta"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animoi napautettaessa"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Animoidut {AVIF_FORMAT_LABEL}-tiedostot eivät ole tuettuja. Lataa sen sijaan staattinen {AVIF_FORMAT_LABEL}-tiedosto."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Animoitua {avifFormatLabel}-tiedostoa ei tueta"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Animoidut avatarit ({ANIMATED_AVATAR_FORMATS}) ovat saatavilla vain {PREMIUM_PRODUCT_NAME}-tilaajille."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Animoidut avatarit ({ANIMATED_AVATAR_FORMATS}) eivät ole käytettävissä tässä instanssissa. Lataa sen sijaan staattinen kuva."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Animoidut avatarit ({animatedAvatarFormats}) edellyttävät {premiumProductName}-tilausta."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Animoidut avatarit ja profiilibannerit"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Animoidut avatarit eivät ole käytettävissä"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Animoidut avatarit edellyttävät {premiumProductName}-tilausta"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Animoidun kuvan esikatselu"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Animoituja kuvia ei tueta tälle resurssille."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Tunnista kieli automaattisesti"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Aseta aktiivisuuskynnys automaattisesti"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Saatavilla työpöytäsovelluksessa."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Profiilikuva"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Profiilikuva on liian suuri. Valitse tiedosto, joka on pienempi kuin {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Profiilikuva on liian suuri. Valitse kuva, jonka koko on alle {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Profiilikuvatilan valinta"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Poissa juuri nyt"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Porttikielletyt käyttäjät"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Banneri"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Banneritiedosto on liian suuri. Valitse tiedosto, joka on pienempi kuin {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Banneritilan valinta"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Osta {premiumProductName}-lahja {premiumProductName}-välilehdeltä ja j
|
||||
msgid "Buy gift"
|
||||
msgstr "Osta lahjaksi"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Luomalla yhteisön sitoudut noudattamaan ja ylläpitämään <0>{PRODUCT_NAME}-yhteisön sääntöjä</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Tiedostoja ei voi lähettää tähän"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Keskitetty"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Vaihda profiilikuva"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Vaihda tausta"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Vaihda banneri"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Vaihda ryhmän lempinimi"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Vaihda kuvake"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Lunasta lahja"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Viimeistele tilisi rekisteröinti"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Yhteisö mahdollistaa joukkoahdistelun tai kohdistetun häirinnän."
|
||||
msgid "Community filter"
|
||||
msgstr "Yhteisösuodatin"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Yhteisön kuvake"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Viestikentän painikkeet"
|
||||
msgid "Composer focus"
|
||||
msgstr "Viestikentän kohdistus"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Pakataan"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Liitä kamera tai virtuaalinen tallennuslaite ja yritä sitten uudelleen
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Liitä näyttö ja yritä uudelleen."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Liitä mikrofoni ja yritä uudelleen."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Tarraa ei voitu luoda"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Kuvan rajaus epäonnistui"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Puheaktiivisuuden jakamista ei voitu päivittää juuri nyt"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Profiilikuvan lataus epäonnistui"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Bannerin lataaminen epäonnistui"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Luo ja jaa"
|
||||
msgid "Create a community"
|
||||
msgstr "Luo yhteisö"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Luo yhteisö sinulle ja kavereillesi keskustelua varten."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Rajaa kutsun taustakuva"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Rajauksen esikatselu"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Rajaa profiilibanneri"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "Rajattu kuva on liian suuri. Valitse pienempi alue tai pienempi tiedosto (enintään {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Animoitujen {formatLabel}-tiedostojen rajausta ei vielä tueta. Käytetään alkuperäistä kuvaa."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Animoitujen {formatLabel}-tiedostojen rajausta ei vielä tueta. Käytetään alkuperäistä tiedostoa."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Animoitujen tiedostojen rajausta ei vielä tueta. Käytetään alkuperäistä kuvaa."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Animoitujen tiedostojen rajausta ei vielä tueta. Käytetään alkuperäistä tiedostoa."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Rajataan {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Eikö sinulla ole tiliä?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Älä näytä"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Ryhmäkeskustelujen avatarit käyttävät samoja tilanaamioita kuin tava
|
||||
msgid "Group DMs"
|
||||
msgstr "Ryhmäkeskustelut"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Ryhmän kuvake"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Ryhmän asetukset"
|
||||
msgid "Group typing states"
|
||||
msgstr "Ryhmän kirjoitustilat"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Ryhmä päivitetty"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Sydän"
|
||||
msgid "Hebrew"
|
||||
msgstr "heprea"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Korkeus"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Kuva kopioitu leikepöydälle"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Kuvaa ei voitu käyttää"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Ulkoasu ja tuntuma"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Näyttää siltä, että käytät ohjelmaa {0}. Jos lisäät {PRODUCT_NAME}-käsittelyn sen päälle, ääni voi pumpata tai vääristyä. Suora syöte välittää äänen muokkaamattomana."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Ei tuloksia"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Ei vielä mainintoja"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Mikrofonia ei löydy"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Avaa järjestelmän yksityisviesti"
|
||||
msgid "Open system picker"
|
||||
msgstr "Avaa järjestelmän valitsin"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Avaa mallipohjan JSON"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Avaa tämän yhteisön porttikieltoikkuna."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Avaa pikavalikko"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Avaa alla oleva linkki selaimessasi, kopioi koko JSON-vastaus ja liitä se kenttään."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Viimeiset 7 päivää"
|
||||
msgid "Paste"
|
||||
msgstr "Liitä"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Liitä {theOtherPlatform}-mallin URL-osoite, niin voit tuoda sen rakenteen uuteen yhteisöön."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Premium-tyyppi"
|
||||
msgid "Premium until date"
|
||||
msgstr "Premium voimassa tähän asti"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Valmistellaan"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Profiili"
|
||||
msgid "Profile badge"
|
||||
msgstr "Profiilimerkki"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Profiilibannerit ovat {PREMIUM_PRODUCT_NAME}-ominaisuus. Hanki {PREMIUM_PRODUCT_NAME}, niin voit lisätä bannerin profiiliisi."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Profiilibannereita ei ole otettu käyttöön tässä instanssissa."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Profiilibannerit edellyttävät {premiumProductName}-tilausta"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Profiilibannerit edellyttävät {premiumProductName}-tilausta."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Push-to-talk"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Puhu painamalla (rajoitettu)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "Push-to-talk ohitetaan suorassa syötteessä. Käytä sitä vaihtamalla kohdennettuun ääneen tai mukautettuun tilaan."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Poista liite"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Poista todennussovellus"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Poista profiilikuva"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Poista profiilikuva"
|
||||
msgid "Remove background"
|
||||
msgstr "Poista taustakuva"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Poista banneri"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Älä pysy päällä"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Poista URL-osoitteena tallennetuista GIF-suosikeista"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Poista kuvake"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Lähetetty uudelleen"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Palauta"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "romania"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Kierrä myötäpäivään"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Kylläisyys"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Näytönjakamisen kooderin asetukset"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Näytönjako päättyi"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Näytä punainen merkki sovelluskuvakkeessa, kun sinulla on lukemattomia viestejä"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Näytä vain korostusväri globaalin profiilisi sijaan"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Näytä mukautetut emojit ilmaisujen automaattisessa täydennyksessä"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Näytä oletusprofiilikuva globaalin profiilisi sijaan"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Näytä lukemattomien viestien ilmaisin mykistetyillä kanavilla"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Näytä globaali profiilikuvasi tässä yhteisössä"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Näytä globaali profiilibannerisi tässä yhteisössä"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Ohita"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Ohita \"Merkitse kaikki luetuiksi\" -vahvistus"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Ohita rajaus"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Vaihda väljään asetteluun"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Vaihda tiiviiseen asetteluun"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Vaihda suoraan syöttöön"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Tehtävät"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Siirretään sinut toiselle äänialueelle..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Mallipohja"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "Rooli myönsi {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "Näytönjakolähde lopetti videon lähettämisen, joten näytönjako on lopetettu."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Tätä tiliä ei voi estää."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Tätä toimintoa ei voi kumota. Kaikki siihen liittyvät tiedot, mukaan lukien bottikäyttäjä, poistetaan pysyvästi."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Animaatio on liian pitkä tai liian suuri rajattavaksi. Kokeile lyhyempää tai pienempää tiedostoa."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Tämä botti ei ole julkinen, eivätkä muut käyttäjät voi lisätä s
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Tämä botti pyytää ylläpitäjän käyttöoikeutta. Myönnä se vain, jos luotat kehittäjään täysin. Pyydä kehittäjää pyytämään sen sijaan vähemmän käyttöoikeuksia. Sulje tämä sivu, jos olet epävarma."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Selaimesi ei voi rajata animoituja {avifFormatLabel} -tiedostoja. Lataa sen sijaan GIF- tai WebP-tiedosto."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Tämä selaimen konsoli on kehittäjän työkalu."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "Selaimesi WebAssembly-tuki on pois päältä, joten animoituja kuvia ei voi rajata."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Tämä ryhmä on täynnä. Poista joku ennen kuin lisäät lisää ihmis
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Tämä siirtokoodi on vanhentunut. Luo uusi jatkaaksesi."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Kuvan lukeminen epäonnistui. Se saattaa olla vioittunut."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Lataa"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Lataa mukautettu avatar tälle yhteisölle"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Lataa mukautettu banneri tälle yhteisölle"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Lähetä tiedostoja ja mediaa viesteihin."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Lähetä tiedostoja ja mediaa tähän kanavaan."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Lataa kuvake"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Käytä hiiliteemaa (sysimustat pinnat)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Käytä omaa kuvaa"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Käytä suodattimia tai kirjoita hakusanoja löytääksesi viestejä"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Käytä globaalia profiilia"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Äänipuhelun osallistujat"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Äänenkäsittely"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "{PREMIUM_PRODUCT_NAME}-tilauksella voit käyttää animoituja avatareita ({ANIMATED_AVATAR_FORMATS}) ja profiilibannereita, mukauttaa tunnistettasi ja avata monia muita {PREMIUM_PRODUCT_NAME}-etuja."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Tarvitset \"{permissionLabel}\" -käyttöoikeuden käyttääksesi muiden
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Tarvitset \"{permissionLabel}\" -käyttöoikeuden käyttääksesi muiden yhteisöjen tarroja täällä."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Sinun on viimeisteltävä tilisi rekisteröinti, ennen kuin voit luoda yhteisön."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Sinun on viimeisteltävä tilisi rekisteröinti, jotta voit lähettää
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Sinun on vahvistettava puhelinnumero lähettääksesi viestejä tässä yhteisössä."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Vahvista sähköpostiosoitteesi, ennen kuin voit luoda yhteisön."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Tallentamasi {savedResolution} ja {savedFrameRate} FPS vaativat {premiumProductName} -tilauksen, joten jaot käyttävät {resolution} ja {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Näyttösi jakamista ei voitu julkaista yhteensopivalla videokoodekilla, joten se pysäytettiin. Yritä jakaa uudelleen."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Mukautetuksi URL-osoitteeksi on asetettu {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Videokooderisi lopetti kuvien koodaamisen, joten näytön jakaminen pysäytettiin. Yritä jakaa uudelleen."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zoomaus"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, bientôt disponible"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Les dimensions de {label} ne correspondent pas à cette ressource. Choisissez une autre image ou importez une image statique que vous pouvez recadrer."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "Le fichier {label} est trop volumineux. Choisissez un fichier de taille inférieure à {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "Les images {label} ne peuvent pas être animées. Utilisez une image statique."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Partage d’activité"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Seuil d'activité"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Autoriser {everyoneMention} et {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Autorisez {PRODUCT_NAME} à accéder à votre caméra dans {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Autorisez {PRODUCT_NAME} à accéder à votre micro dans {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Autorisez {PRODUCT_NAME} à accéder à votre microphone. Vérifiez la barre d'adresse ou les paramètres de votre navigateur."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Autoriser les membres sans la permission {readMessageHistoryPermissionLa
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Autoriser les mentions pour ce rôle"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Autoriser l’accès au micro"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "et {remainingCount} de plus"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animer lors de l'interaction"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Les fichiers {AVIF_FORMAT_LABEL} animés ne sont pas pris en charge. Veuillez plutôt importer un fichier {AVIF_FORMAT_LABEL} statique."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Le format animé {avifFormatLabel} n'est pas pris en charge"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Les avatars animés ({ANIMATED_AVATAR_FORMATS}) sont réservés aux abonnés {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Les avatars animés ({ANIMATED_AVATAR_FORMATS}) ne sont pas disponibles sur cette instance. Importez une image statique."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Les avatars animés ({animatedAvatarFormats}) nécessitent {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Avatars animés et bannières de profil"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Avatars animés non disponibles"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Les avatars animés nécessitent {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Aperçu de l'image animée"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Les images animées ne sont pas prises en charge pour cet élément."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Détection automatique de la langue"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Définir automatiquement le seuil d'activité"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Disponible dans l'application de bureau."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Le fichier de l'avatar est trop volumineux. Choisissez un fichier de taille inférieure à {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Le fichier de l’avatar est trop volumineux. Choisissez-en un de moins de {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Sélection du mode d'avatar"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Absent(e) pour le moment"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Utilisateurs bannis"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Bannière"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Le fichier de la bannière est trop volumineux. Choisissez un fichier de taille inférieure à {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Sélection du mode de la bannière"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Achetez un cadeau {premiumProductName} depuis l'onglet {premiumProductNa
|
||||
msgid "Buy gift"
|
||||
msgstr "Offrir"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "En créant une communauté, vous acceptez de suivre et de respecter les <0>règles de la communauté {PRODUCT_NAME}</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Impossible d’envoyer des fichiers ici"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Centré"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Changer d'avatar"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Changer l'arrière-plan"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Changer la bannière"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Modifier le surnom du groupe"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Changer l'icône"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Récupérer le cadeau"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Finalisez votre inscription"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Cette communauté facilite le harcèlement collectif ou les abus ciblés
|
||||
msgid "Community filter"
|
||||
msgstr "Filtrer les communautés"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Icône de la communauté"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Boutons de la zone de rédaction"
|
||||
msgid "Composer focus"
|
||||
msgstr "Focus de la zone de rédaction"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Compression en cours"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Connectez une caméra ou un appareil de capture virtuel, puis réessayez
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Connectez un écran, puis réessayez."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Connectez un microphone et réessayez."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Impossible de créer ce sticker"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Impossible de recadrer l’image"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Impossible de mettre à jour le partage d'activité vocale pour le moment"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Impossible d’envoyer l’avatar"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Impossible d’envoyer la bannière"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Créer et partager"
|
||||
msgid "Create a community"
|
||||
msgstr "Créer une communauté"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Créez une communauté pour discuter avec vos amis."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Recadrer l'arrière-plan de l'invitation"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Aperçu du recadrage"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Recadrer la bannière de profil"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "L'image recadrée est trop grande. Choisissez une zone plus petite ou un fichier plus petit (max. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Le recadrage des fichiers {formatLabel} animés n'est pas encore pris en charge. L'image originale sera utilisée."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Le recadrage des fichiers {formatLabel} animés n'est pas encore pris en charge. Le fichier original sera utilisé."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Le recadrage des fichiers animés n'est pas encore pris en charge. L'image d'origine sera utilisée."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Le recadrage des fichiers animés n'est pas encore pris en charge. Le fichier d'origine sera utilisé."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Recadrage de {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Vous n'avez pas de compte ?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Ne pas afficher"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Les avatars des MP de groupe utilisent les mêmes masques de statut que
|
||||
msgid "Group DMs"
|
||||
msgstr "MP de groupe"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Icône du groupe"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Paramètres du groupe"
|
||||
msgid "Group typing states"
|
||||
msgstr "États de saisie du groupe"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Groupe mis à jour"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Cœur"
|
||||
msgid "Hebrew"
|
||||
msgstr "Hébreu"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Hauteur"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Image copiée dans le presse-papiers"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Impossible d'utiliser l'image"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Apparence"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Il semble que vous utilisiez {0}. Empiler le traitement de {PRODUCT_NAME} par-dessus peut provoquer des pompages ou des distorsions. L'entrée directe transmet votre audio sans modification."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Aucun résultat"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Aucune mention pour l'instant"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Aucun microphone détecté"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Ouvrir la conversation privée avec le système"
|
||||
msgid "Open system picker"
|
||||
msgstr "Ouvrir le sélecteur système"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Ouvrir le modèle JSON"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Ouvrir la boîte de dialogue de bannissement pour cette communauté."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Ouvrir le menu contextuel"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Ouvrez le lien ci-dessous dans votre navigateur, puis copiez l'intégralité de la réponse JSON et collez-la dans le champ."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "7 derniers jours"
|
||||
msgid "Paste"
|
||||
msgstr "Coller"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Collez une URL de modèle {theOtherPlatform} pour importer sa structure dans une nouvelle communauté."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Type d'abonnement premium"
|
||||
msgid "Premium until date"
|
||||
msgstr "Date de fin Premium"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Préparation"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Profil"
|
||||
msgid "Profile badge"
|
||||
msgstr "Badge de profil"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Les bannières de profil sont une fonctionnalité {PREMIUM_PRODUCT_NAME}. Obtenez {PREMIUM_PRODUCT_NAME} pour ajouter une bannière à votre profil."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Les bannières de profil ne sont pas activées sur cette instance."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Les bannières de profil nécessitent {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Les bannières de profil nécessitent {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Appuyer pour parler"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Appuyer pour parler (limité)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "« Appuyer pour parler » est ignoré en mode « Entrée directe ». Passez en mode « Optimisé pour la voix » ou « Personnalisé » pour l’utiliser."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Supprimer la pièce jointe"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Supprimer l'application d'authentification"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Supprimer l'avatar"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Supprimer l'avatar"
|
||||
msgid "Remove background"
|
||||
msgstr "Supprimer l'arrière-plan"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Supprimer la bannière"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Retirer de l’affichage permanent"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Supprimer des favoris GIF enregistrés par URL"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Supprimer l'icône"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Renvoyé"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Réinitialiser"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Roumain"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Pivoter dans le sens des aiguilles d'une montre"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Saturation"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Commandes de l’encodeur de partage d’écran"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Partage d’écran terminé"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Afficher un badge rouge sur l'icône de l'app en cas de messages non lus"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Afficher uniquement la couleur d'accentuation, en ignorant votre profil global"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Afficher les emojis personnalisés dans la saisie semi-automatique des expressions"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Afficher l'avatar par défaut, en ignorant votre profil global"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Afficher l'indicateur de messages non lus sur les salons mis en sourdine"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Afficher votre avatar de profil global dans cette communauté"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Afficher votre bannière de profil global dans cette communauté"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Passer"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Passer la confirmation « Tout marquer comme lu »"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Ignorer le recadrage"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Passer à la mise en page confortable"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Passer à la mise en page dense"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Passer en mode Entrée directe"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Tâches"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Transfert vers une autre région vocale en cours..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Modèle"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "Le rôle accordait {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "La source de partage d’écran a cessé d’envoyer des vidéos, votre partage d’écran a donc été arrêté."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Ce compte ne peut pas être bloqué."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Cette action est irréversible. Toutes les données associées, y compris l'utilisateur du bot, seront définitivement supprimées."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Cette animation est trop longue ou trop volumineuse pour être rognée. Essayez un fichier plus court ou plus petit."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Ce bot n'est pas public et ne peut pas être ajouté par d'autres utilis
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Ce bot demande la permission d'administrateur. Ne l'accordez que si vous faites entièrement confiance au développeur. Demandez-lui plutôt de demander moins de permissions. Fermez cette page en cas de doute."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Ce navigateur ne peut pas recadrer les fichiers {avifFormatLabel} animés. Téléchargez plutôt un GIF ou un WebP."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Cette console de navigateur est un outil de développement."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "Ce navigateur a WebAssembly désactivé, les images animées ne peuvent donc pas être recadrées."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Ce groupe est plein. Retirez un membre avant d’ajouter d’autres pers
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Ce code de transfert a expiré. Générez-en un nouveau pour continuer."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Cette image n'a pas pu être lue. Elle est peut-être endommagée."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Importer"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Importer un avatar personnalisé pour cette communauté"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Importer une bannière personnalisée pour cette communauté"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Envoyer des fichiers et des médias dans les messages."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Envoyer des fichiers et des médias dans ce salon."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Importer une icône"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Utiliser le thème charbon (surfaces noir de jais)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Utiliser une image personnalisée"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Utilisez les filtres ou saisissez des mots-clés pour trouver des messag
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Utiliser le profil global"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Participants à l'appel"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Traitement de la voix"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "Avec {PREMIUM_PRODUCT_NAME}, vous pouvez utiliser des avatars animés ({ANIMATED_AVATAR_FORMATS}), des bannières de profil, personnaliser votre tag et débloquer de nombreux autres avantages {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Vous devez disposer de la permission « {permissionLabel} » pour utilis
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Vous devez disposer de la permission « {permissionLabel} » pour utiliser ici les stickers d’autres communautés."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Vous devez finaliser votre inscription avant de pouvoir créer une communauté."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Vous devez finaliser votre inscription pour envoyer des messages dans ce
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Vous devez vérifier un numéro de téléphone pour envoyer des messages dans cette communauté."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Vous devez vérifier votre adresse e-mail avant de pouvoir créer une communauté."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Votre {savedResolution} à {savedFrameRate} FPS nécessite {premiumProductName}, les partages utilisent donc {resolution} à {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Votre partage d'écran n'a pas pu être publié avec un codec vidéo compatible, il a donc été arrêté. Essayez de partager à nouveau."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Votre URL personnalisée a été définie sur {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Votre encodeur vidéo a cessé d'encoder des images, votre partage d'écran a donc été arrêté. Essayez de partager à nouveau."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zoom"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, בקרוב"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} קילו-ביט/שנייה"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "הממדים של {label} אינם תואמים לנכס הזה. בחר תמונה אחרת או העלה תמונה סטטית שאפשר לחתוך."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "הקובץ {label} גדול מדי. בחר קובץ קטן מ-{maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "אי אפשר להשתמש בתמונות מונפשות עבור {label}. השתמש בתמונה סטטית."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "שיתוף פעילות"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "סף פעילות"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "אפשר {everyoneMention} ו-{hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "אפשר ל-{PRODUCT_NAME} לגשת למצלמה שלך ב-{MACOS_SYSTEM_SETTINGS_NAME} ← {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} ← {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "אפשר ל-{PRODUCT_NAME} לגשת למיקרופון שלך ב-{MACOS_SYSTEM_SETTINGS_NAME} ← {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} ← {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "אפשר ל-{PRODUCT_NAME} לגשת למיקרופון שלך. בדוק את שורת הכתובת או את ההגדרות של הדפדפן."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "אפשר לחברים ללא הרשאת {readMessageHistoryPermissionLab
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "אפשר אזכורים לתפקיד זה"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "אפשר מיקרופון"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "ו-{remainingCount} נוספים"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "הנפש באינטראקציה"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "קובצי {AVIF_FORMAT_LABEL} מונפשים אינם נתמכים. במקום זאת, יש להעלות קובץ {AVIF_FORMAT_LABEL} סטטי."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "{avifFormatLabel} מונפש אינו נתמך"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "תמונות פרופיל מונפשות ({ANIMATED_AVATAR_FORMATS}) זמינות רק למנויי {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "תמונות פרופיל מונפשות ({ANIMATED_AVATAR_FORMATS}) אינן זמינות במופע זה. יש להעלות תמונה סטטית במקום."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "תמונות פרופיל מונפשות ({animatedAvatarFormats}) דורשות {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "תמונות פרופיל ובאנרים מונפשים"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "תמונות פרופיל מונפשות אינן זמינות"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "תמונות פרופיל מונפשות דורשות {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "תצוגה מקדימה של תמונה מונפשת"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "תמונות מונפשות אינן נתמכות עבור נכס זה."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "זיהוי שפה אוטומטי"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "קביעה אוטומטית של סף הפעילות"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "זמין באפליקציית המחשב."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "תמונת פרופיל"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "קובץ התמונה גדול מדי. יש לבחור קובץ קטן מ-{imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "התמונה גדולה מדי. יש לבחור תמונה קטנה מ-{imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "בחירת מצב אווטאר"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "לא זמין כרגע"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "משתמשים חסומים"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "באנר"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "קובץ הבאנר גדול מדי. יש לבחור קובץ קטן מ-{imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "בחירת מצב באנר"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "ניתן לקנות מתנת {premiumProductName} מהלשונית {prem
|
||||
msgid "Buy gift"
|
||||
msgstr "קניית מתנה"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "ביצירת קהילה, אתה מסכים לפעול לפי <0>הנחיות הקהילה של {PRODUCT_NAME}</0> ולשמור עליהן."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "לא ניתן להעלות קבצים כאן"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "ממורכז"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "שינוי תמונת פרופיל"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "שינוי רקע"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "שינוי באנר"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "שינוי הכינוי בקבוצה"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "שינוי אייקון"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "קבל את המתנה"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "תבע את החשבון שלך"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "הקהילה מאפשרת הצקות המוניות או התנכלות
|
||||
msgid "Community filter"
|
||||
msgstr "סינון קהילות"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "אייקון קהילה"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "כפתורי תיבת ההודעה"
|
||||
msgid "Composer focus"
|
||||
msgstr "מיקוד תיבת ההודעה"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "דוחס"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "חבר מצלמה או התקן לכידה וירטואלי, ואז נס
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "חבר צג, ואז נסה שוב."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "חבר מיקרופון ונסה שוב."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "לא ניתן ליצור את המדבקה הזו"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "לא ניתן לחתוך את התמונה"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "לא ניתן היה לעדכן את שיתוף הפעילות הקולית כעת"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "לא ניתן היה להעלות את האווטאר"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "לא ניתן היה להעלות את הבאנר"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "יצירה ושיתוף"
|
||||
msgid "Create a community"
|
||||
msgstr "יצירת קהילה"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "צור קהילה בשבילך ובשביל החברים שלך כדי לשוחח."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "חיתוך רקע ההזמנה"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "תצוגה מקדימה של חיתוך"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "חיתוך באנר פרופיל"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "התמונה החתוכה גדולה מדי. בחר אזור קטן יותר או קובץ קטן יותר (מקסימום {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "חיתוך קובצי {formatLabel} מונפשים עדיין לא נתמך. ייעשה שימוש בתמונה המקורית."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "חיתוך קובצי {formatLabel} מונפשים עדיין לא נתמך. ייעשה שימוש בקובץ המקורי שהועלה."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "חיתוך קבצים מונפשים עדיין לא נתמך. ייעשה שימוש בתמונה המקורית."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "חיתוך קבצים מונפשים עדיין לא נתמך. ייעשה שימוש בקובץ המקורי שהועלה."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "חותך {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "אין לך חשבון?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "אל תציג"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "תמונות הפרופיל של צ'אטים קבוצתיים משתמש
|
||||
msgid "Group DMs"
|
||||
msgstr "צ'אטים קבוצתיים"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "אייקון הקבוצה"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "הגדרות קבוצה"
|
||||
msgid "Group typing states"
|
||||
msgstr "מצבי הקלדה של קבוצה"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "הקבוצה עודכנה"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "לב"
|
||||
msgid "Hebrew"
|
||||
msgstr "עברית"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "גובה"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "התמונה הועתקה ללוח הגזירים"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "לא ניתן היה להשתמש בתמונה"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "מראה ותחושה"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "נראה שאתה משתמש ב-{0}. הוספת עיבוד של {PRODUCT_NAME} עלולה לגרום לעיוות או להגברת יתר. קלט ישיר מעביר את השמע שלך ללא שינוי."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "לא נמצאו התאמות"
|
||||
msgid "No mentions yet"
|
||||
msgstr "אין אזכורים עדיין"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "לא נמצא מיקרופון"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "פתח את צ'אט המערכת"
|
||||
msgid "Open system picker"
|
||||
msgstr "פתיחת בורר המערכת"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "פתיחת ה-JSON של התבנית"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "פתיחת חלון החסימה עבור קהילה זו."
|
||||
msgid "Open the context menu"
|
||||
msgstr "פתח את תפריט ההקשר"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "יש לפתוח את הקישור למטה בדפדפן, להעתיק את כל תגובת ה-JSON ולהדביק אותה בתיבה."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "7 הימים האחרונים"
|
||||
msgid "Paste"
|
||||
msgstr "הדבק"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "הדבק כתובת URL של תבנית {theOtherPlatform} כדי לייבא את המבנה שלה לקהילה חדשה."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "סוג פרימיום"
|
||||
msgid "Premium until date"
|
||||
msgstr "פרימיום עד תאריך"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "מכין"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "פרופיל"
|
||||
msgid "Profile badge"
|
||||
msgstr "תג פרופיל"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "באנרים בפרופיל הם תכונה של {PREMIUM_PRODUCT_NAME}. קבל {PREMIUM_PRODUCT_NAME} כדי להוסיף באנר לפרופיל שלך."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "באנרים בפרופיל אינם מופעלים במופע זה."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "באנרים בפרופיל דורשים {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "באנרים בפרופיל דורשים {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "דיבור בלחיצה"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "דיבור בלחיצה (מוגבל)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "דיבור בלחיצה אינו פעיל בקלט ישיר. עבור לקול ממוקד או למצב מותאם אישית כדי להשתמש בו."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "הסר קובץ מצורף"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "הסרת אפליקציית אימות"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "הסר תמונת פרופיל"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "הסר תמונת פרופיל"
|
||||
msgid "Remove background"
|
||||
msgstr "הסר רקע"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "הסר באנר"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "בטל הישארות בחלון עליון"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "הסרה מקובצי GIF מועדפים לפי כתובת URL בלבד"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "הסר אייקון"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "נשלח שוב"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "איפוס"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "רומנית"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "סובב עם כיוון השעון"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "רוויה"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "בקרות מקודד שיתוף מסך"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "שיתוף מסך הסתיים"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "הצג תג אדום על סמל האפליקציה כשיש לך הודעות שלא נקראו"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "הצג צבע הדגשה בלבד, תוך התעלמות מהפרופיל הגלובלי שלך"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "הצגת אימוג'י מותאמים אישית בהשלמה אוטומטית של ביטויים"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "הצג אווטאר ברירת מחדל, תוך התעלמות מהפרופיל הגלובלי שלך"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "הצגת חיווי הודעות שלא נקראו בערוצים מושתקים"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "הצג את תמונת הפרופיל הגלובלית שלך בקהילה זו"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "הצג את באנר הפרופיל הגלובלי שלך בקהילה זו"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "דלג"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "דלג על אישור \"סמן הכל כנקרא\""
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "דלג על חיתוך"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "החלף לפריסה נוחה"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "החלף לפריסה דחוסה"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "החלף לקלט ישיר"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "משימות"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "מעביר אותך לאזור קולי אחר..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "תבנית"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "התפקיד העניק את ההרשאות {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "מקור שיתוף המסך הפסיק לשלוח וידאו, ולכן שיתוף המסך שלך הופסק."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "לא ניתן לחסום חשבון זה."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "לא ניתן לבטל פעולה זו. כל הנתונים המשויכים, כולל משתמש הבוט, יימחקו לצמיתות."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "האנימציה הזו ארוכה מדי או גדולה מדי לחיתוך. נסה קובץ קצר או קטן יותר."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "הבוט הזה אינו ציבורי ולא ניתן להוסיף או
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "הבוט הזה מבקש הרשאת מנהל מערכת. הענק אותה רק אם אתה סומך לחלוטין על המפתח. בקש ממנו לצמצם את ההרשאות במקום זאת. סגור את הדף הזה אם אינך בטוח."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "הדפדפן הזה לא יכול לחתוך קבצי {avifFormatLabel} מונפשים. העלה קובץ GIF או WebP במקום זאת."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "מסוף הדפדפן הזה הוא כלי למפתחים."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "בדפדפן שלך WebAssembly כבוי, לכן לא ניתן לחתוך תמונות מונפשות."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "הקבוצה הזו מלאה. הסר מישהו לפני הוספת אנ
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "תוקף קוד ההעברה הזה פג. יש ליצור קוד חדש כדי להמשיך."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "לא ניתן היה לקרוא את התמונה. ייתכן שהיא פגומה."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "העלאה"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "העלה תמונת פרופיל מותאמת אישית לקהילה זו"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "העלה באנר מותאם אישית לקהילה זו"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "העלה קבצים ומדיה בהודעות."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "העלה קבצים ומדיה בערוץ זה."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "העלאת אייקון"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "שימוש בערכת נושא פחם (משטחים שחורים לחל
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "שימוש בתמונה מותאמת אישית"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "השתמש במסננים או הזן מילות מפתח כדי למצ
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "שימוש בפרופיל גלובלי"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "משתתפים בשיחה הקולית"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "עיבוד קולי"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "ויסקונסין"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "עם {PREMIUM_PRODUCT_NAME}, תוכל להשתמש בתמונות פרופיל מונפשות ({ANIMATED_AVATAR_FORMATS}) ובבאנרים לפרופיל, להתאים אישית את התגית שלך ולפתוח הטבות רבות נוספות של {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "דרושה לך ההרשאה \"{permissionLabel}\" כדי להשתמש
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "דרושה לך ההרשאה \"{permissionLabel}\" כדי להשתמש במדבקות מקהילות אחרות כאן."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "עליך לתבוע את החשבון שלך לפני שתוכל ליצור קהילה."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "עליך לתבוע את החשבון שלך כדי לשלוח הודע
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "עליך לאמת מספר טלפון כדי לשלוח הודעות בקהילה זו."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "יש לאמת את כתובת האימייל שלך לפני שתוכל ליצור קהילה."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "האיכות ששמרת של {savedResolution} ב- {savedFrameRate} FPS דורשת {premiumProductName}, לכן השיתופים משתמשים ב- {resolution} ב- {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "לא ניתן היה לפרסם את שיתוף המסך שלך בקודק וידאו תואם, ולכן הוא הופסק. נסה לשתף שוב."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "כתובת ה-URL המותאמת אישית שלך הוגדרה ל-{inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "מקודד הווידאו שלך הפסיק לקודד פריימים, ולכן שיתוף המסך שלך הופסק. נסה לשתף שוב."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "זום"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, जल्द आ रहा है"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "{label} के आयाम इस एसेट से मेल नहीं खाते। कोई अलग इमेज चुनें या ऐसी स्थिर इमेज अपलोड करें जिसे आप क्रॉप कर सकें।"
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "{label} फ़ाइल बहुत बड़ी है। {maxSizeLabel} से छोटी फ़ाइल चुनें।"
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "{label} इमेज को एनिमेट नहीं किया जा सकता। स्थिर इमेज का इस्तेमाल करें।"
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "गतिविधि शेयरिंग"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "गतिविधि थ्रेशोल्ड"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "{everyoneMention} और {hereMention} की अनुमति दे
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "{PRODUCT_NAME} को {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME} में अपने कैमरे का उपयोग करने की अनुमति दें।"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "{PRODUCT_NAME} को {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME} में अपने माइक्रोफ़ोन का उपयोग करने की अनुमति दें।"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "{PRODUCT_NAME} को अपने माइक्रोफ़ोन का इस्तेमाल करने की अनुमति दें। अपने ब्राउज़र के एड्रेस बार या सेटिंग्स में जाँच करें।"
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "जिन सदस्यों के पास {readMessageHistoryPerm
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "इस रोल के लिए मेंशन की अनुमति दें"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "माइक्रोफ़ोन का एक्सेस दें"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "और {remainingCount} अन्य"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "इंटरैक्शन पर एनिमेट करें"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "एनिमेटेड {AVIF_FORMAT_LABEL} फ़ाइलें समर्थित नहीं हैं। इसके बजाय एक स्थिर {AVIF_FORMAT_LABEL} फ़ाइल अपलोड करें।"
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "एनिमेटेड {avifFormatLabel} समर्थित नहीं है"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "एनिमेटेड अवतार ({ANIMATED_AVATAR_FORMATS}) विशेष रूप से {PREMIUM_PRODUCT_NAME} सब्सक्राइबर के लिए उपलब्ध हैं।"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "एनिमेटेड अवतार ({ANIMATED_AVATAR_FORMATS}) इस इंस्टेंस पर उपलब्ध नहीं हैं। इसके बजाय एक स्थिर इमेज अपलोड करें।"
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "एनिमेटेड अवतार ({animatedAvatarFormats}) के लिए {premiumProductName} की आवश्यकता होती है।"
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "एनिमेटेड अवतार और प्रोफ़ाइल बैनर"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "एनिमेटेड अवतार उपलब्ध नहीं हैं"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "एनिमेटेड अवतारों के लिए {premiumProductName} की आवश्यकता है"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "एनिमेटेड इमेज का प्रीव्यू"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "इस एसेट के लिए एनिमेटेड इमेज समर्थित नहीं हैं।"
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "भाषा अपने आप पहचानें"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "गतिविधि थ्रेशोल्ड अपने आप सेट करें"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "डेस्कटॉप ऐप में उपलब्ध है।"
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "अवतार"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "अवतार फ़ाइल बहुत बड़ी है। {imageMaxSizeLabel} से छोटी फ़ाइल चुनें।"
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "अवतार बहुत बड़ा है। {imageMaxSizeLabel} से छोटा चुनें।"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "अवतार मोड चुनें"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "अभी दूर हूँ"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "बैन किए गए यूज़र"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "बैनर"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "बैनर फ़ाइल बहुत बड़ी है। {imageMaxSizeLabel} से छोटी फ़ाइल चुनें।"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "बैनर मोड चुनें"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "दोस्तों के साथ शेयर करने के
|
||||
msgid "Buy gift"
|
||||
msgstr "उपहार खरीदें"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "एक कम्युनिटी बनाकर, आप <0>{PRODUCT_NAME} कम्युनिटी दिशानिर्देशों</0> का पालन करने और उन्हें बनाए रखने के लिए सहमत हैं।"
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "यहां फ़ाइलें अपलोड नहीं की
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "केंद्रित"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "अवतार बदलें"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "बैकग्राउंड बदलें"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "बैनर बदलें"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "ग्रुप का उपनाम बदलें"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "आइकॉन बदलें"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "उपहार क्लेम करें"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "अपना अकाउंट क्लेम करें"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "कम्युनिटी से लोगों का एक सा
|
||||
msgid "Community filter"
|
||||
msgstr "कम्युनिटी फ़िल्टर"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "कम्युनिटी आइकॉन"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "कंपोजर बटन"
|
||||
msgid "Composer focus"
|
||||
msgstr "कंपोजर फ़ोकस"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "संपीड़ित हो रहा है"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "कैमरा या वर्चुअल कैप्चर डि
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "एक डिस्प्ले कनेक्ट करें, फिर दोबारा प्रयास करें।"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "माइक्रोफ़ोन कनेक्ट करें और फिर से प्रयास करें।"
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "यह स्टिकर नहीं बनाया जा सका"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "इमेज क्रॉप नहीं की जा सकी"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "वॉइस गतिविधि शेयरिंग अभी अपडेट नहीं की जा सकी"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "अवतार अपलोड नहीं किया जा सका"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "बैनर अपलोड नहीं किया जा सका"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "बनाएँ और शेयर करें"
|
||||
msgid "Create a community"
|
||||
msgstr "कम्युनिटी बनाएँ"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "अपने और दोस्तों के चैट करने के लिए एक कम्युनिटी बनाएँ।"
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "इनवाइट बैकग्राउंड क्रॉप करें"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "क्रॉप का पूर्वावलोकन"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "प्रोफ़ाइल बैनर क्रॉप करें"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "क्रॉप की गई इमेज बहुत बड़ी है। कोई छोटा हिस्सा या छोटी फ़ाइल चुनें (अधिकतम {maxSizeLabel})।"
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "एनिमेटेड {formatLabel} फ़ाइलों को क्रॉप करना अभी समर्थित नहीं है। मूल इमेज का इस्तेमाल किया जाएगा।"
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "एनिमेटेड {formatLabel} फ़ाइलों को क्रॉप करना अभी समर्थित नहीं है। मूल अपलोड का इस्तेमाल किया जाएगा।"
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "एनिमेटेड फ़ाइलों को क्रॉप करना अभी समर्थित नहीं है। मूल इमेज का इस्तेमाल किया जाएगा।"
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "एनिमेटेड फ़ाइलों को क्रॉप करना अभी समर्थित नहीं है। मूल अपलोड का इस्तेमाल किया जाएगा।"
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "{percent}% क्रॉप हो रहा है"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "अकाउंट नहीं है?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "न दिखाएँ"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "ग्रुप DM अवतार रेगुलर अवतार
|
||||
msgid "Group DMs"
|
||||
msgstr "ग्रुप DM"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "ग्रुप आइकॉन"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "ग्रुप सेटिंग्स"
|
||||
msgid "Group typing states"
|
||||
msgstr "ग्रुप टाइपिंग स्टेटस"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "ग्रुप अपडेट किया गया"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "दिल"
|
||||
msgid "Hebrew"
|
||||
msgstr "हिब्रू"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "ऊँचाई"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "इमेज क्लिपबोर्ड पर कॉपी की
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "इमेज का इस्तेमाल नहीं किया जा सका"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "दिखावट और अनुभव"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "लगता है आप {0} का उपयोग कर रहे हैं। {PRODUCT_NAME} की प्रोसेसिंग को इसके ऊपर रखने से पंपिंग या डिस्टॉर्शन हो सकता है। डायरेक्ट इनपुट आपके ऑडियो को बिना किसी बदलाव के पास करता है।"
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "कोई मिलान नहीं मिला"
|
||||
msgid "No mentions yet"
|
||||
msgstr "अभी तक कोई मेंशन नहीं है"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "कोई माइक्रोफ़ोन नहीं मिला"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "सिस्टम DM खोलें"
|
||||
msgid "Open system picker"
|
||||
msgstr "सिस्टम पिकर खोलें"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "टेम्पलेट JSON खोलें"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "इस कम्युनिटी के लिए बैन डाय
|
||||
msgid "Open the context menu"
|
||||
msgstr "कॉन्टेक्स्ट मेन्यू खोलें"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "नीचे दिए गए लिंक को अपने ब्राउज़र में खोलें, फिर पूरे JSON रिस्पॉन्स को कॉपी करके बॉक्स में पेस्ट करें।"
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "पिछले 7 दिन"
|
||||
msgid "Paste"
|
||||
msgstr "पेस्ट करें"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "{theOtherPlatform} टेम्पलेट यूआरएल पेस्ट करें और उसकी संरचना किसी नई कम्युनिटी में इंपोर्ट करें।"
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "प्रीमियम प्रकार"
|
||||
msgid "Premium until date"
|
||||
msgstr "इस तारीख तक प्रीमियम"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "तैयार हो रहा है"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "प्रोफ़ाइल"
|
||||
msgid "Profile badge"
|
||||
msgstr "प्रोफ़ाइल बैज"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "प्रोफ़ाइल बैनर एक {PREMIUM_PRODUCT_NAME} सुविधा है। अपनी प्रोफ़ाइल में बैनर जोड़ने के लिए {PREMIUM_PRODUCT_NAME} प्राप्त करें।"
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "इस इंस्टेंस पर प्रोफ़ाइल बैनर सक्षम नहीं हैं।"
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "प्रोफ़ाइल बैनर के लिए {premiumProductName} ज़रूरी है"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "प्रोफ़ाइल बैनर के लिए {premiumProductName} ज़रूरी है।"
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "पुश-टू-टॉक"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "पुश-टू-टॉक (सीमित)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "सीधा इनपुट मोड में पुश-टू-टॉक को अनदेखा किया जाता है। इसे इस्तेमाल करने के लिए फ़ोकस्ड वॉइस या कस्टम पर स्विच करें।"
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "अटैचमेंट हटाएँ"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "ऑथेंटिकेटर ऐप हटाएँ"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "अवतार हटाएँ"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "अवतार हटाएँ"
|
||||
msgid "Remove background"
|
||||
msgstr "बैकग्राउंड हटाएँ"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "बैनर हटाएँ"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "सबसे ऊपर रखना बंद करें"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "सिर्फ़ URL वाले पसंदीदा GIF से हटाएँ"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "आइकॉन हटाएँ"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "फिर से भेजा गया"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "रीसेट करें"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "रोमानियाई"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "घड़ी की दिशा में घुमाएँ"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "सैचुरेशन"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "स्क्रीन शेयर एन्कोडर कंट्रोल"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "स्क्रीन शेयर समाप्त हो गया"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "जब आपके पास अपठित मैसेज हों, तो ऐप आइकॉन पर लाल बैज दिखाएँ"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "केवल एक्सेंट रंग दिखाएं, अपनी ग्लोबल प्रोफ़ाइल को अनदेखा करें"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "एक्सप्रेशन ऑटो-कम्प्लीट में कस्टम इमोजी दिखाएं"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "डिफ़ॉल्ट अवतार दिखाएं, अपनी ग्लोबल प्रोफ़ाइल को अनदेखा करें"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "म्यूट किए गए चैनलों पर न पढ़े गए इंडिकेटर दिखाएं"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "इस कम्युनिटी में अपना ग्लोबल प्रोफ़ाइल अवतार दिखाएं"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "इस कम्युनिटी में अपना ग्लोबल प्रोफ़ाइल बैनर दिखाएं"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "छोड़ें"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "\"सभी को पढ़ा गया मार्क करें\" की पुष्टि छोड़ें"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "क्रॉप करना छोड़ें"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "आरामदायक लेआउट पर स्विच कर
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "सघन लेआउट पर स्विच करें"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "सीधे इनपुट पर स्विच करें"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "टास्क"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "दूसरे वॉइस रीजन में टेलीपोर्ट कर रहे हैं..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "टेम्पलेट"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "रोल ने {permissions} प्रदान कीं"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "स्क्रीन शेयर स्रोत ने वीडियो भेजना बंद कर दिया है, इसलिए आपका स्क्रीन शेयर रोक दिया गया।"
|
||||
@@ -33453,6 +33439,11 @@ msgstr "इस अकाउंट को ब्लॉक नहीं किय
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "यह कार्रवाई पूर्ववत नहीं की जा सकती। बॉट यूज़र सहित सभी संबंधित डेटा स्थायी रूप से हटा दिया जाएगा।"
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "यह एनीमेशन क्रॉप करने के लिए बहुत लंबा या बहुत बड़ा है। एक छोटी या हल्की फ़ाइल आज़माएँ।"
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "यह बॉट सार्वजनिक नहीं है और
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "यह बॉट एडमिनिस्ट्रेटर की अनुमति का अनुरोध करता है। इसे तभी अनुमति दें जब आप डेवलपर पर पूरी तरह भरोसा करते हों। इसके बजाय उनसे कम अनुमतियों का अनुरोध करने के लिए कहें। यदि अनिश्चित हैं तो इस पेज को बंद कर दें।"
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "यह ब्राउज़र एनिमेटेड {avifFormatLabel} फ़ाइलों को क्रॉप नहीं कर सकता है। इसके बजाय GIF या WebP अपलोड करें।"
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "यह ब्राउज़र कंसोल एक डेवलपर टूल है।"
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "इस ब्राउज़र में वेबअसेंबली बंद है, इसलिए एनिमेटेड इमेज को क्रॉप नहीं किया जा सकता है।"
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "यह ग्रुप भरा हुआ है। और लोगो
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "यह हैंडऑफ़ कोड समाप्त हो गया है। जारी रखने के लिए एक नया कोड जनरेट करें।"
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "यह इमेज पढ़ी नहीं जा सकी। यह खराब हो सकती है।"
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "अपलोड करें"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "इस कम्युनिटी के लिए एक कस्टम अवतार अपलोड करें"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "इस कम्युनिटी के लिए एक कस्टम बैनर अपलोड करें"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "मैसेज में फ़ाइल और मीडिया अ
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "इस चैनल में फ़ाइलें और मीडिया अपलोड करें।"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "आइकॉन अपलोड करें"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "कोल थीम इस्तेमाल करें (पूरी
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "कस्टम इमेज का इस्तेमाल करें"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "मैसेज ढूंढने के लिए फ़िल्ट
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "ग्लोबल प्रोफ़ाइल का उपयोग करें"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "वॉइस प्रतिभागी"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "वॉइस प्रोसेसिंग"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "विस्कॉन्सिन"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "{PREMIUM_PRODUCT_NAME} के साथ आप एनिमेटेड अवतार ({ANIMATED_AVATAR_FORMATS}) और प्रोफ़ाइल बैनर इस्तेमाल कर सकते हैं, अपना टैग कस्टमाइज़ कर सकते हैं और {PREMIUM_PRODUCT_NAME} के कई दूसरे पर्क अनलॉक कर सकते हैं।"
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "यहां अन्य कम्युनिटी से इमो
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "यहां अन्य कम्युनिटी से स्टिकर इस्तेमाल करने के लिए आपको \"{permissionLabel}\" अनुमति चाहिए।"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "कम्युनिटी बनाने से पहले आपको अपना अकाउंट क्लेम करना होगा।"
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "इस कम्युनिटी में मैसेज भेज
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "इस कम्युनिटी में मैसेज भेजने के लिए आपको फ़ोन नंबर वेरिफ़ाई करना होगा।"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "कम्युनिटी बनाने से पहले आपको अपना ईमेल पता वेरिफ़ाई करना होगा।"
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "आपका सहेजा गया {savedResolution} {savedFrameRate} FPS पर {premiumProductName} की आवश्यकता है, इसलिए शेयर {resolution} {frameRate} FPS पर उपयोग करते हैं।"
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "आपका स्क्रीन शेयर किसी कम्पैटिबल वीडियो कोडेक के साथ पब्लिश नहीं हो सका, इसलिए इसे रोक दिया गया। फिर से शेयर करने की कोशिश करें।"
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "आपका वैनिटी यूआरएल {inviteEndpoint}/{vanitySlug} पर सेट कर दिया गया है"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "आपके वीडियो एन्कोडर ने फ़्रेम एन्कोड करना बंद कर दिया, इसलिए आपकी स्क्रीन शेयरिंग रोक दी गई। फिर से शेयर करने की कोशिश करें।"
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "ज़ूम"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, uskoro"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Dimenzije za {label} ne odgovaraju ovom resursu. Odaberite drugu sliku ili prenesite statičnu sliku koju možete obrezati."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "Datoteka za {label} je prevelika. Odaberite datoteku manju od {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "Slike za {label} ne mogu biti animirane. Koristite statičnu sliku."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Dijeljenje aktivnosti"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Prag aktivnosti"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Dopusti {everyoneMention} i {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Dopustite aplikaciji {PRODUCT_NAME} pristup vašoj kameri u {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Dopustite aplikaciji {PRODUCT_NAME} pristup mikrofonu u {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Dopustite aplikaciji {PRODUCT_NAME} pristup mikrofonu. Provjerite adresnu traku ili postavke preglednika."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Dopusti članovima bez dopuštenja {readMessageHistoryPermissionLabel} d
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Dopusti spominjanje za ovu ulogu"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Dopusti mikrofon"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "i još {remainingCount}"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animiraj pri interakciji"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Animirane {AVIF_FORMAT_LABEL} datoteke nisu podržane. Umjesto toga prenesite statičnu {AVIF_FORMAT_LABEL} datoteku."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Animirani {avifFormatLabel} nije podržan"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Animirani avatari ({ANIMATED_AVATAR_FORMATS}) dostupni su samo pretplatnicima na {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Animirani avatari ({ANIMATED_AVATAR_FORMATS}) nisu dostupni na ovoj instanci. Umjesto toga prenesite statičnu sliku."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Animirani avatari ({animatedAvatarFormats}) zahtijevaju {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Animirani avatari i naslovne slike profila"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Animirani avatari nisu dostupni"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Animirani avatari zahtijevaju {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Pregled animirane slike"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Animirane slike nisu podržane za ovaj resurs."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Automatsko prepoznavanje jezika"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Automatsko postavljanje praga aktivnosti"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Dostupno u aplikaciji za stolna računala."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Datoteka avatara je prevelika. Odaberite datoteku manju od {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Avatar je prevelik. Odaberite manji od {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Odabir načina avatara"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Trenutno odsutan"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Zabranjeni korisnici"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Naslovna slika"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Datoteka naslovne slike je prevelika. Odaberite datoteku manju od {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Odabir načina naslovne slike"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Kupite poklon {premiumProductName} na kartici {premiumProductName} i pod
|
||||
msgid "Buy gift"
|
||||
msgstr "Kupi poklon"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Stvaranjem zajednice pristajete slijediti i podržavati <0>smjernice zajednice {PRODUCT_NAME}</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Ovdje nije moguće učitati datoteke"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Centrirano"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Promijeni avatar"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Promijeni pozadinu"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Promijeni naslovnu sliku"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Promijeni nadimak u grupi"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Promijeni ikonu"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Preuzmi poklon"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Preuzmite svoj račun"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Zajednica olakšava grupne napade ili ciljano zlostavljanje."
|
||||
msgid "Community filter"
|
||||
msgstr "Filtar zajednice"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Ikona zajednice"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Gumbi za sastavljanje poruka"
|
||||
msgid "Composer focus"
|
||||
msgstr "Fokusiranje sastavljača"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Komprimiranje"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Povežite kameru ili virtualni uređaj za snimanje, pa pokušajte ponovn
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Povežite zaslon, a zatim pokušajte ponovno."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Povežite mikrofon i pokušajte ponovno."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Nije moguće stvoriti ovu naljepnicu"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Nije moguće obrezati sliku"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Trenutačno nije moguće ažurirati dijeljenje glasovne aktivnosti"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Nije moguće učitati avatar"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Nije moguće učitati naslovnu sliku"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Stvori i podijeli"
|
||||
msgid "Create a community"
|
||||
msgstr "Stvori zajednicu"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Stvorite zajednicu za dopisivanje s prijateljima."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Obreži pozadinu pozivnice"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Pretpregled obrezivanja"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Obreži naslovnu sliku profila"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "Obrezana slika je prevelika. Odaberite manje područje ili manju datoteku (maks. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Obrezivanje animiranih datoteka formata {formatLabel} još nije podržano. Koristit će se izvorna slika."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Obrezivanje animiranih datoteka formata {formatLabel} još nije podržano. Koristit će se izvorna datoteka."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Obrezivanje animiranih datoteka još nije podržano. Koristit će se izvorna slika."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Obrezivanje animiranih datoteka još nije podržano. Koristit će se izvorna datoteka."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Obrezivanje {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Nemate račun?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Ne prikazuj"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Avatari grupnih izravnih poruka koriste iste maske statusa kao i obični
|
||||
msgid "Group DMs"
|
||||
msgstr "Grupne izravne poruke"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Ikona grupe"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Postavke grupe"
|
||||
msgid "Group typing states"
|
||||
msgstr "Status tipkanja u grupi"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Grupa ažurirana"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Srce"
|
||||
msgid "Hebrew"
|
||||
msgstr "Hebrejski"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Visina"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Slika kopirana u međuspremnik"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Slika se ne može koristiti"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Izgled i dojam"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Čini se da koristite {0}. Dodatna obrada u {PRODUCT_NAME}u povrh toga može uzrokovati pumpanje ili izobličenje zvuka. Izravan unos propušta vaš zvuk netaknutim."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Nema rezultata"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Još nema spominjanja"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Nije pronađen mikrofon"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Otvori izravnu poruku sustava"
|
||||
msgid "Open system picker"
|
||||
msgstr "Otvori sistemski birač"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Otvori JSON predloška"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Otvorite dijaloški okvir za zabranu u ovoj zajednici."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Otvori kontekstni izbornik"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Otvorite donju poveznicu u pregledniku, zatim kopirajte cijeli JSON odgovor i zalijepite ga u okvir."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Zadnjih 7 dana"
|
||||
msgid "Paste"
|
||||
msgstr "Zalijepi"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Zalijepite URL predloška s platforme {theOtherPlatform} kako biste uvezli njegovu strukturu u novu zajednicu."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Vrsta pretplate"
|
||||
msgid "Premium until date"
|
||||
msgstr "Premium do datuma"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Priprema"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Profil"
|
||||
msgid "Profile badge"
|
||||
msgstr "Značka profila"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Naslovne slike profila dostupne su uz {PREMIUM_PRODUCT_NAME}. Nabavite {PREMIUM_PRODUCT_NAME} kako biste dodali naslovnu sliku svom profilu."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Naslovne slike profila nisu omogućene na ovoj instanci."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Naslovne slike profila zahtijevaju {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Naslovne slike profila zahtijevaju {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Pritisni za govor"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Pritisni za govor (ograničeno)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "Pritisni za govor zanemaruje se u izravnom unosu. Prebacite se na fokusirani glas ili prilagođeno da biste ga koristili."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Ukloni privitak"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Ukloni aplikaciju za provjeru autentičnosti"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Ukloni avatar"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Ukloni avatar"
|
||||
msgid "Remove background"
|
||||
msgstr "Ukloni pozadinu"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Ukloni naslovnu sliku"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Ukloni s vrha"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Ukloni iz favorita GIF-ova pohranjenih putem URL-a"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Ukloni ikonu"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Ponovno poslano"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Poništi"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Rumunjski"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Zakreni u smjeru kazaljke na satu"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Zasićenost"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Kontrole za enkoder dijeljenja zaslona"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Dijeljenje zaslona završeno"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Prikaži crvenu značku na ikoni aplikacije kada imate nepročitane poruke"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Prikaži samo boju naglaska, zanemarujući vaš globalni profil"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Prikaži prilagođene emojije u automatskom dovršavanju izraza"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Prikaži zadani avatar, zanemarujući vaš globalni profil"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Prikaži indikator nepročitanih poruka na utišanim kanalima"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Prikaži avatar svog globalnog profila u ovoj zajednici"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Prikaži naslovnu sliku svog globalnog profila u ovoj zajednici"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Preskoči"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Preskoči potvrdu za \"Označi sve kao pročitano\""
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Preskoči obrezivanje"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Prebaci na ugodan izgled"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Prebaci na zgusnuti izgled"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Prebaci na izravan unos"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Zadaci"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Prebacujemo vas u drugu glasovnu regiju..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Predložak"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "Uloga je dodijelila {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "Izvor dijeljenja zaslona prestao je slati video, pa je dijeljenje zaslona zaustavljeno."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Ovaj se račun ne može blokirati."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Ova se radnja ne može poništiti. Svi povezani podaci, uključujući korisnika bota, bit će trajno izbrisani."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Ova animacija je predugačka ili prevelika za obrezivanje. Isprobajte kraću ili manju datoteku."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Ovaj bot nije javan i drugi ga korisnici ne mogu dodati."
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Ovaj bot traži administratorsko dopuštenje. Dajte mu ga samo ako u potpunosti vjerujete razvojnom programeru. Umjesto toga zamolite ga da zatraži manje dopuštenja. Zatvorite ovu stranicu ako niste sigurni."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Ovaj preglednik ne može obrezivati animirane {avifFormatLabel} datoteke. Umjesto toga, učitajte GIF ili WebP."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Ova je konzola preglednika alat za razvojne programere."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "Ovaj preglednik ima isključen WebAssembly, stoga se animirane slike ne mogu obrezivati."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Ova je grupa puna. Uklonite nekoga prije dodavanja novih osoba."
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Ovaj je kod za prijenos istekao. Generirajte novi za nastavak."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Ovu sliku nije moguće pročitati. Možda je oštećena."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Učitaj"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Učitajte prilagođeni avatar za ovu zajednicu"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Učitajte prilagođenu naslovnu sliku za ovu zajednicu"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Prenesite datoteke i medijske sadržaje u porukama."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Prenesite datoteke i medije u ovaj kanal."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Učitaj ikonu"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Koristi ugljenu temu (potpuno crne površine)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Koristi prilagođenu sliku"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Upotrijebite filtre ili unesite ključne riječi za pronalazak poruka"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Koristi globalni profil"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Sudionici glasovnog poziva"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Obrada glasa"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "Uz {PREMIUM_PRODUCT_NAME} možete koristiti animirane avatare ({ANIMATED_AVATAR_FORMATS}) i profilne bannere, prilagoditi svoju oznaku i otključati mnoge druge pogodnosti {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Potrebno vam je dopuštenje \"{permissionLabel}\" da biste ovdje koristi
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Potrebno vam je dopuštenje \"{permissionLabel}\" da biste ovdje koristili naljepnice iz drugih zajednica."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Morate preuzeti svoj račun prije nego što možete stvoriti zajednicu."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Morate preuzeti svoj račun da biste slali poruke u ovoj zajednici."
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Morate potvrditi telefonski broj da biste slali poruke u ovoj zajednici."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Morate potvrditi svoju adresu e-pošte prije nego što možete stvoriti zajednicu."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Tvoja spremljena kvaliteta od {savedResolution} pri {savedFrameRate} FPS zahtijeva {premiumProductName}, stoga dijeljenje koristi {resolution} pri {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Vaše dijeljenje zaslona nije se moglo objaviti s kompatibilnim video kodekom pa je zaustavljeno. Pokušajte ponovno dijeliti."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Vaš prilagođeni URL postavljen je na {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Vaš video enkoder prestao je kodirati sličice, stoga je dijeljenje zaslona zaustavljeno. Pokušajte ponovno dijeliti."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zumiranje"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, hamarosan"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "A(z) {label} méretei nem egyeznek ezzel az elemmel. Válassz másik képet, vagy tölts fel egy körbevágható statikus képet."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "A(z) {label} fájl túl nagy. Válassz egy {maxSizeLabel} méretnél kisebb fájlt."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "A(z) {label} képek nem lehetnek animáltak. Használj statikus képet."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Tevékenységmegosztás"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Tevékenységi küszöb"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "{everyoneMention} és {hereMention} engedélyezése"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Engedélyezd a(z) {PRODUCT_NAME} számára a kamera használatát itt: {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Engedélyezd a(z) {PRODUCT_NAME} számára a mikrofonod elérését a(z) {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME} útvonalon."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Engedélyezd, hogy a(z) {PRODUCT_NAME} hozzáférjen a mikrofonodhoz. Ellenőrizd a böngésződ címsorát vagy beállításait."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Engedélyezd a {readMessageHistoryPermissionLabel} jogosultsággal nem r
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Említések engedélyezése ehhez a szerepkörhöz"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Mikrofon engedélyezése"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "és még {remainingCount} további"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animálás interakciókor"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "Az animált {AVIF_FORMAT_LABEL} fájlok nem támogatottak. Helyette tölts fel egy statikus {AVIF_FORMAT_LABEL} fájlt."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "Az animált {avifFormatLabel} nem támogatott"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Az animált profilképek ({ANIMATED_AVATAR_FORMATS}) kizárólag a(z) {PREMIUM_PRODUCT_NAME} előfizetői számára érhetők el."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Az animált profilképek ({ANIMATED_AVATAR_FORMATS}) nem érhetők el ezen a példányon. Helyette tölts fel egy statikus képet."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Az animált profilképekhez ({animatedAvatarFormats}) {premiumProductName} szükséges."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Animált profilképek és borítóképek"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Az animált profilképek nem érhetők el"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Az animált profilképekhez {premiumProductName} szükséges"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Animált kép előnézete"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Az animált képek nem támogatottak ehhez az elemhez."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Nyelv automatikus észlelése"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Tevékenységi küszöb automatikus beállítása"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Elérhető az asztali alkalmazásban."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Profilkép"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "A profilképfájl túl nagy. Válassz {imageMaxSizeLabel} méretnél kisebb fájlt."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "A profilkép túl nagy – válassz {imageMaxSizeLabel} méretnél kisebbet."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Profilképmód kiválasztása"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Jelenleg távol"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Kitiltott felhasználók"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Borítókép"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "A borítóképfájl túl nagy. Válassz {imageMaxSizeLabel} méretnél kisebb fájlt."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Borítóképmód kiválasztása"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Vásárolj {premiumProductName} ajándékot a(z) {premiumProductName} la
|
||||
msgid "Buy gift"
|
||||
msgstr "Ajándék vásárlása"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Közösség létrehozásával vállalod a(z) <0>{PRODUCT_NAME} közösségi irányelvek</0> betartását és betartatását."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Ide nem tölthetsz fel fájlokat"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Középre igazítva"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Profilkép módosítása"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Háttér módosítása"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Borítókép módosítása"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Csoportbeli becenév módosítása"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Ikon módosítása"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Ajándék beváltása"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Fejezd be a fiókod regisztrációját"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "A közösség megkönnyíti a tömeges támadásokat vagy a célzott zak
|
||||
msgid "Community filter"
|
||||
msgstr "Közösségi szűrő"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Közösség ikonja"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Üzenetírási gombok"
|
||||
msgid "Composer focus"
|
||||
msgstr "Üzenetmező fókusza"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Tömörítés"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Csatlakoztass egy kamerát vagy virtuális rögzítőeszközt, majd pró
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Csatlakoztass egy kijelzőt, majd próbáld újra."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Csatlakoztass egy mikrofont, és próbáld újra."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Nem sikerült létrehozni a matricát"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Nem sikerült körbevágni a képet"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Nem sikerült frissíteni a hangtevékenység megosztását"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Nem sikerült feltölteni a profilképet"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Nem sikerült feltölteni a borítóképet"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Létrehozás és megosztás"
|
||||
msgid "Create a community"
|
||||
msgstr "Közösség létrehozása"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Hozz létre egy közösséget, ahol az ismerőseiddel cseveghetsz."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Meghívó hátterének körbevágása"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Vágás előnézete"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Profil borítóképének körbevágása"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "A körbevágott kép túl nagy. Válassz kisebb területet vagy kisebb fájlt (max. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Az animált {formatLabel} fájlok körbevágása még nem támogatott. Az eredeti képet használjuk."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Az animált {formatLabel} fájlok körbevágása még nem támogatott. Az eredeti feltöltött fájlt használjuk."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Az animált fájlok körbevágása még nem támogatott. Az eredeti képet használjuk."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Az animált fájlok körbevágása még nem támogatott. Az eredeti feltöltött fájlt használjuk."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Kivágás {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Nincs még fiókod?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Ne mutasd"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "A csoportos beszélgetések profilképei ugyanazokat az állapotmaszkoka
|
||||
msgid "Group DMs"
|
||||
msgstr "Csoportos beszélgetések"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Csoport ikonja"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Csoportbeállítások"
|
||||
msgid "Group typing states"
|
||||
msgstr "Csoportos gépelési állapotok"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Csoport frissítve"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Szív"
|
||||
msgid "Hebrew"
|
||||
msgstr "Héber"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Magasság"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Kép a vágólapra másolva"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "A kép nem használható"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Megjelenés és érzet"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Úgy tűnik, ezt használod: {0}. Ha erre a(z) {PRODUCT_NAME} hangfeldolgozása is rákerül, az hangerő-ingadozást vagy torzítást okozhat. A közvetlen bemenet változtatás nélkül továbbítja a hangodat."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Nincs találat"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Még nincsenek említések"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Nem található mikrofon"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Rendszerrel folytatott közvetlen beszélgetés megnyitása"
|
||||
msgid "Open system picker"
|
||||
msgstr "Rendszer választóablakának megnyitása"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Sablon JSON-jának megnyitása"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "A közösség kitiltási párbeszédablakának megnyitása."
|
||||
msgid "Open the context menu"
|
||||
msgstr "A helyi menü megnyitása"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Nyisd meg az alábbi linket a böngésződben, majd másold ki a teljes JSON-választ, és illeszd be a mezőbe."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Elmúlt 7 nap"
|
||||
msgid "Paste"
|
||||
msgstr "Beillesztés"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Illeszd be a(z) {theOtherPlatform} egyik sablonjának URL-jét, hogy a szerkezetét új közösségbe importáld."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Prémium típus"
|
||||
msgid "Premium until date"
|
||||
msgstr "Prémium eddig érvényes"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Előkészítés"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Profil"
|
||||
msgid "Profile badge"
|
||||
msgstr "Profiljelvény"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Profilborítóképet a(z) {PREMIUM_PRODUCT_NAME} csomaggal használhatsz. Válts a(z) {PREMIUM_PRODUCT_NAME} csomagra, hogy borítóképet adj a profilodhoz."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Ezen a példányon nincsenek engedélyezve a profilborítóképek."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "A profilborítóképekhez {premiumProductName} szükséges"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "A profilborítóképekhez {premiumProductName} szükséges."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Adásgomb"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Adásgomb (korlátozott)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "Közvetlen bemenet használatakor az adásgomb nem működik. A használatához válts Beszédkiemelés vagy Egyéni módra."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Melléklet eltávolítása"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Hitelesítő alkalmazás eltávolítása"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Profilkép eltávolítása"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Profilkép eltávolítása"
|
||||
msgid "Remove background"
|
||||
msgstr "Háttér eltávolítása"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Borítókép eltávolítása"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Mindig felül beállítás kikapcsolása"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Eltávolítás az URL-en alapuló GIF-kedvencek közül"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Ikon eltávolítása"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Újraküldve"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Visszaállítás"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Román"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Forgatás az óramutató járásával megegyező irányba"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Telítettség"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Képernyőmegosztás-kódoló beállításai"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "A képernyőmegosztás befejeződött"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Piros jelvény megjelenítése az alkalmazás ikonján, ha olvasatlan üzeneteid vannak"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Csak a kiemelőszín megjelenítése, a globális profilod figyelmen kívül hagyásával"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Egyéni emojik megjelenítése az automatikus kiegészítésben"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Alapértelmezett profilkép megjelenítése, a globális profilod figyelmen kívül hagyásával"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Olvasatlan jelzése némított csatornákon"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "A globális profilképed megjelenítése ebben a közösségben"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Globális profilborítóképed megjelenítése ebben a közösségben"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Kihagyás"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "„Összes megjelölése olvasottként” megerősítés kihagyása"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Körbevágás kihagyása"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Átváltás kényelmes elrendezésre"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Váltás sűrű elrendezésre"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Váltás közvetlen bemenetre"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Feladatok"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Áthelyezés egy másik hangrégióba…"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Sablon"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "A szerepkör a következőket biztosította: {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "A képernyőmegosztás forrása nem küldött tovább videót, ezért a képernyőmegosztásod leállt."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Ez a fiók nem tiltható le."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Ez a művelet nem vonható vissza. Minden kapcsolódó adat, beleértve a bot felhasználót is, véglegesen törlődik."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Ez az animáció túl hosszú vagy túl nagy a vágáshoz. Próbálkozz rövidebb vagy kisebb fájllal."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Ez a bot nem nyilvános, és más felhasználók nem adhatják hozzá."
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Ez a bot rendszergazdai jogosultságot kér. Csak akkor add meg, ha teljesen megbízol a fejlesztőben. Kérd meg, hogy kevesebb jogosultságot kérjen. Ha bizonytalan vagy, zárd be ezt az oldalt."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Ez a böngésző nem tud animált {avifFormatLabel} fájlokat vágni. Tölts fel inkább GIF vagy WebP fájlt."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Ez a böngészőkonzol egy fejlesztői eszköz."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "A böngészőben ki van kapcsolva a WebAssembly, ezért az animált képek nem vághatók le."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Ez a csoport megtelt. Távolíts el valakit, mielőtt további személye
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Ez az átadási kód lejárt. A folytatáshoz hozz létre újat."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "A kép nem olvasható be. Lehet, hogy sérült."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Feltöltés"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Egyéni profilkép feltöltése ehhez a közösséghez"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Egyedi borítókép feltöltése ehhez a közösséghez"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Fájlok és média feltöltése üzenetekben."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Fájlok és média feltöltése ebben a csatornában."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Ikon feltöltése"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Szén téma használata (koromfekete felületek)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Egyéni kép használata"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Használj szűrőket, vagy írj be kulcsszavakat az üzenetek keresésé
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Globális profil használata"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Hanghívás résztvevői"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Hangfeldolgozás"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "A(z) {PREMIUM_PRODUCT_NAME} csomaggal animált profilképeket ({ANIMATED_AVATAR_FORMATS}) és profilborítóképeket használhatsz, testre szabhatod a címkédet, és a(z) {PREMIUM_PRODUCT_NAME} számos további előnyét is élvezheted."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Más közösségek emojijainak itteni használatához a(z) „{permissio
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Más közösségek matricáinak itteni használatához a(z) „{permissionLabel}” jogosultságra van szükséged."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Közösség létrehozása előtt be kell fejezned a fiókod regisztrációját."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Ahhoz, hogy ebben a közösségben üzeneteket küldhess, be kell fejezn
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Telefonszámot kell igazolnod, hogy üzeneteket küldhess ebben a közösségben."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Közösség létrehozása előtt meg kell erősítened az e-mail-címedet."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "A mentett {savedResolution} {savedFrameRate} FPS minőséghez {premiumProductName} szükséges, ezért a megosztások {resolution} minőségben, {frameRate} FPS sebességgel történnek."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "A képernyőmegosztásodat nem sikerült kompatibilis videokodekkel közzétenni, ezért leállt. Próbáld meg újra megosztani."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "Az egyéni meghívólinked beállítva: {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "A videokódolód nem kódolt több képkockát, ezért a képernyőmegosztásod leállt. Próbáld meg újra megosztani."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Nagyítás"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, segera hadir"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Dimensi {label} tidak cocok dengan aset ini. Pilih gambar lain atau unggah gambar statis yang bisa kamu pangkas."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "Ukuran file {label} terlalu besar. Pilih file yang lebih kecil dari {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "Gambar {label} tidak dapat dianimasikan. Gunakan gambar statis."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Berbagi aktivitas"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Ambang aktivitas"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Izinkan {everyoneMention} dan {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Izinkan {PRODUCT_NAME} mengakses kameramu di {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Izinkan {PRODUCT_NAME} mengakses mikrofonmu di {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Izinkan {PRODUCT_NAME} mengakses mikrofonmu. Periksa bilah alamat atau pengaturan browsermu."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Izinkan anggota tanpa izin {readMessageHistoryPermissionLabel} untuk mel
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Izinkan sebutan untuk peran ini"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Izinkan mikrofon"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "dan {remainingCount} lainnya"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Animasikan saat interaksi"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "File {AVIF_FORMAT_LABEL} animasi tidak didukung. Unggah file {AVIF_FORMAT_LABEL} statis sebagai gantinya."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "{avifFormatLabel} animasi tidak didukung"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Avatar animasi ({ANIMATED_AVATAR_FORMATS}) hanya tersedia untuk pelanggan {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Avatar animasi ({ANIMATED_AVATAR_FORMATS}) tidak tersedia di instance ini. Unggah gambar statis sebagai gantinya."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Avatar animasi ({animatedAvatarFormats}) memerlukan {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Avatar & banner profil animasi"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Avatar animasi tidak tersedia"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Avatar animasi memerlukan {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Pratinjau gambar animasi"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Gambar animasi tidak didukung untuk aset ini."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Deteksi bahasa otomatis"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Ambang aktivitas otomatis"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Tersedia di aplikasi desktop."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Ukuran file avatar terlalu besar. Pilih file yang lebih kecil dari {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "Avatar terlalu besar. Pilih yang ukurannya di bawah {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Pilih mode avatar"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Sedang tidak di tempat"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Pengguna yang diblokir"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Banner"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Ukuran file banner terlalu besar. Pilih file yang lebih kecil dari {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Pilihan mode banner"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Beli hadiah {premiumProductName} dari tab {premiumProductName} untuk dib
|
||||
msgid "Buy gift"
|
||||
msgstr "Beli hadiah"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Dengan membuat komunitas, kamu setuju untuk mengikuti dan menjunjung tinggi <0>panduan komunitas {PRODUCT_NAME}</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Tidak bisa mengunggah file di sini"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Tengah"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Ganti avatar"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Ganti latar belakang"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Ganti banner"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Ubah nama panggilan grup"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Ubah ikon"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Klaim hadiah"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Klaim akunmu"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "Komunitas ini memfasilitasi perundungan beramai-ramai atau pelecehan yan
|
||||
msgid "Community filter"
|
||||
msgstr "Filter komunitas"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Ikon komunitas"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Tombol kotak pesan"
|
||||
msgid "Composer focus"
|
||||
msgstr "Fokus kotak pesan"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Mengompres"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Hubungkan kamera atau perangkat perekam virtual, lalu coba lagi."
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Sambungkan layar, lalu coba lagi."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Sambungkan mikrofon dan coba lagi."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Tidak dapat membuat stiker ini"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Tidak dapat memotong gambar"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Tidak dapat memperbarui berbagi aktivitas suara sekarang"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Tidak dapat mengunggah avatar"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Tidak dapat mengunggah banner"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Buat & bagikan"
|
||||
msgid "Create a community"
|
||||
msgstr "Buat komunitas"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Buat komunitas tempat kamu dan teman-temanmu bisa mengobrol."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Pangkas latar belakang undangan"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Pratinjau pangkasan"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Pangkas banner profil"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "Gambar yang dipotong terlalu besar. Pilih area yang lebih kecil atau file yang lebih kecil (maks. {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Pemotongan file {formatLabel} animasi belum didukung. Gambar asli akan digunakan."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Pemotongan file {formatLabel} animasi belum didukung. Unggahan asli akan digunakan."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Pemotongan file animasi belum didukung. Gambar asli akan digunakan."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Pemotongan file animasi belum didukung. Unggahan asli akan digunakan."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Memotong {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Belum punya akun?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Jangan tampilkan"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Avatar DM grup menggunakan topeng status yang sama dengan avatar biasa,
|
||||
msgid "Group DMs"
|
||||
msgstr "DM grup"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Ikon grup"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Pengaturan grup"
|
||||
msgid "Group typing states"
|
||||
msgstr "Status mengetik grup"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Grup diperbarui"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Hati"
|
||||
msgid "Hebrew"
|
||||
msgstr "Ibrani"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Tinggi"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Gambar disalin ke papan klip"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Gambar tidak dapat digunakan"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Tampilan dan nuansa"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Sepertinya kamu menggunakan {0}. Menumpuk pemrosesan {PRODUCT_NAME} di atasnya dapat menyebabkan pumping atau distorsi. Input langsung meneruskan audiomu tanpa perubahan."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Tidak ada yang cocok"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Belum ada sebutan"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Tidak ada mikrofon yang ditemukan"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Buka DM sistem"
|
||||
msgid "Open system picker"
|
||||
msgstr "Buka pemilih sistem"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Buka JSON template"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Buka dialog blokir untuk komunitas ini."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Buka menu konteks"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Buka tautan di bawah di browsermu, lalu salin seluruh respons JSON dan tempelkan ke kolom."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "7 hari terakhir"
|
||||
msgid "Paste"
|
||||
msgstr "Tempel"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Tempel URL template {theOtherPlatform} untuk mengimpor strukturnya ke komunitas baru."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Jenis premium"
|
||||
msgid "Premium until date"
|
||||
msgstr "Premium hingga tanggal"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Mempersiapkan"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Profil"
|
||||
msgid "Profile badge"
|
||||
msgstr "Lencana profil"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "Banner profil adalah fitur {PREMIUM_PRODUCT_NAME}. Dapatkan {PREMIUM_PRODUCT_NAME} untuk menambahkan banner ke profilmu."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "Banner profil tidak diaktifkan di instance ini."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "Banner profil memerlukan {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "Banner profil memerlukan {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Push-to-talk"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Push-to-talk (terbatas)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "Push-to-talk diabaikan dalam input langsung. Beralih ke suara terfokus atau kustom untuk menggunakannya."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Hapus lampiran"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Hapus aplikasi autentikator"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Hapus avatar"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Hapus avatar"
|
||||
msgid "Remove background"
|
||||
msgstr "Hapus latar belakang"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Hapus banner"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Jangan tetap di atas"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Hapus dari GIF favorit khusus URL"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Hapus ikon"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Dikirim ulang"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Setel ulang"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Rumania"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Putar searah jarum jam"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Saturasi"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Kontrol encoder berbagi layar"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Berbagi layar berakhir"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Tampilkan lencana merah di ikon aplikasi saat ada pesan yang belum dibaca"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Tampilkan warna aksen saja, abaikan profil globalmu"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Tampilkan emoji kustom di pelengkapan otomatis ekspresi"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Tampilkan avatar default, abaikan profil globalmu"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Tampilkan indikator belum dibaca di saluran yang dibisukan"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Tampilkan avatar profil globalmu di komunitas ini"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Tampilkan banner profil globalmu di komunitas ini"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Lewati"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Lewati konfirmasi \"Tandai semua sudah dibaca\""
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Lewati pemotongan"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Beralih ke tata letak nyaman"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Beralih ke tata letak rapat"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Beralih ke input langsung"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Tugas"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Memindahkanmu ke wilayah suara lain..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Template"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "Peran tersebut memberikan {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "Sumber berbagi layar berhenti mengirim video, jadi berbagi layarmu dihentikan."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Akun ini tidak dapat diblokir."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Tindakan ini tidak dapat dibatalkan. Semua data terkait, termasuk pengguna bot, akan dihapus secara permanen."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Animasi ini terlalu panjang atau terlalu besar untuk dipotong. Coba file yang lebih pendek atau lebih kecil."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Bot ini tidak publik dan tidak dapat ditambahkan oleh pengguna lain."
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Bot ini meminta izin administrator. Berikan izin hanya jika kamu sepenuhnya memercayai pengembangnya. Minta mereka untuk meminta lebih sedikit izin. Tutup halaman ini jika tidak yakin."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Peramban ini tidak dapat memotong file {avifFormatLabel} animasi. Unggah GIF atau WebP sebagai gantinya."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Konsol browser ini adalah alat pengembang."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "Peramban ini mematikan WebAssembly, sehingga gambar animasi tidak dapat dipotong."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Grup ini penuh. Keluarkan seseorang sebelum menambahkan orang lain."
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Kode serah terima ini sudah kedaluwarsa. Buat yang baru untuk melanjutkan."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Gambar ini tidak dapat dibaca. Mungkin rusak."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Unggah"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Unggah avatar khusus untuk komunitas ini"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Unggah banner khusus untuk komunitas ini"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Unggah file dan media dalam pesan."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Unggah file dan media di saluran ini."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Unggah ikon"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Gunakan tema batu bara (permukaan hitam pekat)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Gunakan gambar khusus"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Gunakan filter atau masukkan kata kunci untuk menemukan pesan"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Gunakan profil global"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Peserta obrolan suara"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Pemrosesan suara"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "Dengan {PREMIUM_PRODUCT_NAME}, kamu bisa memakai avatar animasi ({ANIMATED_AVATAR_FORMATS}) dan banner profil, menyesuaikan tag-mu, dan membuka banyak keuntungan {PREMIUM_PRODUCT_NAME} lainnya."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Kamu memerlukan izin \"{permissionLabel}\" untuk menggunakan emoji dari
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Kamu memerlukan izin \"{permissionLabel}\" untuk menggunakan stiker dari komunitas lain di sini."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Kamu perlu mengklaim akunmu sebelum bisa membuat komunitas."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Kamu perlu mengklaim akunmu untuk mengirim pesan di komunitas ini."
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Kamu perlu memverifikasi nomor telepon untuk mengirim pesan di komunitas ini."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Kamu perlu memverifikasi alamat emailmu sebelum bisa membuat komunitas."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "Kualitas {savedResolution} yang tersimpan pada {savedFrameRate} FPS memerlukan {premiumProductName}, jadi berbagi menggunakan {resolution} pada {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "Berbagi layarmu tidak dapat dipublikasikan dengan codec video yang kompatibel, jadi dihentikan. Coba bagikan lagi."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "URL kustommu telah diatur ke {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Encoder videomu berhenti mengenkode frame, jadi berbagi layarmu dihentikan. Coba bagikan lagi."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zoom"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}, presto disponibile"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "Le dimensioni di {label} non corrispondono a questa risorsa. Scegli un’altra immagine o carica un’immagine statica che puoi ritagliare."
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "Il file {label} è troppo grande. Scegli un file più piccolo di {maxSizeLabel}."
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "Le immagini {label} non possono essere animate. Usa un'immagine statica."
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "Condivisione attività"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "Soglia attività"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "Consenti {everyoneMention} e {hereMention}"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "Consenti a {PRODUCT_NAME} di accedere alla tua fotocamera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "Consenti a {PRODUCT_NAME} di accedere al microfono in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "Consenti a {PRODUCT_NAME} di accedere al microfono. Controlla la barra degli indirizzi o le impostazioni del browser."
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "Consenti ai membri senza il permesso {readMessageHistoryPermissionLabel}
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "Consenti menzioni per questo ruolo"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "Consenti accesso al microfono"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "e altri {remainingCount}"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "Anima all'interazione"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "I file {AVIF_FORMAT_LABEL} animati non sono supportati. Carica invece un file {AVIF_FORMAT_LABEL} statico."
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "{avifFormatLabel} animato non supportato"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "Gli avatar animati ({ANIMATED_AVATAR_FORMATS}) sono disponibili esclusivamente per gli abbonati a {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "Gli avatar animati ({ANIMATED_AVATAR_FORMATS}) non sono disponibili su questa istanza. Carica invece un'immagine statica."
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "Gli avatar animati ({animatedAvatarFormats}) richiedono {premiumProductName}."
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "Avatar animati e banner del profilo"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "Avatar animati non disponibili"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "Gli avatar animati richiedono {premiumProductName}"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "Anteprima immagine animata"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "Le immagini animate non sono supportate per questa risorsa."
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "Rileva lingua automaticamente"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "Soglia attività automatica"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "Disponibile nell'app desktop."
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "Avatar"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Il file dell'avatar è troppo grande. Scegli un file più piccolo di {imageMaxSizeLabel}."
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "L'avatar è troppo grande: scegline uno inferiore a {imageMaxSizeLabel}."
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "Selezione modalità avatar"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "Assente in questo momento"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "Utenti bannati"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "Banner"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "Il file del banner è troppo grande. Scegli un file più piccolo di {imageMaxSizeLabel}."
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "Selezione modalità banner"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "Acquista un regalo {premiumProductName} dalla scheda {premiumProductName
|
||||
msgid "Buy gift"
|
||||
msgstr "Acquista regalo"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "Creando una community, accetti di seguire e far rispettare le <0>linee guida della community di {PRODUCT_NAME}</0>."
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "Impossibile caricare file qui"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "Centrato"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "Cambia avatar"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "Cambia sfondo"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "Cambia banner"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "Cambia soprannome del gruppo"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "Cambia icona"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "Riscatta regalo"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "Completa la registrazione del tuo account"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "La community facilita attacchi di gruppo o abusi mirati."
|
||||
msgid "Community filter"
|
||||
msgstr "Filtro community"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "Icona della community"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "Pulsanti della barra di scrittura"
|
||||
msgid "Composer focus"
|
||||
msgstr "Focus del campo di composizione"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "Compressione"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "Collega una fotocamera o un dispositivo di acquisizione virtuale, quindi
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "Collega un display, poi riprova."
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "Connetti un microfono e riprova."
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "Impossibile creare questo sticker"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "Impossibile ritagliare l'immagine"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "Impossibile aggiornare la condivisione dell'attività vocale in questo momento"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "Impossibile caricare l'avatar"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "Impossibile caricare il banner"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "Crea e condividi"
|
||||
msgid "Create a community"
|
||||
msgstr "Crea una community"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "Crea una community per chattare con i tuoi amici."
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "Ritaglia sfondo invito"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "Anteprima ritaglio"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "Ritaglia banner del profilo"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "L'immagine ritagliata è troppo grande. Scegli un'area più piccola o un file più piccolo (max {maxSizeLabel})."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "Il ritaglio dei file {formatLabel} animati non è ancora supportato. Verrà usata l'immagine originale."
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "Il ritaglio dei file {formatLabel} animati non è ancora supportato. Verrà usato il file originale."
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "Il ritaglio dei file animati non è ancora supportato. Verrà usata l'immagine originale."
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "Il ritaglio di file animati non è ancora supportato. Verrà usato il file originale."
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "Ritagliando il {percent}%"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "Non hai un account?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "Non mostrare"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "Gli avatar dei DM di gruppo usano le stesse maschere di stato degli avat
|
||||
msgid "Group DMs"
|
||||
msgstr "DM di gruppo"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "Icona gruppo"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "Impostazioni gruppo"
|
||||
msgid "Group typing states"
|
||||
msgstr "Stati di digitazione del gruppo"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "Gruppo aggiornato"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "Cuore"
|
||||
msgid "Hebrew"
|
||||
msgstr "Ebraico"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "Altezza"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "Immagine copiata negli appunti"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "Immagine non utilizzabile"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "Aspetto"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "Sembra che tu stia usando {0}. L'elaborazione di {PRODUCT_NAME} in aggiunta può causare pumping o distorsione. L'input diretto lascia il tuo audio inalterato."
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "Nessun risultato"
|
||||
msgid "No mentions yet"
|
||||
msgstr "Nessuna menzione ancora"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "Nessun microfono trovato"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "Apri DM di sistema"
|
||||
msgid "Open system picker"
|
||||
msgstr "Apri selettore di sistema"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "Apri il JSON del modello"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "Apri la finestra di dialogo del ban per questa community."
|
||||
msgid "Open the context menu"
|
||||
msgstr "Apri il menu contestuale"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "Apri il link qui sotto nel tuo browser, poi copia l'intera risposta JSON e incollala nella casella."
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "Ultimi 7 giorni"
|
||||
msgid "Paste"
|
||||
msgstr "Incolla"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "Incolla l’URL di un modello di {theOtherPlatform} per importarne la struttura in una nuova community."
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "Tipo di Premium"
|
||||
msgid "Premium until date"
|
||||
msgstr "Premium fino al"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "Preparazione"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "Profilo"
|
||||
msgid "Profile badge"
|
||||
msgstr "Badge del profilo"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "I banner del profilo sono una funzionalità di {PREMIUM_PRODUCT_NAME}. Ottieni {PREMIUM_PRODUCT_NAME} per aggiungere un banner al tuo profilo."
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "I banner del profilo non sono abilitati su questa istanza."
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "I banner del profilo richiedono {premiumProductName}"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "I banner del profilo richiedono {premiumProductName}."
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "Push-to-talk"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "Premi per parlare (limitato)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "Il push-to-talk viene ignorato in modalità \"Input diretto\". Passa a \"Voce isolata\" o \"Personalizzato\" per usarlo."
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "Rimuovi allegato"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "Rimuovi app di autenticazione"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "Rimuovi immagine del profilo"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "Rimuovi immagine del profilo"
|
||||
msgid "Remove background"
|
||||
msgstr "Rimuovi sfondo"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "Rimuovi banner"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "Disattiva sempre in primo piano"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "Rimuovi dalle GIF preferite salvate solo tramite URL"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "Rimuovi icona"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "Inviato di nuovo"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "Reimposta"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "Rumeno"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "Ruota in senso orario"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "Saturazione"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "Controlli dell'encoder per la condivisione dello schermo"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "Condivisione schermo terminata"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "Mostra un badge rosso sull'icona dell'app quando hai messaggi non letti"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "Mostra solo il colore accento, ignorando il tuo profilo globale"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "Mostra emoji personalizzate nel completamento automatico delle espressioni"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "Mostra l'avatar predefinito, ignorando il tuo profilo globale"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "Mostra indicatore messaggi non letti nei canali silenziati"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "Mostra il tuo avatar del profilo globale in questa community"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "Mostra il banner del tuo profilo globale in questa community"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "Salta"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "Salta la conferma di \"Segna tutti come letti\""
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "Salta ritaglio"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "Passa al layout ampio"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "Passa al layout compatto"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "Passa all'input diretto"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "Attività"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "Teletrasporto in corso in un'altra regione vocale..."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "Modello"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "Il ruolo concedeva {permissions}"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "La sorgente della condivisione dello schermo ha smesso di inviare video, quindi la condivisione dello schermo è stata interrotta."
|
||||
@@ -33453,6 +33439,11 @@ msgstr "Questo account non può essere bloccato."
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "Questa azione non può essere annullata. Tutti i dati associati, incluso l'utente bot, verranno eliminati definitivamente."
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "Questa animazione è troppo lunga o troppo grande per essere ritagliata. Prova un file più corto o più piccolo."
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "Questo bot non è pubblico e non può essere aggiunto da altri utenti."
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "Questo bot richiede i permessi di amministratore. Concedili solo se ti fidi completamente dello sviluppatore. Chiedigli invece di richiedere meno permessi. Chiudi questa pagina se non sei sicuro."
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "Questo browser non può ritagliare file animati {avifFormatLabel}. Carica invece una GIF o WebP."
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "Questa console del browser è uno strumento per sviluppatori."
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "Il tuo browser ha disattivato WebAssembly, quindi le immagini animate non possono essere ritagliate."
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "Questo gruppo è al completo. Rimuovi qualcuno prima di aggiungere altre
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "Questo codice di trasferimento è scaduto. Generane uno nuovo per continuare."
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "Impossibile leggere questa immagine. Potrebbe essere danneggiata."
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "Carica"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "Carica un avatar personalizzato per questa community"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "Carica un banner personalizzato per questa community"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "Carica file e media nei messaggi."
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "Carica file e contenuti multimediali in questo canale."
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "Carica icona"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "Usa tema carbone (superfici nero pece)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "Usa immagine personalizzata"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "Usa i filtri o inserisci le parole chiave per trovare i messaggi"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "Usa profilo globale"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "Partecipanti alla chat vocale"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "Elaborazione voce"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "Wisconsin"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "Con {PREMIUM_PRODUCT_NAME}, puoi utilizzare avatar animati ({ANIMATED_AVATAR_FORMATS}), banner del profilo, personalizzare il tuo tag e sbloccare molti altri vantaggi {PREMIUM_PRODUCT_NAME}."
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "Per usare le emoji di altre community qui, ti serve l'autorizzazione \"{
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "Per usare gli sticker di altre community qui, ti serve il permesso \"{permissionLabel}\"."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "Devi completare la registrazione del tuo account prima di poter creare una community."
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "Devi completare la registrazione del tuo account per inviare messaggi in
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "Devi verificare un numero di telefono per inviare messaggi in questa community."
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "Devi verificare il tuo indirizzo email prima di poter creare una community."
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "La tua impostazione salvata {savedResolution} a {savedFrameRate} FPS richiede {premiumProductName}, quindi le condivisioni usano {resolution} a {frameRate} FPS."
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "La condivisione dello schermo non è stata pubblicata con un codec video compatibile, quindi è stata interrotta. Riprova a condividere."
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "L'URL personalizzato è stato impostato su {inviteEndpoint}/{vanitySlug}"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "Il tuo codificatore video ha smesso di codificare i frame, quindi la condivisione dello schermo è stata interrotta. Riprova a condividere."
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "Zoom"
|
||||
|
||||
@@ -1405,18 +1405,13 @@ msgstr "{itemLabel}、近日公開"
|
||||
msgid "{kilobits} kbps"
|
||||
msgstr "{kilobits} kbps"
|
||||
|
||||
#. Error modal body shown when a non-croppable community image has dimensions that do not fit the target asset. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:72
|
||||
msgid "{label} dimensions do not match this asset. Choose a different image or upload a static image you can crop."
|
||||
msgstr "「{label}」の寸法がこのアセットと一致しません。別の画像を選択するか、切り抜き可能な静止画像をアップロードしてください。"
|
||||
|
||||
#. Error modal body shown when a community image upload exceeds the size limit. {label} names the image field and {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:44
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:33
|
||||
msgid "{label} file is too large. Choose a file smaller than {maxSizeLabel}."
|
||||
msgstr "「{label}」のファイルサイズが大きすぎます。{maxSizeLabel}より小さいファイルを選択してください。"
|
||||
|
||||
#. Error modal body shown when a community image field does not allow animation. {label} names the image field.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:49
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:38
|
||||
msgid "{label} images cannot be animated. Use a static image."
|
||||
msgstr "「{label}」の画像はアニメーションにできません。静止画像を使用してください。"
|
||||
|
||||
@@ -2829,7 +2824,7 @@ msgid "Activity sharing"
|
||||
msgstr "アクティビティの共有"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:478
|
||||
#: src/features/user/components/settings_utils/section_registry/VoiceVideoSections.ts:102
|
||||
msgid "Activity threshold"
|
||||
msgstr "アクティビティしきい値"
|
||||
@@ -3566,11 +3561,11 @@ msgstr "{everyoneMention}と{hereMention}を許可する"
|
||||
msgid "Allow {PRODUCT_NAME} to access your camera in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME}."
|
||||
msgstr "{MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_CAMERA_PERMISSION_NAME} で、{PRODUCT_NAME}がカメラにアクセスすることを許可してください。"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:533
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:535
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone in {MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}."
|
||||
msgstr "{PRODUCT_NAME}がマイクにアクセスできるようにするには、{MACOS_SYSTEM_SETTINGS_NAME} → {MACOS_PRIVACY_AND_SECURITY_SETTINGS_NAME} → {MACOS_MICROPHONE_PERMISSION_NAME}で設定してください。"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:538
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:540
|
||||
msgid "Allow {PRODUCT_NAME} to access your microphone. Check your browser's address bar or settings."
|
||||
msgstr "{PRODUCT_NAME}がマイクにアクセスすることを許可してください。ブラウザのアドレスバーまたは設定を確認してください。"
|
||||
|
||||
@@ -3673,7 +3668,7 @@ msgstr "「{readMessageHistoryPermissionLabel}」権限がないメンバーが
|
||||
msgid "Allow mentions for this role"
|
||||
msgstr "このロールへのメンションを許可"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:558
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:560
|
||||
msgid "Allow microphone"
|
||||
msgstr "マイクを許可"
|
||||
|
||||
@@ -3942,25 +3937,21 @@ msgstr "他{remainingCount}件"
|
||||
msgid "Animate on interaction"
|
||||
msgstr "操作時にアニメーション"
|
||||
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:26
|
||||
msgid "Animated {AVIF_FORMAT_LABEL} files aren't supported. Upload a static {AVIF_FORMAT_LABEL} file instead."
|
||||
msgstr "アニメーション{AVIF_FORMAT_LABEL}ファイルはサポートされていません。代わりに静止{AVIF_FORMAT_LABEL}ファイルをアップロードしてください。"
|
||||
|
||||
#. Modal title shown when an animated AVIF upload is rejected by the client.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:11
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:10
|
||||
msgid "Animated {avifFormatLabel} not supported"
|
||||
msgstr "アニメーション{avifFormatLabel}はサポートされていません"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:206
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:192
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are exclusively available to {PREMIUM_PRODUCT_NAME} subscribers."
|
||||
msgstr "アニメーションアバター({ANIMATED_AVATAR_FORMATS})は{PREMIUM_PRODUCT_NAME}の加入者のみが利用できます。"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:240
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:226
|
||||
msgid "Animated avatars ({ANIMATED_AVATAR_FORMATS}) are not available on this instance. Upload a static image instead."
|
||||
msgstr "このインスタンスでは、アニメーションアバター({ANIMATED_AVATAR_FORMATS})は利用できません。代わりに静止画像をアップロードしてください。"
|
||||
|
||||
#. Extra note in the avatar asset upload source modal. Preserve {animatedAvatarFormats} and {premiumProductName}; they are inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:115
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:102
|
||||
msgid "Animated avatars ({animatedAvatarFormats}) require {premiumProductName}."
|
||||
msgstr "アニメーションアバター({animatedAvatarFormats})には、{premiumProductName}が必要です。"
|
||||
|
||||
@@ -3970,12 +3961,12 @@ msgid "Animated avatars & profile banners"
|
||||
msgstr "アニメーションアバターとプロフィールバナー"
|
||||
|
||||
#. Error message in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:91
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
msgid "Animated avatars not available"
|
||||
msgstr "アニメーションアバターは利用できません"
|
||||
|
||||
#. Label in the avatar uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:81
|
||||
msgid "Animated avatars require {premiumProductName}"
|
||||
msgstr "アニメーションアバターには{premiumProductName}が必要です"
|
||||
|
||||
@@ -4046,7 +4037,7 @@ msgid "Animated image preview"
|
||||
msgstr "アニメーション画像のプレビュー"
|
||||
|
||||
#. Confirmation modal body shown before using a non-croppable animated community image.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:54
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:43
|
||||
msgid "Animated images are not supported for this asset."
|
||||
msgstr "このアセットではアニメーション画像はサポートされていません。"
|
||||
|
||||
@@ -4947,7 +4938,7 @@ msgstr "言語を自動検出"
|
||||
|
||||
#. Short label in the voice tab. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:116
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:452
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:465
|
||||
msgid "Auto-set activity threshold"
|
||||
msgstr "アクティビティしきい値を自動設定"
|
||||
|
||||
@@ -5127,15 +5118,15 @@ msgstr "デスクトップアプリで利用できます。"
|
||||
#. Form label for a webhook avatar image.
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/ui/components/BaseAvatar.tsx:18
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:373
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:421
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:345
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:393
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:13
|
||||
#: src/features/webhook/components/WebhookListItem.tsx:252
|
||||
msgid "Avatar"
|
||||
msgstr "アバター"
|
||||
|
||||
#. Error message in the avatar uploader. Preserve {imageMaxSizeLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:82
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:77
|
||||
msgid "Avatar file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "アバターファイルが大きすぎます。{imageMaxSizeLabel}より小さいファイルを選択してください。"
|
||||
|
||||
@@ -5145,7 +5136,7 @@ msgid "Avatar is too large — pick one under {imageMaxSizeLabel}."
|
||||
msgstr "アバターが大きすぎます。{imageMaxSizeLabel}以下の画像を選択してください。"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:103
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:90
|
||||
msgid "Avatar mode selection"
|
||||
msgstr "アバターモード選択"
|
||||
|
||||
@@ -5187,11 +5178,11 @@ msgstr "現在離席中"
|
||||
#: src/features/auth/flow/IpAuthorizationScreen.tsx:155
|
||||
#: src/features/channel/components/channel_header/shared.ts:27
|
||||
#: src/features/connection/components/modals/AddConnectionModal.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:165
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:164
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildJoinForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:356
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:377
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:397
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:355
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:376
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:396
|
||||
#: src/features/moderation/components/report_modal/IARModal.tsx:86
|
||||
#: src/features/moderation/components/report/ReportStepDetails.tsx:312
|
||||
#: src/features/user/components/modals/PhoneAddModal.tsx:420
|
||||
@@ -5428,19 +5419,19 @@ msgstr "BANしたユーザー"
|
||||
#. Settings search entry label. Also used as a search synonym in the settings search bar.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:28
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:125
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:280
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:330
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:292
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/settings_utils/search_index/MyProfileIndex.ts:37
|
||||
msgid "Banner"
|
||||
msgstr "バナー"
|
||||
|
||||
#. Error message in the banner uploader. Preserve {imageMaxSizeLabel}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:81
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:84
|
||||
msgid "Banner file is too large. Choose a file smaller than {imageMaxSizeLabel}."
|
||||
msgstr "バナーファイルが大きすぎます。{imageMaxSizeLabel}より小さいファイルを選択してください。"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:86
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:89
|
||||
msgid "Banner mode selection"
|
||||
msgstr "バナーモード選択"
|
||||
|
||||
@@ -6107,8 +6098,8 @@ msgstr "{premiumProductName}タブから{premiumProductName}ギフトを購入
|
||||
msgid "Buy gift"
|
||||
msgstr "ギフトを購入"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:339
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:655
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:338
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:654
|
||||
msgid "By creating a community, you agree to follow and uphold the <0>{PRODUCT_NAME} community guidelines</0>."
|
||||
msgstr "コミュニティを作成すると、<0>{PRODUCT_NAME}のコミュニティガイドライン</0>に従い、これを守ることに同意したことになります。"
|
||||
|
||||
@@ -6361,7 +6352,7 @@ msgstr "ここにファイルをアップロードできません"
|
||||
#: src/features/messaging/components/modals/EditAltTextModal.tsx:190
|
||||
#: src/features/messaging/components/modals/ExternalLinkWarningModal.tsx:111
|
||||
#: src/features/messaging/components/modals/ForwardModal.tsx:650
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:944
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1025
|
||||
#: src/features/messaging/components/modals/MessageHistoryThresholdModal.tsx:107
|
||||
#: src/features/moderation/components/modals/BanMemberModal.tsx:262
|
||||
#: src/features/moderation/components/modals/RemoveTimeoutModal.tsx:70
|
||||
@@ -6614,9 +6605,9 @@ msgid "Centered"
|
||||
msgstr "中央揃え"
|
||||
|
||||
#. Title of the modal where the user picks an avatar source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:111
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:395
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:431
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:98
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:367
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:403
|
||||
msgid "Change avatar"
|
||||
msgstr "アバターを変更"
|
||||
|
||||
@@ -6627,9 +6618,9 @@ msgstr "背景を変更"
|
||||
#. Title of the modal where the user picks a banner source (file upload or GIF provider). Keep it concise.
|
||||
#. Title of the modal where the user picks a community banner source (file upload or GIF provider). Keep it concise.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildBannerUploadField.tsx:43
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:94
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:303
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:342
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:97
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:315
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:354
|
||||
msgid "Change banner"
|
||||
msgstr "バナーを変更"
|
||||
|
||||
@@ -6668,13 +6659,13 @@ msgstr "グループニックネームを変更"
|
||||
#. Title of the modal where the user picks a group icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#. Title of the modal where the user picks an imported-template community icon source. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:88
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:85
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:63
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:86
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:35
|
||||
msgid "Change icon"
|
||||
msgstr "アイコンを変更"
|
||||
@@ -7669,8 +7660,8 @@ msgstr "ギフトを受け取る"
|
||||
#: src/features/auth/components/modals/ClaimAccountModal.tsx:41
|
||||
#: src/features/channel/components/direct_message/AddFriendForm.tsx:62
|
||||
#: src/features/channel/utils/CreateDMModalUtils.tsx:43
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:214
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:440
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:213
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:439
|
||||
#: src/features/user/components/modals/tabs/GiftInventoryTab.tsx:343
|
||||
msgid "Claim your account"
|
||||
msgstr "アカウントを登録"
|
||||
@@ -8518,8 +8509,8 @@ msgstr "集団攻撃や標的型嫌がらせを助長しているコミュニテ
|
||||
msgid "Community filter"
|
||||
msgstr "コミュニティフィルター"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:272
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:593
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:271
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:592
|
||||
msgid "Community icon"
|
||||
msgstr "コミュニティアイコン"
|
||||
|
||||
@@ -8763,6 +8754,11 @@ msgstr "入力欄ボタン"
|
||||
msgid "Composer focus"
|
||||
msgstr "入力欄のフォーカス"
|
||||
|
||||
#. Progress label on the save button while a cropped animated image is compressed. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:67
|
||||
msgid "Compressing"
|
||||
msgstr "圧縮中"
|
||||
|
||||
#. Button label that opens a dedicated advanced settings modal for configuring screen-share encoder controls.
|
||||
#. Button label that opens a dedicated advanced settings modal.
|
||||
#: src/features/user/components/modals/tabs/advanced_settings_tab/AdvancedChatControls.tsx:164
|
||||
@@ -8917,7 +8913,7 @@ msgstr "カメラまたは仮想キャプチャデバイスを接続してから
|
||||
msgid "Connect a display, then try again."
|
||||
msgstr "ディスプレイを接続してから、もう一度お試しください。"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:543
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:545
|
||||
msgid "Connect a microphone and try again."
|
||||
msgstr "マイクを接続して、もう一度お試しください。"
|
||||
|
||||
@@ -9783,7 +9779,7 @@ msgid "Couldn't create this sticker"
|
||||
msgstr "スタンプを作成できませんでした"
|
||||
|
||||
#. Title of the error modal shown when image cropping fails.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
msgid "Couldn't crop image"
|
||||
msgstr "画像の切り抜きに失敗しました"
|
||||
|
||||
@@ -10159,12 +10155,12 @@ msgid "Couldn't update voice activity sharing right now"
|
||||
msgstr "現在、音声アクティビティの共有を更新できませんでした"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile avatar fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:107
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:94
|
||||
msgid "Couldn't upload avatar"
|
||||
msgstr "アバターをアップロードできませんでした"
|
||||
|
||||
#. Title of the error modal shown when uploading a profile banner fails.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:90
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:93
|
||||
msgid "Couldn't upload banner"
|
||||
msgstr "バナーをアップロードできませんでした"
|
||||
|
||||
@@ -10230,7 +10226,7 @@ msgstr "作成・シェア"
|
||||
msgid "Create a community"
|
||||
msgstr "コミュニティを作成"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:257
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:256
|
||||
msgid "Create a community for you and your friends to chat."
|
||||
msgstr "友達とチャットするためのコミュニティを作成しましょう。"
|
||||
|
||||
@@ -10489,7 +10485,7 @@ msgid "Crop invite background"
|
||||
msgstr "招待背景を切り抜き"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:20
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
msgid "Crop preview"
|
||||
msgstr "プレビューを切り抜き"
|
||||
|
||||
@@ -10500,30 +10496,15 @@ msgstr "プロフィールバナーを切り抜き"
|
||||
|
||||
#. Error modal body shown when a cropped community image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#. Error modal body shown when a cropped image still exceeds the size limit. {maxSizeLabel} is a formatted file size.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:67
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:32
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:47
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:36
|
||||
msgid "Cropped image is too large. Choose a smaller area or a smaller file (max {maxSizeLabel})."
|
||||
msgstr "切り抜いた画像が大きすぎます。範囲を狭めるか、小さいファイルを選択してください(最大{maxSizeLabel})。"
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image without cropping. {formatLabel} is the image format name.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:58
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original image will be used."
|
||||
msgstr "アニメーション{formatLabel}ファイルはまだ切り抜きに対応していません。元の画像が使用されます。"
|
||||
|
||||
#. Description text in the avatar uploader. Preserve {formatLabel}; it is inserted by code.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:95
|
||||
msgid "Cropping animated {formatLabel} files isn't supported yet. The original upload will be used."
|
||||
msgstr "アニメーション{formatLabel}ファイルは、まだ切り抜きに対応していません。元のファイルが使用されます。"
|
||||
|
||||
#. Confirmation modal body shown before using an animated community image with an unknown format.
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:63
|
||||
msgid "Cropping animated files isn't supported yet. The original image will be used."
|
||||
msgstr "アニメーションファイルはまだ切り抜きに対応していません。元の画像が使用されます。"
|
||||
|
||||
#. Description text in the avatar uploader when the animated image format is unknown.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:99
|
||||
msgid "Cropping animated files isn't supported yet. The original upload will be used."
|
||||
msgstr "アニメーションファイルはまだ切り抜きに対応していません。アップロードした元のファイルが使用されます。"
|
||||
#. Progress label on the save button while animated image frames are cropped. {percent} is a whole number. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:62
|
||||
msgid "Cropping {percent}%"
|
||||
msgstr "{percent}%を切り抜き中"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:86
|
||||
@@ -12597,8 +12578,8 @@ msgstr "アカウントをお持ちでないですか?"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:74
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:60
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:69
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:63
|
||||
msgid "Don't show"
|
||||
msgstr "表示しない"
|
||||
|
||||
@@ -16560,8 +16541,8 @@ msgstr "グループDMのアバターは、通常のアバターと同じステ
|
||||
msgid "Group DMs"
|
||||
msgstr "グループDM"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:290
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:248
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:289
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:247
|
||||
msgid "Group icon"
|
||||
msgstr "グループアイコン"
|
||||
|
||||
@@ -16624,8 +16605,8 @@ msgstr "グループ設定"
|
||||
msgid "Group typing states"
|
||||
msgstr "グループの入力状況"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:232
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:223
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:231
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:222
|
||||
msgid "Group updated"
|
||||
msgstr "グループを更新しました"
|
||||
|
||||
@@ -16803,7 +16784,7 @@ msgstr "ハート"
|
||||
msgid "Hebrew"
|
||||
msgstr "ヘブライ語"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:872
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:958
|
||||
msgid "Height"
|
||||
msgstr "高さ"
|
||||
|
||||
@@ -17510,7 +17491,7 @@ msgstr "画像をクリップボードにコピーしました"
|
||||
#. Error modal title shown when a template-import community icon upload cannot be accepted or processed.
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:59
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:155
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:78
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/hooks/useGuildImageAssetField.tsx:52
|
||||
msgid "Image couldn't be used"
|
||||
msgstr "画像を使用できませんでした"
|
||||
|
||||
@@ -19671,7 +19652,7 @@ msgid "Look and feel"
|
||||
msgstr "見た目と操作感"
|
||||
|
||||
#. placeholder {0}: externalProcessor.name
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:652
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:654
|
||||
msgid "Looks like you're using {0}. Stacking {PRODUCT_NAME}'s processing on top can cause pumping or distortion. Direct input passes your audio through untouched."
|
||||
msgstr "{0}をお使いのようです。その上に{PRODUCT_NAME}の処理を重ねると、ポンピングや歪みが発生する可能性があります。ダイレクト入力では、オーディオはそのまま通過します。"
|
||||
|
||||
@@ -22577,7 +22558,7 @@ msgstr "一致する項目はありません"
|
||||
msgid "No mentions yet"
|
||||
msgstr "メンションはまだありません"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:528
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:530
|
||||
msgid "No microphone found"
|
||||
msgstr "マイクが見つかりません"
|
||||
|
||||
@@ -23806,7 +23787,7 @@ msgstr "システムDMを開く"
|
||||
msgid "Open system picker"
|
||||
msgstr "システムピッカーを開く"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:528
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:527
|
||||
msgid "Open template JSON"
|
||||
msgstr "テンプレートJSONを開く"
|
||||
|
||||
@@ -23820,7 +23801,7 @@ msgstr "このコミュニティのBANダイアログを開く。"
|
||||
msgid "Open the context menu"
|
||||
msgstr "コンテキストメニューを開く"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:511
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:510
|
||||
msgid "Open the link below in your browser, then copy the entire JSON response and paste it into the box."
|
||||
msgstr "以下のリンクをブラウザで開き、JSONレスポンス全体をコピーしてボックスに貼り付けてください。"
|
||||
|
||||
@@ -24331,7 +24312,7 @@ msgstr "過去7日間"
|
||||
msgid "Paste"
|
||||
msgstr "貼り付け"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:483
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:482
|
||||
msgid "Paste a {theOtherPlatform} template URL to import its structure into a new community."
|
||||
msgstr "構造を新しいコミュニティにインポートするには、{theOtherPlatform}のテンプレートURLを貼り付けてください。"
|
||||
|
||||
@@ -25191,6 +25172,11 @@ msgstr "プレミアムタイプ"
|
||||
msgid "Premium until date"
|
||||
msgstr "プレミアム有効期限"
|
||||
|
||||
#. Progress label on the save button while an animated image crop starts. Keep it concise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:58
|
||||
msgid "Preparing"
|
||||
msgstr "準備中"
|
||||
|
||||
#. Setup wizard title while the instance configuration loads.
|
||||
#: src/features/app/components/setup/SetupWizardSteps.tsx:72
|
||||
msgid "Preparing setup"
|
||||
@@ -25497,22 +25483,22 @@ msgstr "プロフィール"
|
||||
msgid "Profile badge"
|
||||
msgstr "プロフィールバッジ"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:163
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:166
|
||||
msgid "Profile banners are a {PREMIUM_PRODUCT_NAME} feature. Get {PREMIUM_PRODUCT_NAME} to add a banner to your profile."
|
||||
msgstr "プロフィールバナーは{PREMIUM_PRODUCT_NAME}機能です。{PREMIUM_PRODUCT_NAME}を利用して、プロフィールにバナーを追加しましょう。"
|
||||
|
||||
#. Profile banner uploader notice shown when the instance configuration disables profile banners.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:68
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:71
|
||||
msgid "Profile banners are not enabled on this instance."
|
||||
msgstr "このインスタンスではプロフィールバナーは有効になっていません。"
|
||||
|
||||
#. Label in the banner uploader. Preserve {premiumProductName}; it is inserted by code. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:76
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:79
|
||||
msgid "Profile banners require {premiumProductName}"
|
||||
msgstr "プロフィールバナーには{premiumProductName}が必要です"
|
||||
|
||||
#. Profile banner uploader notice shown when profile banners require premium.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:64
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:67
|
||||
msgid "Profile banners require {premiumProductName}."
|
||||
msgstr "プロフィールバナーには{premiumProductName}が必要です。"
|
||||
|
||||
@@ -25838,7 +25824,7 @@ msgstr "プッシュトゥトーク"
|
||||
msgid "Push-to-talk (limited)"
|
||||
msgstr "プッシュトゥトーク(制限あり)"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:674
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:681
|
||||
msgid "Push-to-talk is ignored in direct input. Switch to focused voice or custom to use it."
|
||||
msgstr "ダイレクト入力ではプッシュトゥトークは無視されます。使用するには「音声にフォーカス」または「カスタム」に切り替えてください。"
|
||||
|
||||
@@ -26551,8 +26537,8 @@ msgstr "添付ファイルを削除"
|
||||
msgid "Remove authenticator app"
|
||||
msgstr "認証アプリを削除"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:405
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:441
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:377
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:413
|
||||
msgid "Remove avatar"
|
||||
msgstr "アバターを削除"
|
||||
|
||||
@@ -26561,8 +26547,8 @@ msgstr "アバターを削除"
|
||||
msgid "Remove background"
|
||||
msgstr "背景を削除"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:314
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:353
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:326
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:365
|
||||
msgid "Remove banner"
|
||||
msgstr "バナーを削除"
|
||||
|
||||
@@ -26625,10 +26611,10 @@ msgstr "最前面表示を解除"
|
||||
msgid "Remove from URL-only GIF favorites"
|
||||
msgstr "URLのみで保存されたGIFをお気に入りから削除"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:338
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:293
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:314
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:635
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:337
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:292
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:313
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:634
|
||||
msgid "Remove icon"
|
||||
msgstr "アイコンを削除"
|
||||
|
||||
@@ -27331,7 +27317,7 @@ msgstr "再送しました"
|
||||
#: src/features/app/components/dialogs/shared/UnsavedChangesBannerContent.tsx:51
|
||||
#: src/features/app/components/floating/ColorPickerPopover.tsx:190
|
||||
#: src/features/input/components/KeybindRecorder.tsx:459
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:936
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1022
|
||||
msgid "Reset"
|
||||
msgstr "リセット"
|
||||
|
||||
@@ -28074,7 +28060,7 @@ msgstr "ルーマニア語"
|
||||
|
||||
#. Short label in the image crop modal. Keep it concise.
|
||||
#. Tooltip on the media viewer button that rotates the current media item 90 degrees clockwise.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:24
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:28
|
||||
#: src/features/messaging/components/modals/media_modal/shared.ts:93
|
||||
msgid "Rotate clockwise"
|
||||
msgstr "時計回りに回転"
|
||||
@@ -28153,8 +28139,8 @@ msgstr "彩度"
|
||||
#. Save button in the community-folder settings modal footer.
|
||||
#: src/features/app/components/dialogs/shared/MobileSettingsComponents.tsx:113
|
||||
#: src/features/auth/components/modals/PasskeyNameModal.tsx:87
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:367
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:323
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:366
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:322
|
||||
#: src/features/channel/components/modals/RenameChannelModal.tsx:28
|
||||
#: src/features/connection/components/modals/EditConnectionModal.tsx:108
|
||||
#: src/features/emoji/components/emojis/EmojiListItem.tsx:328
|
||||
@@ -28367,7 +28353,7 @@ msgid "Screen share encoder controls"
|
||||
msgstr "画面共有エンコーダー設定"
|
||||
|
||||
#. Title of a modal shown when an active screen share stops unexpectedly.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:120
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:119
|
||||
msgctxt "screen-share"
|
||||
msgid "Screen share ended"
|
||||
msgstr "画面共有が終了しました"
|
||||
@@ -30035,7 +30021,7 @@ msgid "Show a red badge on the app icon when you have unread messages"
|
||||
msgstr "未読メッセージがあるときにアプリアイコンに赤いバッジを表示"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:72
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:75
|
||||
msgid "Show accent color only, ignoring your global profile"
|
||||
msgstr "アクセントカラーのみを表示(グローバルプロフィールを無視)"
|
||||
|
||||
@@ -30104,7 +30090,7 @@ msgid "Show custom emojis in expression autocomplete"
|
||||
msgstr "エクスプレッションの入力候補にカスタム絵文字を表示"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:78
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:73
|
||||
msgid "Show default avatar, ignoring your global profile"
|
||||
msgstr "デフォルトのアバターを表示(グローバルプロフィールを無視)"
|
||||
|
||||
@@ -30443,12 +30429,12 @@ msgid "Show unread indicator on muted channels"
|
||||
msgstr "ミュート中のチャンネルに未読バッジを表示"
|
||||
|
||||
#. Label in the avatar uploader.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:62
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:57
|
||||
msgid "Show your global profile avatar in this community"
|
||||
msgstr "このコミュニティでグローバルプロフィールのアバターを表示"
|
||||
|
||||
#. Label in the banner uploader. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:48
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:51
|
||||
msgid "Show your global profile banner in this community"
|
||||
msgstr "このコミュニティでグローバルプロフィールのバナーを表示"
|
||||
|
||||
@@ -30720,7 +30706,7 @@ msgstr "スキップ"
|
||||
msgid "Skip \"Mark all as read\" confirmation"
|
||||
msgstr "「すべて既読にする」の確認をスキップ"
|
||||
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:953
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:1034
|
||||
msgid "Skip cropping"
|
||||
msgstr "トリミングをスキップ"
|
||||
|
||||
@@ -32346,7 +32332,7 @@ msgstr "ゆったり表示に切り替える"
|
||||
msgid "Switch to dense layout"
|
||||
msgstr "コンパクト表示に切り替える"
|
||||
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:647
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:649
|
||||
msgid "Switch to direct input"
|
||||
msgstr "直接入力に切り替える"
|
||||
|
||||
@@ -32734,7 +32720,7 @@ msgstr "タスク"
|
||||
msgid "Teleporting you to another voice region..."
|
||||
msgstr "別のボイスリージョンに転送しています…"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:560
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:559
|
||||
msgid "Template"
|
||||
msgstr "テンプレート"
|
||||
|
||||
@@ -33236,7 +33222,7 @@ msgid "The role granted {permissions}"
|
||||
msgstr "ロールは{permissions}を付与していました"
|
||||
|
||||
#. Body of a modal shown when a browser screen share track ends outside the app, for example from the browser sharing controls.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:125
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:124
|
||||
msgctxt "screen-share"
|
||||
msgid "The screen share source stopped sending video, so your screen share was stopped."
|
||||
msgstr "画面共有のソースがビデオの送信を停止したため、画面共有は停止されました。"
|
||||
@@ -33453,6 +33439,11 @@ msgstr "このアカウントをブロックすることはできません。"
|
||||
msgid "This action cannot be undone. All associated data, including the bot user, will be permanently deleted."
|
||||
msgstr "この操作は元に戻せません。ボットユーザーを含むすべての関連データが完全に削除されます。"
|
||||
|
||||
#. Error modal body shown when an animated image has too many frames or pixels to crop in the browser.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:41
|
||||
msgid "This animation is too long or too large to crop. Try a shorter or smaller file."
|
||||
msgstr "このアニメーションは長すぎるか、大きすぎるため、トリミングできません。より短く、またはより小さいファイルをお試しください。"
|
||||
|
||||
#. Short label in the authentication authorize flow. Keep the tone plain and specific.
|
||||
#: src/features/auth/components/pages/oauth_authorize_page/state/useAuthorizeFlow.ts:82
|
||||
msgid "This application"
|
||||
@@ -33472,11 +33463,23 @@ msgstr "このボットは公開されていません。他のユーザーが追
|
||||
msgid "This bot requests the administrator permission. Only grant it if you fully trust the developer. Ask them to request fewer permissions instead. Close this page if unsure."
|
||||
msgstr "このボットは管理者権限を要求しています。開発者を完全に信頼できる場合にのみ許可してください。代わりに、より少ない権限を要求するように依頼してください。不明な場合はこのページを閉じてください。"
|
||||
|
||||
#. Error modal body shown when the browser cannot decode animated AVIF for cropping. {avifFormatLabel} is the AVIF format name.
|
||||
#. Modal body shown when an animated AVIF upload is rejected because this browser cannot crop it.
|
||||
#: src/features/expressions/utils/AnimatedAvifModalUtils.tsx:14
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:49
|
||||
msgid "This browser can't crop animated {avifFormatLabel} files. Upload a GIF or WebP instead."
|
||||
msgstr "このブラウザでは、アニメーションの{avifFormatLabel}ファイルをクロップできません。代わりにGIFまたはWebPをアップロードしてください。"
|
||||
|
||||
#. Console warning line explaining that the browser console is meant for developers.
|
||||
#: src/features/devtools/utils/SelfXssNotice.ts:16
|
||||
msgid "This browser console is a developer tool."
|
||||
msgstr "このブラウザのコンソールは開発者ツールです。"
|
||||
|
||||
#. Error modal body shown when WebAssembly is unavailable, which animated image cropping needs.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:54
|
||||
msgid "This browser has WebAssembly turned off, so animated images can't be cropped."
|
||||
msgstr "このブラウザではWebAssemblyが無効になっているため、アニメーション画像を切り抜くことができません。"
|
||||
|
||||
#. Pre-join indicator shown beneath the Join button on a DM or group DM call where every connected participant supports E2EE.
|
||||
#: src/features/voice/utils/VoiceMessageDescriptors.ts:320
|
||||
msgid "This call is end-to-end encrypted."
|
||||
@@ -33758,6 +33761,11 @@ msgstr "このグループは満員です。メンバーを追加する前に、
|
||||
msgid "This handoff code has expired. Generate a new one to continue."
|
||||
msgstr "この引き継ぎコードは有効期限が切れました。新しいコードを生成して続行してください。"
|
||||
|
||||
#. Error modal body shown when an animated image fails to decode during cropping.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:45
|
||||
msgid "This image couldn't be read. It may be damaged."
|
||||
msgstr "この画像を読み込めませんでした。破損している可能性があります。"
|
||||
|
||||
#. Desktop updater modal body for managed package builds such as Flatpak. productName is the app name.
|
||||
#: src/features/updater/commands/UpdaterModalCommands.tsx:75
|
||||
msgid "This install is managed by your system. Update {productName} from your software center or package manager."
|
||||
@@ -36078,12 +36086,12 @@ msgid "Upload"
|
||||
msgstr "アップロード"
|
||||
|
||||
#. Button or menu action label in the avatar uploader. Keep it concise.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:70
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:65
|
||||
msgid "Upload a custom avatar for this community"
|
||||
msgstr "このコミュニティのカスタムアバターをアップロード"
|
||||
|
||||
#. Button or menu action label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:56
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:59
|
||||
msgid "Upload a custom banner for this community"
|
||||
msgstr "このコミュニティのカスタムバナーをアップロード"
|
||||
|
||||
@@ -36155,10 +36163,10 @@ msgstr "メッセージでファイルやメディアをアップロードしま
|
||||
msgid "Upload files and media in this channel."
|
||||
msgstr "このチャンネルにファイルやメディアをアップロードします。"
|
||||
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:329
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:284
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:305
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:626
|
||||
#: src/features/channel/components/modals/EditGroupBottomSheet.tsx:328
|
||||
#: src/features/channel/components/modals/EditGroupModal.tsx:283
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:304
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:625
|
||||
#: src/features/guild/components/modals/guild_tabs/guild_overview_tab/fields/GuildIconUploadField.tsx:130
|
||||
msgid "Upload icon"
|
||||
msgstr "アイコンをアップロード"
|
||||
@@ -36401,8 +36409,8 @@ msgstr "石炭テーマを使用(完全な黒)"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:66
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:52
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:61
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:55
|
||||
msgid "Use custom image"
|
||||
msgstr "カスタム画像を使用"
|
||||
|
||||
@@ -36462,8 +36470,8 @@ msgstr "フィルターまたはキーワードでメッセージを検索"
|
||||
|
||||
#. Short label in the avatar uploader. Keep it concise.
|
||||
#. Short label in the banner uploader. Keep it concise. Keep the tone plain and specific.
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:58
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:44
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:53
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/BannerUploader.tsx:47
|
||||
msgid "Use global profile"
|
||||
msgstr "グローバルプロフィールを使用"
|
||||
|
||||
@@ -37826,7 +37834,7 @@ msgid "Voice participants"
|
||||
msgstr "通話の参加者"
|
||||
|
||||
#. Voice settings radio group label for microphone processing profile.
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:642
|
||||
#: src/features/user/components/modals/tabs/UserVoiceTab.tsx:644
|
||||
#: src/features/voice/components/voice_connection_status/AudioProcessingModal.tsx:55
|
||||
msgid "Voice processing"
|
||||
msgstr "音声処理"
|
||||
@@ -38684,7 +38692,7 @@ msgctxt "us-state"
|
||||
msgid "Wisconsin"
|
||||
msgstr "ウィスコンシン州"
|
||||
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:215
|
||||
#: src/features/user/components/modals/tabs/my_profile_tab/AvatarUploader.tsx:201
|
||||
msgid "With {PREMIUM_PRODUCT_NAME}, you can use animated avatars ({ANIMATED_AVATAR_FORMATS}) and profile banners, customize your tag, and unlock many other {PREMIUM_PRODUCT_NAME} perks."
|
||||
msgstr "{PREMIUM_PRODUCT_NAME}では、アニメーションアバター({ANIMATED_AVATAR_FORMATS})やプロフィールバナーを使ったり、タグをカスタマイズしたりできるほか、数多くの{PREMIUM_PRODUCT_NAME}特典を利用できます。"
|
||||
|
||||
@@ -39334,8 +39342,8 @@ msgstr "他のコミュニティの絵文字をここで使用するには、「
|
||||
msgid "You need the \"{permissionLabel}\" permission to use stickers from other communities here."
|
||||
msgstr "他のコミュニティのスタンプをここで使用するには、「{permissionLabel}」の権限が必要です。"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:208
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:434
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:207
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:433
|
||||
msgid "You need to claim your account before you can create a community."
|
||||
msgstr "コミュニティを作成する前に、アカウントの登録が必要です。"
|
||||
|
||||
@@ -39356,8 +39364,8 @@ msgstr "このコミュニティでメッセージを送信するには、アカ
|
||||
msgid "You need to verify a phone number to send messages in this community."
|
||||
msgstr "このコミュニティでメッセージを送信するには、電話番号認証が必要です。"
|
||||
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:233
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:459
|
||||
#: src/features/guild/components/modals/add_guild_modal/GuildCreateForm.tsx:232
|
||||
#: src/features/guild/components/modals/add_guild_modal/TemplateImportForm.tsx:458
|
||||
msgid "You need to verify your email address before you can create a community."
|
||||
msgstr "コミュニティを作成する前に、メールアドレスの確認が必要です。"
|
||||
|
||||
@@ -39980,7 +39988,7 @@ msgid "Your saved {savedResolution} at {savedFrameRate} FPS needs {premiumProduc
|
||||
msgstr "保存された {savedResolution} ({savedFrameRate} FPS) は {premiumProductName} が必要です。そのため、共有は {resolution} ({frameRate} FPS) で行われます。"
|
||||
|
||||
#. Body of a modal shown when the video codec the browser negotiated for an active screen share is outside the codecs the app allows and no allowed codec could be published, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:131
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:130
|
||||
msgctxt "screen-share"
|
||||
msgid "Your screen share could not be published with a compatible video codec, so it was stopped. Try sharing again."
|
||||
msgstr "互換性のあるビデオコーデックで画面共有を公開できなかったため、停止しました。もう一度共有してみてください。"
|
||||
@@ -40079,7 +40087,7 @@ msgid "Your vanity URL has been set to {inviteEndpoint}/{vanitySlug}"
|
||||
msgstr "カスタムURLを{inviteEndpoint}/{vanitySlug}に設定しました"
|
||||
|
||||
#. Body of a modal shown when the local video encoder produces no frames for an active screen share, which forces the share to stop.
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:138
|
||||
#: src/features/voice/engine/v2/VoiceEngineV2AppScreenShareExecutionAdapter.tsx:137
|
||||
msgctxt "screen-share"
|
||||
msgid "Your video encoder stopped encoding frames, so your screen share was stopped. Try sharing again."
|
||||
msgstr "ビデオエンコーダーがフレームのエンコードを停止したため、画面共有が停止しました。もう一度共有してみてください。"
|
||||
@@ -40100,7 +40108,7 @@ msgid "YubiKey"
|
||||
msgstr "YubiKey"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:831
|
||||
#: src/features/messaging/components/modals/ImageCropModal.tsx:917
|
||||
#: src/features/user/components/settings_utils/section_registry/AppearanceSections.ts:182
|
||||
msgid "Zoom"
|
||||
msgstr "ズーム"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user