mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-22 07:24:30 +09:00
Compare commits
18
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de9c3efb0d | ||
|
|
85c0fc8f79 | ||
|
|
f45617cf58 | ||
|
|
8be2c38ff6 | ||
|
|
ffdf761d0b | ||
|
|
c125d736b8 | ||
|
|
840b8ef692 | ||
|
|
e3489d8f50 | ||
|
|
6268351b34 | ||
|
|
503e538693 | ||
|
|
f9ca632365 | ||
|
|
44c46094d0 | ||
|
|
cb276b2b73 | ||
|
|
65faf056b9 | ||
|
|
3cb4907766 | ||
|
|
9577364517 | ||
|
|
f6d7fbdf9e | ||
|
|
a5a64afa2e |
No files matched your search
@@ -6,7 +6,7 @@ on:
|
||||
prebuilt_release_tag:
|
||||
description: Draft release containing prebuilt Electron distributions. Leave empty to compile Electron on the build runner instead.
|
||||
required: false
|
||||
default: desktop-electron-runtime-44.4.1-fluxer.1
|
||||
default: desktop-electron-runtime-44.9.1-fluxer.1
|
||||
type: string
|
||||
|
||||
permissions:
|
||||
@@ -48,8 +48,8 @@ jobs:
|
||||
with:
|
||||
name: desktop-electron-linux-${{ matrix.arch }}
|
||||
path: |
|
||||
${{ runner.temp }}/fluxer-electron-artifacts/electron-v44.4.1-linux-${{ matrix.arch }}.zip
|
||||
${{ runner.temp }}/fluxer-electron-artifacts/electron-v44.4.1-linux-${{ matrix.arch }}.fluxer.json
|
||||
${{ runner.temp }}/fluxer-electron-artifacts/electron-v44.9.1-linux-${{ matrix.arch }}.zip
|
||||
${{ runner.temp }}/fluxer-electron-artifacts/electron-v44.9.1-linux-${{ matrix.arch }}.fluxer.json
|
||||
if-no-files-found: error
|
||||
retention-days: 30
|
||||
compression-level: 0
|
||||
@@ -86,8 +86,8 @@ jobs:
|
||||
gh release view "$PREBUILT_RELEASE_TAG" --repo "$GITHUB_REPOSITORY" \
|
||||
--json isDraft --jq '.isDraft' | grep -qx true
|
||||
gh release download "$PREBUILT_RELEASE_TAG" --repo "$GITHUB_REPOSITORY" \
|
||||
--pattern "electron-v44.4.1-linux-$ELECTRON_ARCH.zip" \
|
||||
--pattern "electron-v44.4.1-linux-$ELECTRON_ARCH.fluxer.json" \
|
||||
--pattern "electron-v44.9.1-linux-$ELECTRON_ARCH.zip" \
|
||||
--pattern "electron-v44.9.1-linux-$ELECTRON_ARCH.fluxer.json" \
|
||||
--dir "$FLUXER_ELECTRON_DIST"
|
||||
node <<'NODE'
|
||||
const {verifyLinuxElectronArchive} = require('./fluxer_desktop/scripts/custom-electron.cjs');
|
||||
@@ -101,8 +101,8 @@ jobs:
|
||||
with:
|
||||
name: desktop-electron-linux-${{ matrix.arch }}
|
||||
path: |
|
||||
${{ runner.temp }}/fluxer-electron-artifacts/electron-v44.4.1-linux-${{ matrix.arch }}.zip
|
||||
${{ runner.temp }}/fluxer-electron-artifacts/electron-v44.4.1-linux-${{ matrix.arch }}.fluxer.json
|
||||
${{ runner.temp }}/fluxer-electron-artifacts/electron-v44.9.1-linux-${{ matrix.arch }}.zip
|
||||
${{ runner.temp }}/fluxer-electron-artifacts/electron-v44.9.1-linux-${{ matrix.arch }}.fluxer.json
|
||||
if-no-files-found: error
|
||||
retention-days: 30
|
||||
compression-level: 0
|
||||
@@ -0,0 +1,24 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
name: Cargo advisories
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '17 6 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
advisories:
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
|
||||
|
||||
- name: Install cargo-deny
|
||||
run: cargo install cargo-deny --version 0.20.2 --locked
|
||||
|
||||
- name: Check advisories in every Cargo.lock
|
||||
run: tools/ci/check-cargo-lockfiles.sh
|
||||
@@ -151,6 +151,9 @@ jobs:
|
||||
- name: Check desktop native dependencies
|
||||
run: tools/ci/check-desktop-native-workspaces.sh dependencies
|
||||
|
||||
- name: Check advisories in every Cargo.lock
|
||||
run: tools/ci/check-cargo-lockfiles.sh
|
||||
|
||||
- name: Cache native media dependencies
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
|
||||
with:
|
||||
|
||||
Generated
+8
-8
@@ -3967,9 +3967,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
|
||||
|
||||
[[package]]
|
||||
name = "rustls-webpki"
|
||||
version = "0.103.15"
|
||||
version = "0.103.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2"
|
||||
checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281"
|
||||
dependencies = [
|
||||
"aws-lc-rs",
|
||||
"ring",
|
||||
@@ -4625,7 +4625,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
|
||||
dependencies = [
|
||||
"fastrand",
|
||||
"getrandom 0.4.3",
|
||||
"getrandom 0.3.4",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
"windows-sys 0.61.2",
|
||||
@@ -5397,9 +5397,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "webpki-root-certs"
|
||||
version = "1.0.9"
|
||||
version = "1.0.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b"
|
||||
checksum = "58ec80e73fd8baf57bf0d9615554c75348bda990d6d5bbeab964dd068319fecb"
|
||||
dependencies = [
|
||||
"rustls-pki-types",
|
||||
]
|
||||
@@ -5410,14 +5410,14 @@ version = "0.26.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
|
||||
dependencies = [
|
||||
"webpki-roots 1.0.9",
|
||||
"webpki-roots 1.0.10",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "webpki-roots"
|
||||
version = "1.0.9"
|
||||
version = "1.0.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a"
|
||||
checksum = "1c1c8e20c8a38fc7d65abfe74eb7280e4aa667e8eec8bc84996d2874810748d9"
|
||||
dependencies = [
|
||||
"rustls-pki-types",
|
||||
]
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import crypto from 'node:crypto';
|
||||
import type {ApiContext} from '@app/api/ApiContext';
|
||||
import * as AuthPassword from '@app/api/auth/AuthPassword';
|
||||
import * as AuthSession from '@app/api/auth/AuthSession';
|
||||
import {revokeAllAuthSessions} from '@app/api/auth/AuthSessionRevocation';
|
||||
import * as AuthUtility from '@app/api/auth/AuthUtility';
|
||||
import {createEmailRevertToken} from '@app/api/BrandedTypes';
|
||||
import {Logger} from '@app/api/Logger';
|
||||
import {getKVClient} from '@app/api/middleware/ServiceRegistry';
|
||||
import type {User} from '@app/api/models/User';
|
||||
import {enqueueStripeCustomerEmailSync} from '@app/api/stripe/StripeCustomer';
|
||||
import {EMAIL_REVERT_TOKEN_TTL_SECONDS} from '@app/api/user/repositories/auth/TokenRepository';
|
||||
import {dispatchUserUpdate} from '@app/api/user/UserMappers';
|
||||
import {hashPassword} from '@app/api/utils/PasswordUtils';
|
||||
import * as RandomUtils from '@app/api/utils/RandomUtils';
|
||||
@@ -41,6 +45,24 @@ export async function issueEmailRevertToken(ctx: ApiContext, params: IssueEmailR
|
||||
await email.sendEmailChangeRevert(trimmed, user.username, newEmail, token, user.locale);
|
||||
}
|
||||
|
||||
const EMAIL_REVERT_CLAIM_KEY_PREFIX = 'auth:email-revert:claimed:';
|
||||
|
||||
function emailRevertClaimKey(token: string): string {
|
||||
return `${EMAIL_REVERT_CLAIM_KEY_PREFIX}${crypto.createHash('sha256').update(token).digest('hex')}`;
|
||||
}
|
||||
|
||||
function claimEmailRevertToken(token: string): Promise<boolean> {
|
||||
return getKVClient().setnx(emailRevertClaimKey(token), '1', EMAIL_REVERT_TOKEN_TTL_SECONDS);
|
||||
}
|
||||
|
||||
async function releaseEmailRevertTokenClaim(token: string): Promise<void> {
|
||||
try {
|
||||
await getKVClient().del(emailRevertClaimKey(token));
|
||||
} catch (error) {
|
||||
Logger.error({error}, 'Could not release the claim of an email revert token whose revert failed');
|
||||
}
|
||||
}
|
||||
|
||||
export async function revertEmailChange(
|
||||
ctx: ApiContext,
|
||||
params: RevertEmailChangeParams,
|
||||
@@ -63,20 +85,28 @@ export async function revertEmailChange(
|
||||
if (await AuthPassword.isPasswordPwned(ctx, password)) {
|
||||
throw InputValidationError.fromCode('password', ValidationErrorCodes.PASSWORD_IS_TOO_COMMON);
|
||||
}
|
||||
const passwordHash = await hashPassword(password);
|
||||
const now = new Date();
|
||||
const updatedUser = await users.patchUpsert(
|
||||
user.id,
|
||||
{
|
||||
email: tokenData.email,
|
||||
email_verified: true,
|
||||
totp_secret: null,
|
||||
authenticator_types: null,
|
||||
password_hash: passwordHash,
|
||||
password_last_changed_at: now,
|
||||
},
|
||||
user.toRow(),
|
||||
);
|
||||
if (!(await claimEmailRevertToken(token))) {
|
||||
throw InputValidationError.fromCode('token', ValidationErrorCodes.INVALID_OR_EXPIRED_REVERT_TOKEN);
|
||||
}
|
||||
let updatedUser: User;
|
||||
try {
|
||||
const passwordHash = await hashPassword(password);
|
||||
updatedUser = await users.patchUpsert(
|
||||
user.id,
|
||||
{
|
||||
email: tokenData.email,
|
||||
email_verified: true,
|
||||
totp_secret: null,
|
||||
authenticator_types: null,
|
||||
password_hash: passwordHash,
|
||||
password_last_changed_at: new Date(),
|
||||
},
|
||||
user.toRow(),
|
||||
);
|
||||
} catch (error) {
|
||||
await releaseEmailRevertTokenClaim(token);
|
||||
throw error;
|
||||
}
|
||||
await users.deleteAllPasswordResetTokens(user.id);
|
||||
await users.deleteEmailRevertToken(token);
|
||||
await users.deleteAllMfaBackupCodes(user.id);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import crypto from 'node:crypto';
|
||||
import type {ApiContext} from '@app/api/ApiContext';
|
||||
import * as AuthUtility from '@app/api/auth/AuthUtility';
|
||||
import {
|
||||
@@ -151,6 +152,11 @@ export async function verifyMfaCode(ctx: ApiContext, params: VerifyMfaCodeParams
|
||||
(bc) => !bc.consumed && constantTimeEquals(normalizeBackupCode(bc.code), normalizedCode),
|
||||
);
|
||||
if (backupCode) {
|
||||
const hashedCode = crypto.createHash('sha256').update(normalizedCode).digest('hex');
|
||||
const lockToken = await cache.acquireLock(`mfa-backup:${userId}:${hashedCode}`, seconds('90 seconds'));
|
||||
if (!lockToken) {
|
||||
return false;
|
||||
}
|
||||
await users.consumeMfaBackupCode(userId, backupCode.code);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -122,6 +122,45 @@ function uniquePassword(): string {
|
||||
return `Sup3r-${Date.now()}-Pass!`;
|
||||
}
|
||||
|
||||
async function changeEmailAndGetRevertToken(harness: ApiTestHarness, account: TestAccount): Promise<string> {
|
||||
const startResp = await startEmailChange(harness, account, account.password);
|
||||
let originalProof: string;
|
||||
if (startResp.require_original) {
|
||||
const emails = await listTestEmails(harness, {recipient: account.email});
|
||||
const originalEmail = findLastTestEmail(emails, 'email_change_original');
|
||||
expect(originalEmail?.metadata?.code).toBeDefined();
|
||||
const originalCode = originalEmail!.metadata!.code!;
|
||||
originalProof = await verifyOriginalEmailChange(harness, account, startResp.ticket, originalCode, account.password);
|
||||
} else {
|
||||
originalProof = startResp.original_proof!;
|
||||
}
|
||||
const newEmail = `integration-revert-${Date.now()}@example.com`;
|
||||
await requestNewEmailChange(harness, account, startResp.ticket, newEmail, originalProof, account.password);
|
||||
const newEmails = await listTestEmails(harness, {recipient: newEmail});
|
||||
const newEmailData = findLastTestEmail(newEmails, 'email_change_new');
|
||||
expect(newEmailData?.metadata?.code).toBeDefined();
|
||||
const newCode = newEmailData!.metadata!.code!;
|
||||
const emailToken = await verifyNewEmailChange(
|
||||
harness,
|
||||
account,
|
||||
startResp.ticket,
|
||||
newCode,
|
||||
originalProof,
|
||||
account.password,
|
||||
);
|
||||
await createBuilder(harness, account.token)
|
||||
.patch('/users/@me')
|
||||
.body({
|
||||
email_token: emailToken,
|
||||
password: account.password,
|
||||
})
|
||||
.execute();
|
||||
const revertEmails = await listTestEmails(harness, {recipient: account.email});
|
||||
const revertEmail = findLastTestEmail(revertEmails, 'email_change_revert');
|
||||
expect(revertEmail?.metadata?.token).toBeDefined();
|
||||
return revertEmail!.metadata!.token!;
|
||||
}
|
||||
|
||||
describe('Email revert flow', () => {
|
||||
let harness: ApiTestHarness;
|
||||
beforeAll(async () => {
|
||||
@@ -137,6 +176,20 @@ describe('Email revert flow', () => {
|
||||
afterAll(async () => {
|
||||
await harness?.shutdown();
|
||||
});
|
||||
it('accepts a revert token for only one of several concurrent reverts', async () => {
|
||||
const account = await createTestAccount(harness);
|
||||
const revertToken = await changeEmailAndGetRevertToken(harness, account);
|
||||
const results = await Promise.all(
|
||||
Array.from({length: 4}, () =>
|
||||
createBuilderWithoutAuth(harness)
|
||||
.post('/auth/email-revert')
|
||||
.body({token: revertToken, password: uniquePassword()})
|
||||
.executeRaw(),
|
||||
),
|
||||
);
|
||||
const statuses = results.map(({response}) => response.status).sort();
|
||||
expect(statuses).toEqual([200, 400, 400, 400].sort());
|
||||
});
|
||||
it('restores original email and clears mfa', async () => {
|
||||
const account = await createTestAccount(harness);
|
||||
await createBuilderWithoutAuth(harness)
|
||||
@@ -145,48 +198,7 @@ describe('Email revert flow', () => {
|
||||
.expect(200)
|
||||
.execute();
|
||||
const addJob = vi.spyOn(NoopWorkerService.prototype, 'addJob');
|
||||
const startResp = await startEmailChange(harness, account, account.password);
|
||||
let originalProof: string;
|
||||
if (startResp.require_original) {
|
||||
const emails = await listTestEmails(harness, {recipient: account.email});
|
||||
const originalEmail = findLastTestEmail(emails, 'email_change_original');
|
||||
expect(originalEmail?.metadata?.code).toBeDefined();
|
||||
const originalCode = originalEmail!.metadata!.code!;
|
||||
originalProof = await verifyOriginalEmailChange(
|
||||
harness,
|
||||
account,
|
||||
startResp.ticket,
|
||||
originalCode,
|
||||
account.password,
|
||||
);
|
||||
} else {
|
||||
originalProof = startResp.original_proof!;
|
||||
}
|
||||
const newEmail = `integration-revert-${Date.now()}@example.com`;
|
||||
await requestNewEmailChange(harness, account, startResp.ticket, newEmail, originalProof, account.password);
|
||||
const newEmails = await listTestEmails(harness, {recipient: newEmail});
|
||||
const newEmailData = findLastTestEmail(newEmails, 'email_change_new');
|
||||
expect(newEmailData?.metadata?.code).toBeDefined();
|
||||
const newCode = newEmailData!.metadata!.code!;
|
||||
const emailToken = await verifyNewEmailChange(
|
||||
harness,
|
||||
account,
|
||||
startResp.ticket,
|
||||
newCode,
|
||||
originalProof,
|
||||
account.password,
|
||||
);
|
||||
await createBuilder(harness, account.token)
|
||||
.patch('/users/@me')
|
||||
.body({
|
||||
email_token: emailToken,
|
||||
password: account.password,
|
||||
})
|
||||
.execute();
|
||||
const revertEmails = await listTestEmails(harness, {recipient: account.email});
|
||||
const revertEmail = findLastTestEmail(revertEmails, 'email_change_revert');
|
||||
expect(revertEmail?.metadata?.token).toBeDefined();
|
||||
const revertToken = revertEmail!.metadata!.token!;
|
||||
const revertToken = await changeEmailAndGetRevertToken(harness, account);
|
||||
const newPassword = uniquePassword();
|
||||
addJob.mockClear();
|
||||
const revertResp = await createBuilderWithoutAuth<EmailRevertResponse>(harness)
|
||||
|
||||
@@ -168,6 +168,21 @@ describe('MFA backup code login', () => {
|
||||
expect(consumed).toHaveLength(1);
|
||||
expect(consumed[0]!.code).toBe(issued);
|
||||
});
|
||||
it('accepts a backup code for only one of several concurrent logins', async () => {
|
||||
const account = await createTestAccount(harness);
|
||||
const secret = createTotpSecret();
|
||||
const codes = await enableTotp(harness, account, secret);
|
||||
const tickets = await Promise.all(Array.from({length: 4}, () => startMfaLogin(harness, account)));
|
||||
const results = await Promise.all(
|
||||
tickets.map((ticket) =>
|
||||
createBuilderWithoutAuth(harness).post('/auth/login/mfa/totp').body({ticket, code: codes[0]!}).executeRaw(),
|
||||
),
|
||||
);
|
||||
const statuses = results.map(({response}) => response.status).sort();
|
||||
expect(statuses).toEqual(
|
||||
[HTTP_STATUS.OK, HTTP_STATUS.BAD_REQUEST, HTTP_STATUS.BAD_REQUEST, HTTP_STATUS.BAD_REQUEST].sort(),
|
||||
);
|
||||
});
|
||||
it('rejects empty and whitespace only backup codes', async () => {
|
||||
const account = await createTestAccount(harness);
|
||||
const secret = createTotpSecret();
|
||||
|
||||
@@ -444,7 +444,7 @@ export function MessageController(app: HonoApp) {
|
||||
security: ['botToken', 'bearerToken', 'sessionToken'],
|
||||
tags: ['Channels', 'Messages'],
|
||||
description:
|
||||
'Deletes every message the caller has authored in the specified channel. Requires sudo mode verification. Returns 202 Accepted once matching messages have been removed.',
|
||||
'Deletes every message the caller has authored in the specified channel and in its threads, active and archived. When the channel is a thread, only that thread is cleared. Requires sudo mode verification. Returns 202 Accepted once matching messages have been removed.',
|
||||
}),
|
||||
async (ctx) => {
|
||||
const user = ctx.get('user');
|
||||
|
||||
@@ -41,25 +41,6 @@ export class MessagePinService {
|
||||
private readonly guildAuditLogService: GuildAuditLogService,
|
||||
) {}
|
||||
|
||||
private async assertMessageHistoryAccess({
|
||||
authChannel,
|
||||
messageId,
|
||||
}: {
|
||||
authChannel: AuthenticatedChannel;
|
||||
messageId: MessageID;
|
||||
}): Promise<void> {
|
||||
if (!authChannel.guild) {
|
||||
return;
|
||||
}
|
||||
if (await authChannel.hasPermission(Permissions.READ_MESSAGE_HISTORY)) {
|
||||
return;
|
||||
}
|
||||
const cutoff = authChannel.guild.message_history_cutoff;
|
||||
if (!cutoff || snowflakeToDate(messageId).getTime() < new Date(cutoff).getTime()) {
|
||||
throw new UnknownMessageError();
|
||||
}
|
||||
}
|
||||
|
||||
async getChannelPins({
|
||||
authChannel,
|
||||
userId,
|
||||
@@ -161,7 +142,6 @@ export class MessagePinService {
|
||||
}
|
||||
ensureTextChannel(channel);
|
||||
assertThreadInteractionAllowed(authChannel, 'pin');
|
||||
await this.assertMessageHistoryAccess({authChannel, messageId});
|
||||
const message = await this.channelRepository.messages.getMessage(channel.id, messageId);
|
||||
if (!message) throw new UnknownMessageError();
|
||||
this.validateMessagePinnable(message);
|
||||
@@ -214,7 +194,6 @@ export class MessagePinService {
|
||||
}
|
||||
ensureTextChannel(channel);
|
||||
assertThreadInteractionAllowed(authChannel, 'pin');
|
||||
await this.assertMessageHistoryAccess({authChannel, messageId});
|
||||
const message = await this.channelRepository.messages.getMessage(channel.id, messageId);
|
||||
if (!message) throw new UnknownMessageError();
|
||||
this.validateMessagePinnable(message);
|
||||
|
||||
@@ -164,6 +164,16 @@ export class UserMessageDeletionService {
|
||||
for (const channelId of scope.channelIds) {
|
||||
allowlist.add(channelId.toString());
|
||||
}
|
||||
const channels = await this.deps.channelRepository.channelData.listChannels([...scope.channelIds]);
|
||||
for (const channel of channels) {
|
||||
if (!channel.guildId) continue;
|
||||
const threadIds = await this.deps.channelRepository.threads.listGuildThreadIds(channel.guildId, {
|
||||
parents: [channel],
|
||||
});
|
||||
for (const threadId of threadIds) {
|
||||
allowlist.add(threadId.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scope.guildId) {
|
||||
const channels = await this.deps.channelRepository.channelData.listGuildChannels(scope.guildId, 'complete');
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {createTestAccount} from '@app/api/auth/tests/AuthTestUtils';
|
||||
import {createTestAccount, type TestAccount} from '@app/api/auth/tests/AuthTestUtils';
|
||||
import {createChannelID} from '@app/api/BrandedTypes';
|
||||
import {ChannelRepository} from '@app/api/channel/ChannelRepository';
|
||||
import {
|
||||
createChannel,
|
||||
createFriendship,
|
||||
@@ -8,17 +10,59 @@ import {
|
||||
sendChannelMessage,
|
||||
setupTestGuildWithMembers,
|
||||
} from '@app/api/channel/tests/ChannelTestUtils';
|
||||
import {threadsRequest} from '@app/api/channel/tests/ThreadTestUtils';
|
||||
import {clearChannelThreadsTaintCacheForTesting} from '@app/api/experiment/ChannelThreadsGate';
|
||||
import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHarness';
|
||||
import {createBuilder} from '@app/api/test/TestRequestBuilder';
|
||||
import {ChannelTypes} from '@fluxer/constants/src/ChannelConstants';
|
||||
import type {ChannelResponse} from '@fluxer/schema/src/domains/channel/ChannelSchemas';
|
||||
import type {StartForumThreadResponse} from '@fluxer/schema/src/domains/channel/ForumRequestSchemas';
|
||||
import type {ThreadChannelResponse} from '@fluxer/schema/src/domains/channel/ThreadRequestSchemas';
|
||||
import type {MessageResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
|
||||
import {afterAll, beforeAll, beforeEach, describe, expect, it} from 'vitest';
|
||||
|
||||
const repository = new ChannelRepository();
|
||||
|
||||
async function listMessages(
|
||||
harness: ApiTestHarness,
|
||||
token: string,
|
||||
channelId: string,
|
||||
): Promise<Array<MessageResponse>> {
|
||||
return createBuilder<Array<MessageResponse>>(harness, token).get(`/channels/${channelId}/messages`).execute();
|
||||
return threadsRequest<Array<MessageResponse>>(harness, token).get(`/channels/${channelId}/messages`).execute();
|
||||
}
|
||||
|
||||
async function sendThreadMessage(
|
||||
harness: ApiTestHarness,
|
||||
token: string,
|
||||
channelId: string,
|
||||
content: string,
|
||||
): Promise<MessageResponse> {
|
||||
return threadsRequest<MessageResponse>(harness, token)
|
||||
.post(`/channels/${channelId}/messages`)
|
||||
.body({content})
|
||||
.expect(200)
|
||||
.execute();
|
||||
}
|
||||
|
||||
async function createThread(
|
||||
harness: ApiTestHarness,
|
||||
token: string,
|
||||
channelId: string,
|
||||
type: number = ChannelTypes.PUBLIC_THREAD,
|
||||
): Promise<ThreadChannelResponse> {
|
||||
return threadsRequest<ThreadChannelResponse>(harness, token)
|
||||
.post(`/channels/${channelId}/threads`)
|
||||
.body({name: 'thread', type})
|
||||
.expect(201)
|
||||
.execute();
|
||||
}
|
||||
|
||||
async function bulkDeleteMine(harness: ApiTestHarness, account: TestAccount, channelId: string, status = 202) {
|
||||
await threadsRequest(harness, account.token)
|
||||
.post(`/channels/${channelId}/messages/bulk-delete-mine`)
|
||||
.body({password: account.password})
|
||||
.expect(status)
|
||||
.execute();
|
||||
}
|
||||
|
||||
function expectMessageVisibility(
|
||||
@@ -42,8 +86,10 @@ describe('Bulk delete my messages', () => {
|
||||
});
|
||||
beforeEach(async () => {
|
||||
await harness.reset();
|
||||
clearChannelThreadsTaintCacheForTesting();
|
||||
});
|
||||
afterAll(async () => {
|
||||
clearChannelThreadsTaintCacheForTesting();
|
||||
await harness?.shutdown();
|
||||
});
|
||||
it('deletes the caller messages in a single guild channel immediately', async () => {
|
||||
@@ -117,4 +163,75 @@ describe('Bulk delete my messages', () => {
|
||||
const messages = await listMessages(harness, member.token, groupDm.id);
|
||||
expectMessageVisibility(messages, [memberMessage.id], [ownerMessage.id]);
|
||||
});
|
||||
it('deletes the caller messages in the active and archived threads of a channel', async () => {
|
||||
const {owner, members, systemChannel} = await setupTestGuildWithMembers(harness, 1);
|
||||
const member = members[0]!;
|
||||
const active = await createThread(harness, owner.token, systemChannel.id);
|
||||
const archived = await createThread(harness, owner.token, systemChannel.id);
|
||||
const privateThread = await createThread(harness, owner.token, systemChannel.id, ChannelTypes.PRIVATE_THREAD);
|
||||
const parentOwnerMessage = await sendChannelMessage(harness, owner.token, systemChannel.id, 'parent target');
|
||||
const activeOwnerMessage = await sendThreadMessage(harness, owner.token, active.id, 'active target');
|
||||
const activeMemberMessage = await sendThreadMessage(harness, member.token, active.id, 'active should stay');
|
||||
const archivedOwnerMessage = await sendThreadMessage(harness, owner.token, archived.id, 'archived target');
|
||||
const archivedMemberMessage = await sendThreadMessage(harness, member.token, archived.id, 'archived should stay');
|
||||
const privateOwnerMessage = await sendThreadMessage(harness, owner.token, privateThread.id, 'private target');
|
||||
await repository.threads.updateState(createChannelID(BigInt(archived.id)), () => ({archived: true}));
|
||||
await bulkDeleteMine(harness, owner, systemChannel.id);
|
||||
expectMessageVisibility(await listMessages(harness, member.token, systemChannel.id), [], [parentOwnerMessage.id]);
|
||||
expectMessageVisibility(
|
||||
await listMessages(harness, member.token, active.id),
|
||||
[activeMemberMessage.id],
|
||||
[activeOwnerMessage.id],
|
||||
);
|
||||
expectMessageVisibility(
|
||||
await listMessages(harness, member.token, archived.id),
|
||||
[archivedMemberMessage.id],
|
||||
[archivedOwnerMessage.id],
|
||||
);
|
||||
expectMessageVisibility(await listMessages(harness, owner.token, privateThread.id), [], [privateOwnerMessage.id]);
|
||||
});
|
||||
it('deletes the caller messages only in the thread it is run on', async () => {
|
||||
const {owner, members, systemChannel} = await setupTestGuildWithMembers(harness, 1);
|
||||
const member = members[0]!;
|
||||
const thread = await createThread(harness, owner.token, systemChannel.id);
|
||||
const sibling = await createThread(harness, owner.token, systemChannel.id);
|
||||
const parentOwnerMessage = await sendChannelMessage(harness, owner.token, systemChannel.id, 'parent should stay');
|
||||
const threadOwnerMessage = await sendThreadMessage(harness, owner.token, thread.id, 'thread target');
|
||||
const threadMemberMessage = await sendThreadMessage(harness, member.token, thread.id, 'thread should stay');
|
||||
const siblingOwnerMessage = await sendThreadMessage(harness, owner.token, sibling.id, 'sibling should stay');
|
||||
await bulkDeleteMine(harness, owner, thread.id);
|
||||
expectMessageVisibility(
|
||||
await listMessages(harness, member.token, thread.id),
|
||||
[threadMemberMessage.id],
|
||||
[threadOwnerMessage.id],
|
||||
);
|
||||
expectMessageVisibility(await listMessages(harness, member.token, systemChannel.id), [parentOwnerMessage.id], []);
|
||||
expectMessageVisibility(await listMessages(harness, member.token, sibling.id), [siblingOwnerMessage.id], []);
|
||||
});
|
||||
it('deletes the caller messages in the posts of a forum channel', async () => {
|
||||
const {owner, members, guild} = await setupTestGuildWithMembers(harness, 1);
|
||||
const member = members[0]!;
|
||||
const forum = await threadsRequest<ChannelResponse>(harness, owner.token)
|
||||
.post(`/guilds/${guild.id}/channels`)
|
||||
.body({name: 'forum', type: ChannelTypes.GUILD_FORUM})
|
||||
.execute();
|
||||
const post = await threadsRequest<StartForumThreadResponse>(harness, member.token)
|
||||
.post(`/channels/${forum.id}/threads`)
|
||||
.body({name: 'post', message: {content: 'starter should stay'}})
|
||||
.expect(201)
|
||||
.execute();
|
||||
const ownerReply = await sendThreadMessage(harness, owner.token, post.id, 'reply target');
|
||||
const memberReply = await sendThreadMessage(harness, member.token, post.id, 'reply should stay');
|
||||
await bulkDeleteMine(harness, owner, forum.id);
|
||||
expectMessageVisibility(await listMessages(harness, member.token, post.id), [memberReply.id], [ownerReply.id]);
|
||||
});
|
||||
it('rejects a caller outside the community and leaves its thread messages', async () => {
|
||||
const {owner, systemChannel} = await setupTestGuildWithMembers(harness, 0);
|
||||
const outsider = await createTestAccount(harness);
|
||||
const thread = await createThread(harness, owner.token, systemChannel.id);
|
||||
const ownerMessage = await sendThreadMessage(harness, owner.token, thread.id, 'thread should stay');
|
||||
await bulkDeleteMine(harness, outsider, systemChannel.id, 403);
|
||||
await bulkDeleteMine(harness, outsider, thread.id, 403);
|
||||
expectMessageVisibility(await listMessages(harness, owner.token, thread.id), [ownerMessage.id], []);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,72 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
createPermissionOverwrite,
|
||||
pinMessage,
|
||||
sendChannelMessage,
|
||||
setupTestGuildWithMembers,
|
||||
} from '@app/api/channel/tests/ChannelTestUtils';
|
||||
import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHarness';
|
||||
import {HTTP_STATUS} from '@app/api/test/TestConstants';
|
||||
import {createBuilder} from '@app/api/test/TestRequestBuilder';
|
||||
import {Permissions} from '@fluxer/constants/src/ChannelConstants';
|
||||
import type {ChannelPinsResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
|
||||
import {afterAll, beforeAll, beforeEach, describe, expect, it} from 'vitest';
|
||||
|
||||
describe('Message pin permissions', () => {
|
||||
let harness: ApiTestHarness;
|
||||
|
||||
beforeAll(async () => {
|
||||
harness = await createApiTestHarness();
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
await harness.reset();
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await harness?.shutdown();
|
||||
});
|
||||
|
||||
async function listPinnedMessageIds(token: string, channelId: string): Promise<Array<string>> {
|
||||
const pins = await createBuilder<ChannelPinsResponse>(harness, token)
|
||||
.get(`/channels/${channelId}/messages/pins`)
|
||||
.execute();
|
||||
return pins.items.map((item) => item.message.id);
|
||||
}
|
||||
|
||||
it('allows pinning and unpinning an own message without Read Message History', async () => {
|
||||
const {owner, members, systemChannel} = await setupTestGuildWithMembers(harness, 1);
|
||||
const member = members[0]!;
|
||||
await createPermissionOverwrite(harness, owner.token, systemChannel.id, member.userId, {
|
||||
type: 1,
|
||||
allow: (Permissions.VIEW_CHANNEL | Permissions.SEND_MESSAGES | Permissions.PIN_MESSAGES).toString(),
|
||||
deny: Permissions.READ_MESSAGE_HISTORY.toString(),
|
||||
});
|
||||
const message = await sendChannelMessage(harness, member.token, systemChannel.id, 'pin me');
|
||||
|
||||
await pinMessage(harness, member.token, systemChannel.id, message.id);
|
||||
expect(await listPinnedMessageIds(owner.token, systemChannel.id)).toEqual([message.id]);
|
||||
|
||||
await createBuilder(harness, member.token)
|
||||
.delete(`/channels/${systemChannel.id}/pins/${message.id}`)
|
||||
.expect(HTTP_STATUS.NO_CONTENT)
|
||||
.execute();
|
||||
expect(await listPinnedMessageIds(owner.token, systemChannel.id)).toEqual([]);
|
||||
});
|
||||
|
||||
it('allows pinning source history without Read Message History', async () => {
|
||||
const {owner, members, systemChannel} = await setupTestGuildWithMembers(harness, 1);
|
||||
const member = members[0]!;
|
||||
const message = await sendChannelMessage(harness, owner.token, systemChannel.id, 'hidden history');
|
||||
await createPermissionOverwrite(harness, owner.token, systemChannel.id, member.userId, {
|
||||
type: 1,
|
||||
allow: (Permissions.VIEW_CHANNEL | Permissions.PIN_MESSAGES).toString(),
|
||||
deny: Permissions.READ_MESSAGE_HISTORY.toString(),
|
||||
});
|
||||
|
||||
await pinMessage(harness, member.token, systemChannel.id, message.id);
|
||||
|
||||
expect(await listPinnedMessageIds(owner.token, systemChannel.id)).toEqual([message.id]);
|
||||
});
|
||||
});
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import type {SsoService} from '@app/api/auth/services/SsoService';
|
||||
import {Config} from '@app/api/Config';
|
||||
import {setCassandraQueryExecutorForTesting} from '@app/api/database/CassandraQueryExecution';
|
||||
import {InstanceConfigRepository} from '@app/api/instance/InstanceConfigRepository';
|
||||
import {InstanceController} from '@app/api/instance/InstanceController';
|
||||
@@ -71,6 +72,25 @@ describe('InstanceController discovery captcha', () => {
|
||||
await expect(readCaptcha(repository)).resolves.toEqual({provider: 'none'});
|
||||
});
|
||||
|
||||
it('publishes whether discovery is enabled', async () => {
|
||||
const previousDiscoveryEnabled = Config.discovery.enabled;
|
||||
const app = createApp(createRepository());
|
||||
const readDiscoveryEnabled = async () => {
|
||||
const response = await app.request('http://localhost/.well-known/fluxer');
|
||||
expect(response.status).toBe(200);
|
||||
return ((await response.json()) as {features: {discovery_enabled?: boolean}}).features.discovery_enabled;
|
||||
};
|
||||
try {
|
||||
Config.discovery.enabled = false;
|
||||
await expect(readDiscoveryEnabled()).resolves.toBe(false);
|
||||
|
||||
Config.discovery.enabled = true;
|
||||
await expect(readDiscoveryEnabled()).resolves.toBe(true);
|
||||
} finally {
|
||||
Config.discovery.enabled = previousDiscoveryEnabled;
|
||||
}
|
||||
});
|
||||
|
||||
it('publishes the domain migration kill switch and anonymous rollout without the targeting lists', async () => {
|
||||
const repository = createRepository();
|
||||
const app = createApp(repository);
|
||||
|
||||
@@ -85,6 +85,7 @@ function buildDiscoveryStaticInput(
|
||||
self_hosted: Config.instance.selfHosted,
|
||||
presigned_attachment_uploads: Config.presignedAttachmentUploadsEnabled,
|
||||
emails_enabled: runtime.emailEnabled,
|
||||
discovery_enabled: Config.discovery.enabled,
|
||||
phone_verification_enabled: false,
|
||||
account_identity: runtime.accountIdentity.mode,
|
||||
tag_style: runtime.accountIdentity.tagStyle,
|
||||
|
||||
Generated
+2
-1
@@ -3447,7 +3447,7 @@
|
||||
"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}
|
||||
}
|
||||
},
|
||||
"description": "Deletes every message the caller has authored in the specified channel. Requires sudo mode verification. Returns 202 Accepted once matching messages have been removed.",
|
||||
"description": "Deletes every message the caller has authored in the specified channel and in its threads, active and archived. When the channel is a thread, only that thread is cleared. Requires sudo mode verification. Returns 202 Accepted once matching messages have been removed.",
|
||||
"security": [{"botToken": []}, {"sessionToken": []}],
|
||||
"parameters": [
|
||||
{
|
||||
@@ -33940,6 +33940,7 @@
|
||||
"description": "Whether desktop clients may load downloadable modules",
|
||||
"type": "boolean"
|
||||
},
|
||||
"discovery_enabled": {"description": "Whether community discovery is enabled", "type": "boolean"},
|
||||
"account_deletion_grace_period_hours": {
|
||||
"description": "Hours between a deletion request and the permanent deletion of the account",
|
||||
"type": "integer",
|
||||
|
||||
@@ -25,6 +25,7 @@ import {
|
||||
guildToContentWarningView,
|
||||
} from '@app/api/channel/utils/EffectiveContentWarning';
|
||||
import {resolveNsfwScopeChannel} from '@app/api/channel/utils/ThreadNsfwScope';
|
||||
import {isSyntheticUserId} from '@app/api/constants/Core';
|
||||
import type {MessageAttachment} from '@app/api/database/types/MessageTypes';
|
||||
import type {
|
||||
DSAReportTicketRow,
|
||||
@@ -408,7 +409,7 @@ export class ReportService {
|
||||
throw new CannotReportYourselfError();
|
||||
}
|
||||
const reportedUser = await this.userRepository.findUnique(reportedUserId);
|
||||
if (!reportedUser) {
|
||||
if (!reportedUser || isSyntheticUserId(reportedUserId)) {
|
||||
throw new UnknownUserError();
|
||||
}
|
||||
const reportId = createReportID(await this.snowflakeService.generate());
|
||||
|
||||
@@ -180,6 +180,13 @@ describe('Content Reporting', () => {
|
||||
expect((await readReport(member.report_id)).reportedGuildId?.toString()).toBe(guild.id);
|
||||
expect(await countReports()).toBe(2);
|
||||
});
|
||||
test('should reject a report against the system account', async () => {
|
||||
const reporter = await createTestAccount(harness);
|
||||
await reportUser(harness, reporter.token, '0')
|
||||
.expect(HTTP_STATUS.NOT_FOUND, APIErrorCodes.UNKNOWN_USER)
|
||||
.execute();
|
||||
expect(await countReports()).toBe(0);
|
||||
});
|
||||
test('sends a localized system DM and email marker when a report is reviewed with a public comment', async () => {
|
||||
const reporter = await createTestAccount(harness);
|
||||
const targetUser = await createTestAccount(harness);
|
||||
|
||||
@@ -31,6 +31,7 @@ const FETCH_PASSWORD_RESET_TOKENS_BY_USER_CQL = PasswordResetTokensByUserId.sele
|
||||
where: PasswordResetTokensByUserId.where.eq('user_id'),
|
||||
});
|
||||
export const PASSWORD_RESET_TOKEN_TTL_SECONDS = seconds('1 hour');
|
||||
export const EMAIL_REVERT_TOKEN_TTL_SECONDS = seconds('24 hours');
|
||||
|
||||
const FETCH_EMAIL_REVERT_TOKEN_CQL = EmailRevertTokens.selectCql({
|
||||
where: EmailRevertTokens.where.eq('token_'),
|
||||
@@ -97,7 +98,7 @@ export class TokenRepository {
|
||||
}
|
||||
|
||||
async createEmailRevertToken(tokenData: EmailRevertTokenRow): Promise<EmailRevertToken> {
|
||||
await upsertOne(EmailRevertTokens.insertWithTtl(tokenData, seconds('24 hours')));
|
||||
await upsertOne(EmailRevertTokens.insertWithTtl(tokenData, EMAIL_REVERT_TOKEN_TTL_SECONDS));
|
||||
return new EmailRevertToken(tokenData);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {existsSync, mkdirSync, readdirSync, writeFileSync} from 'node:fs';
|
||||
import {existsSync, readdirSync} from 'node:fs';
|
||||
import path, {dirname} from 'node:path';
|
||||
import {fileURLToPath} from 'node:url';
|
||||
import {
|
||||
@@ -692,12 +692,19 @@ export default () => {
|
||||
}),
|
||||
{
|
||||
apply(compiler) {
|
||||
compiler.hooks.afterEmit.tap('VersionJsonPlugin', () => {
|
||||
const versionData = {
|
||||
version: publicValues.PUBLIC_BUILD_VERSION,
|
||||
};
|
||||
mkdirSync(DIST_DIR, {recursive: true});
|
||||
writeFileSync(path.join(DIST_DIR, 'version.json'), JSON.stringify(versionData));
|
||||
compiler.hooks.thisCompilation.tap('VersionJsonPlugin', (compilation) => {
|
||||
const {Compilation} = compiler.rspack;
|
||||
compilation.hooks.processAssets.tap(
|
||||
{name: 'VersionJsonPlugin', stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL},
|
||||
() => {
|
||||
const {RawSource} = compiler.rspack.sources;
|
||||
const versionData = {
|
||||
version: publicValues.PUBLIC_BUILD_VERSION,
|
||||
};
|
||||
const source = new RawSource(JSON.stringify(versionData));
|
||||
compilation.emitAsset('version.json', source);
|
||||
},
|
||||
);
|
||||
});
|
||||
},
|
||||
},
|
||||
|
||||
@@ -10,6 +10,7 @@ import {DiscoveryLayout} from '@app/features/app/components/layout/DiscoveryLayo
|
||||
import {FavoritesLayout} from '@app/features/app/components/layout/FavoritesLayout';
|
||||
import {GuildsLayout} from '@app/features/app/components/layout/GuildsLayout';
|
||||
import {NotFoundPage} from '@app/features/app/components/pages/NotFoundPage';
|
||||
import {isDiscoveryAvailable} from '@app/features/app/utils/DiscoveryFeatures';
|
||||
import {
|
||||
AuthenticatedRuntimeInvariantError,
|
||||
readAuthenticatedRuntimeContext,
|
||||
@@ -40,12 +41,20 @@ import {type ReactNode, useEffect, useState} from 'react';
|
||||
|
||||
type AppRouteComponentProps = Record<string, unknown>;
|
||||
|
||||
function authenticatedRuntimeDisablesDirectMessages(): boolean {
|
||||
function requireAuthenticatedRuntime() {
|
||||
const runtimeContext = readAuthenticatedRuntimeContext();
|
||||
if (runtimeContext === null) {
|
||||
throw new AuthenticatedRuntimeInvariantError('An authenticated route requires an active account runtime');
|
||||
}
|
||||
return runtimeContext.runtime.community.direct_messages_disabled;
|
||||
return runtimeContext.runtime;
|
||||
}
|
||||
|
||||
function authenticatedRuntimeDisablesDirectMessages(): boolean {
|
||||
return requireAuthenticatedRuntime().community.direct_messages_disabled;
|
||||
}
|
||||
|
||||
function authenticatedRuntimeHasDiscovery(): boolean {
|
||||
return isDiscoveryAvailable(requireAuthenticatedRuntime());
|
||||
}
|
||||
|
||||
const YouPage = createNamedLoadableComponent<AppRouteComponentProps>({
|
||||
@@ -209,10 +218,11 @@ const meRoute = createRoute({
|
||||
id: 'me',
|
||||
path: '/channels/@me',
|
||||
onEnter: whenAuthenticated(() => {
|
||||
if (authenticatedRuntimeDisablesDirectMessages()) {
|
||||
return new Redirect(getDirectMessagesFallbackPath());
|
||||
if (!authenticatedRuntimeDisablesDirectMessages()) {
|
||||
return undefined;
|
||||
}
|
||||
return undefined;
|
||||
const fallback = getDirectMessagesFallbackPath();
|
||||
return fallback === Routes.ME ? undefined : new Redirect(fallback);
|
||||
}),
|
||||
component: observer(() => {
|
||||
const isMobileLayout = MobileLayout.enabled;
|
||||
@@ -228,6 +238,12 @@ const discoverRoute = createRoute({
|
||||
getParentRoute: () => guildsLayoutRoute,
|
||||
id: 'discover',
|
||||
path: '/channels/@discover',
|
||||
onEnter: whenAuthenticated(() => {
|
||||
if (authenticatedRuntimeHasDiscovery()) {
|
||||
return undefined;
|
||||
}
|
||||
return new Redirect(Routes.ME);
|
||||
}),
|
||||
component: () => <DiscoveryLayout data-flx="app.router.app-routes.discovery-layout" />,
|
||||
});
|
||||
const plutoniumRoute = createRoute({
|
||||
|
||||
@@ -34,7 +34,7 @@ import SelectedChannel from '@app/features/navigation/state/SelectedChannel';
|
||||
import Permission from '@app/features/permissions/state/Permission';
|
||||
import {formatPermissionLabel} from '@app/features/permissions/utils/PermissionUtils';
|
||||
import {Logger} from '@app/features/platform/utils/AppLogger';
|
||||
import {createForwardSearchCandidates} from '@app/features/search/utils/DestinationSearchSources';
|
||||
import {createForwardSearchCandidates, isForwardableThread} from '@app/features/search/utils/DestinationSearchSources';
|
||||
import {getLoadedUnicodeConfusables, loadUnicodeConfusables} from '@app/features/search/utils/SearchTextMatching';
|
||||
import Slowmode from '@app/features/slowmode/state/Slowmode';
|
||||
import {useNow} from '@app/features/ui/state/Tick';
|
||||
@@ -141,6 +141,9 @@ function findDirectMessageChannel(userId: string): Channel | null {
|
||||
function resolveForwardChannelRow(channelId: string): ForwardRowIdentity | null {
|
||||
const channel = Channels.getChannel(channelId);
|
||||
if (channel == null) return null;
|
||||
if (channel.isThread()) {
|
||||
return isForwardableThread(channel) ? {id: channel.id, type: 'text_channel'} : null;
|
||||
}
|
||||
switch (channel.type) {
|
||||
case ChannelTypes.DM: {
|
||||
if (channel.recipientIds.length === 0) return null;
|
||||
|
||||
@@ -1,24 +1,35 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {Routes} from '@app/app/Routes';
|
||||
import {DiscoveryGuildHeader} from '@app/features/app/components/layout/DiscoveryGuildHeader';
|
||||
import styles from '@app/features/app/components/layout/GuildLayout.module.css';
|
||||
import {GuildSidebar} from '@app/features/app/components/layout/GuildSidebar';
|
||||
import RuntimeConfig from '@app/features/app/state/RuntimeConfig';
|
||||
import {DiscoveryPage} from '@app/features/discovery/discovery/DiscoveryPage';
|
||||
import {DiscoverySidebar} from '@app/features/discovery/discovery/DiscoverySidebar';
|
||||
import Discovery from '@app/features/discovery/state/Discovery';
|
||||
import * as RouterUtils from '@app/features/navigation/utils/RouterUtils';
|
||||
import MobileLayout from '@app/features/ui/state/MobileLayout';
|
||||
import {observer} from 'mobx-react-lite';
|
||||
import {useEffect} from 'react';
|
||||
|
||||
export const DiscoveryLayout = observer(function DiscoveryLayout() {
|
||||
const mobileLayout = MobileLayout;
|
||||
const available = RuntimeConfig.discoveryAvailable;
|
||||
useEffect(() => {
|
||||
if (!available) {
|
||||
RouterUtils.replaceWith(Routes.ME);
|
||||
return;
|
||||
}
|
||||
void Discovery.loadCategories();
|
||||
void Discovery.search({offset: 0});
|
||||
return () => {
|
||||
Discovery.reset();
|
||||
};
|
||||
}, []);
|
||||
}, [available]);
|
||||
if (!available) {
|
||||
return null;
|
||||
}
|
||||
if (mobileLayout.enabled) {
|
||||
return <DiscoveryPage data-flx="app.discovery-layout.discovery-page.mobile" />;
|
||||
}
|
||||
|
||||
@@ -207,6 +207,7 @@ interface GuildNavigationVisibility {
|
||||
|
||||
function useGuildNavigationVisibility(): GuildNavigationVisibility {
|
||||
const communityActionsVisible = !RuntimeConfig.singleCommunityEnabled;
|
||||
const discoveryVisible = RuntimeConfig.discoveryAvailable;
|
||||
const fluxerVisible = !RuntimeConfig.directMessagesDisabled;
|
||||
const favoritesVisible = Accessibility.showFavorites;
|
||||
const downloadVisible = !Platform.isElectron && !Platform.isPWA && !HiddenGuildListButtons.downloadButtonHidden;
|
||||
@@ -216,12 +217,12 @@ function useGuildNavigationVisibility(): GuildNavigationVisibility {
|
||||
Object.freeze({
|
||||
fluxerVisible,
|
||||
favoritesVisible,
|
||||
discoveryVisible: communityActionsVisible,
|
||||
discoveryVisible,
|
||||
addGuildVisible: communityActionsVisible,
|
||||
downloadVisible,
|
||||
helpVisible,
|
||||
}),
|
||||
[communityActionsVisible, downloadVisible, favoritesVisible, fluxerVisible, helpVisible],
|
||||
[communityActionsVisible, discoveryVisible, downloadVisible, favoritesVisible, fluxerVisible, helpVisible],
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ import guildStyles from '@app/features/app/components/layout/GuildsLayout.module
|
||||
import styles from '@app/features/app/components/layout/sidebar_nav/DiscoveryButton.module.css';
|
||||
import {useHover} from '@app/features/app/hooks/useHover';
|
||||
import {useMergeRefs} from '@app/features/app/hooks/useMergeRefs';
|
||||
import RuntimeConfig from '@app/features/app/state/RuntimeConfig';
|
||||
import Navigation from '@app/features/navigation/state/Navigation';
|
||||
import {useLocation} from '@app/features/platform/components/router/RouterReact';
|
||||
import FocusRing from '@app/features/ui/focus_ring/FocusRing';
|
||||
@@ -33,9 +32,6 @@ export const DiscoveryButton = observer(() => {
|
||||
const handleClick = useCallback(() => {
|
||||
Navigation.navigateToDiscover();
|
||||
}, []);
|
||||
if (RuntimeConfig.singleCommunityEnabled) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<div className={guildStyles.createGuildButton} data-flx="app.sidebar-nav.discovery-button.div">
|
||||
<Tooltip
|
||||
|
||||
@@ -15,6 +15,7 @@ import {
|
||||
} from '@app/features/app/components/skeleton/SkeletonLayoutMemory';
|
||||
import {
|
||||
skeletonDirectMessagesDisabled,
|
||||
skeletonDiscoveryAvailable,
|
||||
skeletonSingleCommunityEnabled,
|
||||
} from '@app/features/app/components/skeleton/SkeletonRuntimeConfig';
|
||||
import {SkeletonEmphasis, SkeletonRadius} from '@app/features/app/components/skeleton/SkeletonStyle';
|
||||
@@ -467,7 +468,7 @@ export const GuildRailSkeleton: React.FC<GuildRailSkeletonProps> = ({
|
||||
const selectedItemIndex = rememberedLayout?.selectedItemIndex ?? SKELETON_NO_SELECTED_RAIL_ITEM_INDEX;
|
||||
const fluxerVisible = rememberedLayout?.fluxerVisible ?? !skeletonDirectMessagesDisabled();
|
||||
const favoritesVisible = rememberedLayout?.favoritesVisible ?? true;
|
||||
const discoveryVisible = rememberedLayout?.discoveryVisible ?? communityActionsAvailable;
|
||||
const discoveryVisible = rememberedLayout?.discoveryVisible ?? skeletonDiscoveryAvailable();
|
||||
const addGuildVisible = rememberedLayout?.addGuildVisible ?? communityActionsAvailable;
|
||||
const downloadVisible = rememberedLayout?.downloadVisible ?? SHOWS_DOWNLOAD_ACTION;
|
||||
const helpVisible = rememberedLayout?.helpVisible ?? true;
|
||||
|
||||
@@ -41,6 +41,7 @@ import {
|
||||
} from '@app/features/app/components/skeleton/SkeletonLayoutMemory';
|
||||
import {
|
||||
skeletonDirectMessagesDisabled,
|
||||
skeletonDiscoveryAvailable,
|
||||
skeletonGifEnabled,
|
||||
skeletonSelfHosted,
|
||||
skeletonSingleCommunityEnabled,
|
||||
@@ -182,7 +183,7 @@ function resolveRailProjection(layout: RememberedSkeletonGuildRailLayout | null)
|
||||
outageVisible: layout?.outageVisible ?? false,
|
||||
organizedItems: layout?.organizedItems ?? SKELETON_GUILD_RAIL_FALLBACK_ITEMS,
|
||||
selectedItemIndex: layout?.selectedItemIndex ?? NO_SELECTED_ROW_INDEX,
|
||||
discoveryVisible: layout?.discoveryVisible ?? communityActionsAvailable,
|
||||
discoveryVisible: layout?.discoveryVisible ?? skeletonDiscoveryAvailable(),
|
||||
addGuildVisible: layout?.addGuildVisible ?? communityActionsAvailable,
|
||||
downloadVisible: layout?.downloadVisible ?? SHOWS_DOWNLOAD_ACTION,
|
||||
helpVisible: layout?.helpVisible ?? true,
|
||||
|
||||
@@ -992,7 +992,7 @@ function parseGuildRailLayout(value: unknown, now: number): OptionalParseResult<
|
||||
typeof value.addGuildVisible !== 'boolean' ||
|
||||
typeof value.downloadVisible !== 'boolean' ||
|
||||
typeof value.helpVisible !== 'boolean' ||
|
||||
value.discoveryVisible !== value.addGuildVisible ||
|
||||
(value.discoveryVisible && !value.addGuildVisible) ||
|
||||
(!value.fluxerVisible && inlineDmRowCount > 0) ||
|
||||
!Array.isArray(value.organizedItems) ||
|
||||
value.organizedItems.length > SKELETON_GUILD_RAIL_ORGANIZED_VISUAL_ROW_LIMIT
|
||||
@@ -2842,7 +2842,7 @@ export function reportSkeletonGuildRailLayout(layout: Omit<RememberedSkeletonGui
|
||||
typeof layout.addGuildVisible !== 'boolean' ||
|
||||
typeof layout.downloadVisible !== 'boolean' ||
|
||||
typeof layout.helpVisible !== 'boolean' ||
|
||||
layout.discoveryVisible !== layout.addGuildVisible ||
|
||||
(layout.discoveryVisible && !layout.addGuildVisible) ||
|
||||
(!layout.fluxerVisible && inlineDmRowCount > 0) ||
|
||||
!Array.isArray(layout.organizedItems) ||
|
||||
!Array.isArray(layout.inlineDmUnreadFlags)
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import RuntimeConfig from '@app/features/app/state/RuntimeConfig';
|
||||
import {isDiscoveryAvailable} from '@app/features/app/utils/DiscoveryFeatures';
|
||||
import DeveloperOptions from '@app/features/devtools/state/DeveloperOptions';
|
||||
|
||||
export function skeletonSingleCommunityEnabled(): boolean {
|
||||
return RuntimeConfig.getSnapshotOrNull()?.community.single_community ?? false;
|
||||
}
|
||||
|
||||
export function skeletonDiscoveryAvailable(): boolean {
|
||||
const snapshot = RuntimeConfig.getSnapshotOrNull();
|
||||
return snapshot === null || isDiscoveryAvailable(snapshot);
|
||||
}
|
||||
|
||||
export function skeletonDirectMessagesDisabled(): boolean {
|
||||
return RuntimeConfig.getSnapshotOrNull()?.community.direct_messages_disabled ?? false;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import type {HandlerHost} from '@app/features/app/keybindings/keybind_manager/handlers/types';
|
||||
import {
|
||||
getMessagePermissions,
|
||||
requestAdjacentMessageReply,
|
||||
requestCopyMessageId,
|
||||
requestCopyMessageLink,
|
||||
@@ -26,7 +27,8 @@ export function registerMessageHandlers(host: HandlerHost, i18n: I18n): void {
|
||||
host.register('message_edit', ({type, context}) => {
|
||||
if (type !== 'press') return;
|
||||
const message = context?.focusedMessage ?? MessageFocus.getFocusedMessage();
|
||||
if (!message) return;
|
||||
if (!message?.isUserMessage()) return;
|
||||
if (!getMessagePermissions(message, context?.focusedChannel)?.canEditMessage) return;
|
||||
startMessageEdit(message);
|
||||
});
|
||||
host.register('message_delete', ({type, context}) => {
|
||||
|
||||
@@ -144,6 +144,39 @@ describe('applySnapshot', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('discovery', () => {
|
||||
test('treats an instance that does not report discovery as enabled', () => {
|
||||
RuntimeConfig.applySnapshot(runtimeSnapshotFromDiscovery(parsedDocument('legacy-discovery.test')));
|
||||
expect(RuntimeConfig.discoveryEnabled).toBe(true);
|
||||
expect(RuntimeConfig.discoveryAvailable).toBe(true);
|
||||
});
|
||||
|
||||
test('follows an instance that switches discovery off', () => {
|
||||
const document = discoveryDocument('no-discovery.test');
|
||||
RuntimeConfig.applySnapshot(
|
||||
runtimeSnapshotFromDiscovery(
|
||||
parseInstanceDiscoveryDocument({...document, features: {...document.features, discovery_enabled: false}}),
|
||||
),
|
||||
);
|
||||
expect(RuntimeConfig.discoveryEnabled).toBe(false);
|
||||
expect(RuntimeConfig.discoveryAvailable).toBe(false);
|
||||
});
|
||||
|
||||
test('keeps discovery unavailable on a single-community instance', () => {
|
||||
const document = discoveryDocument('single-community.test');
|
||||
RuntimeConfig.applySnapshot(
|
||||
runtimeSnapshotFromDiscovery(
|
||||
parseInstanceDiscoveryDocument({
|
||||
...document,
|
||||
community: {...document.community, single_community: true, single_community_guild_id: '1400000000000000001'},
|
||||
}),
|
||||
),
|
||||
);
|
||||
expect(RuntimeConfig.discoveryEnabled).toBe(true);
|
||||
expect(RuntimeConfig.discoveryAvailable).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('applySnapshotAndWaitForDesktop', () => {
|
||||
test('applies immediately when no desktop shell exposes the runtime bridge', async () => {
|
||||
await RuntimeConfig.applySnapshotAndWaitForDesktop({
|
||||
|
||||
@@ -26,6 +26,7 @@ import {
|
||||
usesUniqueUsernames,
|
||||
usesUsernameSignIn,
|
||||
} from '@app/features/app/utils/AccountIdentityFeatures';
|
||||
import {discoveryEnabledOf, isDiscoveryAvailable} from '@app/features/app/utils/DiscoveryFeatures';
|
||||
import DeveloperOptions from '@app/features/devtools/state/DeveloperOptions';
|
||||
import {Logger} from '@app/features/platform/utils/AppLogger';
|
||||
import {getElectronAPI} from '@app/features/ui/utils/NativeUtils';
|
||||
@@ -754,6 +755,14 @@ class RuntimeConfig {
|
||||
return this.features.emails_enabled;
|
||||
}
|
||||
|
||||
get discoveryEnabled(): boolean {
|
||||
return discoveryEnabledOf(this.features);
|
||||
}
|
||||
|
||||
get discoveryAvailable(): boolean {
|
||||
return isDiscoveryAvailable(this);
|
||||
}
|
||||
|
||||
get accountIdentity(): AccountIdentityMode {
|
||||
return accountIdentityOf(this.features);
|
||||
}
|
||||
|
||||
@@ -247,6 +247,10 @@ function readFeatures(value: unknown): InstanceFeatures {
|
||||
if (desktopModulesEnabled !== undefined) {
|
||||
features.desktop_modules_enabled = desktopModulesEnabled;
|
||||
}
|
||||
const discoveryEnabled = readOptionalBoolean(source, 'discovery_enabled', 'features.discovery_enabled');
|
||||
if (discoveryEnabled !== undefined) {
|
||||
features.discovery_enabled = discoveryEnabled;
|
||||
}
|
||||
const deletionGracePeriod = readOptionalBoundedInteger(
|
||||
source,
|
||||
'account_deletion_grace_period_hours',
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import type {InstanceCommunity, InstanceFeatures} from '@fluxer/schema/src/domains/instance/InstanceSchemas';
|
||||
|
||||
type DiscoveryFeatures = Pick<InstanceFeatures, 'discovery_enabled'>;
|
||||
|
||||
interface DiscoveryRuntime {
|
||||
readonly features: DiscoveryFeatures;
|
||||
readonly community: Pick<InstanceCommunity, 'single_community'>;
|
||||
}
|
||||
|
||||
export function discoveryEnabledOf(features: DiscoveryFeatures): boolean {
|
||||
return features.discovery_enabled !== false;
|
||||
}
|
||||
|
||||
export function isDiscoveryAvailable(runtime: DiscoveryRuntime): boolean {
|
||||
return !runtime.community.single_community && discoveryEnabledOf(runtime.features);
|
||||
}
|
||||
@@ -119,7 +119,7 @@ function useCommunityCardView(message: Message, sourceGuildId: string | null): C
|
||||
onlineCount: card.approximate_presence_count,
|
||||
memberCount: card.approximate_member_count,
|
||||
isMember: false,
|
||||
canJoin: card.discoverable && !RuntimeConfig.singleCommunityEnabled,
|
||||
canJoin: card.discoverable && RuntimeConfig.discoveryAvailable,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -164,6 +164,7 @@ export const LexicalChannelTextareaContent = observer(
|
||||
enableReply = true,
|
||||
enableEditLast = true,
|
||||
enableSlashCommands = true,
|
||||
submitOnEnter = true,
|
||||
draftChannelId,
|
||||
placeholder,
|
||||
bare = false,
|
||||
@@ -181,6 +182,7 @@ export const LexicalChannelTextareaContent = observer(
|
||||
enableReply?: boolean;
|
||||
enableEditLast?: boolean;
|
||||
enableSlashCommands?: boolean;
|
||||
submitOnEnter?: boolean;
|
||||
draftChannelId?: string;
|
||||
placeholder?: string;
|
||||
bare?: boolean;
|
||||
@@ -1396,7 +1398,7 @@ export const LexicalChannelTextareaContent = observer(
|
||||
specialMentionsAllowed={specialMentionsAllowed}
|
||||
channelId={channel.id}
|
||||
guildId={channel.guildId}
|
||||
submitOnEnter={!mobileLayout.enabled}
|
||||
submitOnEnter={submitOnEnter && !mobileLayout.enabled}
|
||||
maxWireLength={maxMessageLength}
|
||||
silentMessagePrefix={!isEditingMessageOnMobile}
|
||||
focusRingTarget={containerRef}
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import * as ChannelCommands from '@app/features/channel/commands/ChannelCommands';
|
||||
import type {Channel} from '@app/features/channel/models/Channel';
|
||||
import Channels from '@app/features/channel/state/Channels';
|
||||
import {useConfirmDeleteMyMessages} from '@app/features/guild/hooks/useConfirmDeleteMyMessages';
|
||||
import ThreadGuilds from '@app/features/threads/state/ThreadGuilds';
|
||||
import {ChannelTypes} from '@fluxer/constants/src/ChannelConstants';
|
||||
import {THREAD_PARENT_CHANNEL_TYPES} from '@fluxer/constants/src/ThreadConstants';
|
||||
import type {MessageDescriptor} from '@lingui/core';
|
||||
import {msg} from '@lingui/core/macro';
|
||||
import {useLingui} from '@lingui/react/macro';
|
||||
import {useCallback} from 'react';
|
||||
@@ -17,16 +21,32 @@ const DELETE_YOUR_MESSAGES_IN_THIS_CONVERSATION_DESCRIPTOR = msg({
|
||||
comment:
|
||||
'Confirmation modal title for the destructive "delete all my messages in this DM or group DM conversation" action.',
|
||||
});
|
||||
const DELETE_YOUR_MESSAGES_IN_THIS_THREAD_DESCRIPTOR = msg({
|
||||
message: 'Delete your messages in this thread?',
|
||||
comment:
|
||||
'Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.',
|
||||
});
|
||||
const THIS_WILL_PERMANENTLY_DELETE_EVERY_MESSAGE_YOU_HAVE_DESCRIPTOR = msg({
|
||||
message: 'This will permanently delete every message you have ever sent in this channel. This cannot be undone.',
|
||||
comment:
|
||||
'Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.',
|
||||
});
|
||||
const THIS_WILL_PERMANENTLY_DELETE_EVERY_MESSAGE_YOU_HAVE_IN_THIS_CHANNEL_AND_ITS_THREADS_DESCRIPTOR = msg({
|
||||
message:
|
||||
'This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone.',
|
||||
comment:
|
||||
'Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.',
|
||||
});
|
||||
const THIS_WILL_PERMANENTLY_DELETE_EVERY_MESSAGE_YOU_HAVE_IN_THIS_CONVERSATION_DESCRIPTOR = msg({
|
||||
message: 'This will permanently delete every message you have ever sent in this conversation. This cannot be undone.',
|
||||
comment:
|
||||
'Confirmation modal description warning that every message the caller has sent in a DM or group DM conversation will be deleted. Cannot be undone.',
|
||||
});
|
||||
const THIS_WILL_PERMANENTLY_DELETE_EVERY_MESSAGE_YOU_HAVE_IN_THIS_THREAD_DESCRIPTOR = msg({
|
||||
message: 'This will permanently delete every message you have ever sent in this thread. This cannot be undone.',
|
||||
comment:
|
||||
'Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.',
|
||||
});
|
||||
const DELETED_YOUR_MESSAGES_DESCRIPTOR = msg({
|
||||
message: 'Deleted your messages.',
|
||||
comment: 'Toast shown after the "delete my messages in channel" request succeeds.',
|
||||
@@ -41,22 +61,43 @@ const WE_COULDN_T_DELETE_YOUR_MESSAGES_RIGHT_NOW_DESCRIPTOR = msg({
|
||||
'Error modal body shown when the "delete my messages in channel" request failed. Encourages the user to retry.',
|
||||
});
|
||||
|
||||
function getConfirmDescriptors(channel: Channel | undefined): {
|
||||
title: MessageDescriptor;
|
||||
description: MessageDescriptor;
|
||||
} {
|
||||
if (channel?.type === ChannelTypes.DM || channel?.type === ChannelTypes.GROUP_DM) {
|
||||
return {
|
||||
title: DELETE_YOUR_MESSAGES_IN_THIS_CONVERSATION_DESCRIPTOR,
|
||||
description: THIS_WILL_PERMANENTLY_DELETE_EVERY_MESSAGE_YOU_HAVE_IN_THIS_CONVERSATION_DESCRIPTOR,
|
||||
};
|
||||
}
|
||||
if (channel?.isThread()) {
|
||||
return {
|
||||
title: DELETE_YOUR_MESSAGES_IN_THIS_THREAD_DESCRIPTOR,
|
||||
description: THIS_WILL_PERMANENTLY_DELETE_EVERY_MESSAGE_YOU_HAVE_IN_THIS_THREAD_DESCRIPTOR,
|
||||
};
|
||||
}
|
||||
if (channel && ThreadGuilds.isActive(channel.guildId) && THREAD_PARENT_CHANNEL_TYPES.has(channel.type)) {
|
||||
return {
|
||||
title: DELETE_YOUR_MESSAGES_IN_THIS_CHANNEL_DESCRIPTOR,
|
||||
description: THIS_WILL_PERMANENTLY_DELETE_EVERY_MESSAGE_YOU_HAVE_IN_THIS_CHANNEL_AND_ITS_THREADS_DESCRIPTOR,
|
||||
};
|
||||
}
|
||||
return {
|
||||
title: DELETE_YOUR_MESSAGES_IN_THIS_CHANNEL_DESCRIPTOR,
|
||||
description: THIS_WILL_PERMANENTLY_DELETE_EVERY_MESSAGE_YOU_HAVE_DESCRIPTOR,
|
||||
};
|
||||
}
|
||||
|
||||
export const useDeleteMyMessagesInChannel = () => {
|
||||
const {i18n} = useLingui();
|
||||
const confirmDelete = useConfirmDeleteMyMessages();
|
||||
return useCallback(
|
||||
(channelId: string) => {
|
||||
const channel = Channels.getChannel(channelId);
|
||||
const isPrivateConversation = channel?.type === ChannelTypes.DM || channel?.type === ChannelTypes.GROUP_DM;
|
||||
const title = isPrivateConversation
|
||||
? i18n._(DELETE_YOUR_MESSAGES_IN_THIS_CONVERSATION_DESCRIPTOR)
|
||||
: i18n._(DELETE_YOUR_MESSAGES_IN_THIS_CHANNEL_DESCRIPTOR);
|
||||
const description = isPrivateConversation
|
||||
? i18n._(THIS_WILL_PERMANENTLY_DELETE_EVERY_MESSAGE_YOU_HAVE_IN_THIS_CONVERSATION_DESCRIPTOR)
|
||||
: i18n._(THIS_WILL_PERMANENTLY_DELETE_EVERY_MESSAGE_YOU_HAVE_DESCRIPTOR);
|
||||
const {title, description} = getConfirmDescriptors(Channels.getChannel(channelId));
|
||||
confirmDelete({
|
||||
title: title,
|
||||
description: description,
|
||||
title: i18n._(title),
|
||||
description: i18n._(description),
|
||||
run: () => ChannelCommands.bulkDeleteMyMessages(channelId),
|
||||
toastText: i18n._(DELETED_YOUR_MESSAGES_DESCRIPTOR),
|
||||
errorTitle: i18n._(COULDN_T_DELETE_YOUR_MESSAGES_DESCRIPTOR),
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import RuntimeConfig from '@app/features/app/state/RuntimeConfig';
|
||||
import type {DiscoveryChannelPreview} from '@app/features/discovery/commands/DiscoveryCommands';
|
||||
import * as DiscoveryCommands from '@app/features/discovery/commands/DiscoveryCommands';
|
||||
import {AccountScopedWork} from '@app/features/platform/state/AccountScopedWork';
|
||||
import {failureCode} from '@app/features/platform/utils/ResponseInspection';
|
||||
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
|
||||
import {makeAutoObservable, observable, runInAction} from 'mobx';
|
||||
@@ -17,12 +19,16 @@ function entryKey(guildId: string, channelId: string): string {
|
||||
|
||||
class DiscoveryChannelPreviews {
|
||||
private entries = observable.map<string, DiscoveryChannelPreviewEntry>();
|
||||
private discoveryDisabled = false;
|
||||
private discoveryDisabledByApi = false;
|
||||
|
||||
constructor() {
|
||||
makeAutoObservable(this, {}, {autoBind: true});
|
||||
}
|
||||
|
||||
private get discoveryDisabled(): boolean {
|
||||
return !RuntimeConfig.discoveryEnabled || this.discoveryDisabledByApi;
|
||||
}
|
||||
|
||||
get(guildId: string, channelId: string): DiscoveryChannelPreviewEntry | undefined {
|
||||
return this.entries.get(entryKey(guildId, channelId));
|
||||
}
|
||||
@@ -39,7 +45,7 @@ class DiscoveryChannelPreviews {
|
||||
const code = failureCode(error);
|
||||
runInAction(() => {
|
||||
if (code === APIErrorCodes.DISCOVERY_DISABLED) {
|
||||
this.discoveryDisabled = true;
|
||||
this.discoveryDisabledByApi = true;
|
||||
this.entries.set(key, {status: 'unavailable'});
|
||||
} else if (code === APIErrorCodes.DISCOVERY_NOT_DISCOVERABLE) {
|
||||
this.entries.set(key, {status: 'unavailable'});
|
||||
@@ -50,6 +56,15 @@ class DiscoveryChannelPreviews {
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
reset(): void {
|
||||
this.entries.clear();
|
||||
this.discoveryDisabledByApi = false;
|
||||
}
|
||||
}
|
||||
|
||||
export default new DiscoveryChannelPreviews();
|
||||
const discoveryChannelPreviews = new DiscoveryChannelPreviews();
|
||||
|
||||
AccountScopedWork.registerCancellation(() => discoveryChannelPreviews.reset());
|
||||
|
||||
export default discoveryChannelPreviews;
|
||||
@@ -281,7 +281,7 @@ const ExpressionSourceGuildRow = observer(function ExpressionSourceGuildRow({
|
||||
modalKey,
|
||||
);
|
||||
}, [guild, kind, expressionName, i18n, onClose]);
|
||||
const canJoin = isDiscoverable && !RuntimeConfig.singleCommunityEnabled;
|
||||
const canJoin = isDiscoverable && RuntimeConfig.discoveryAvailable;
|
||||
const activate = isMember ? handleJump : canJoin ? handleJoin : null;
|
||||
const accessibleName = isMember
|
||||
? i18n._(GO_TO_NAMED_COMMUNITY_DESCRIPTOR, {communityName: guild.name})
|
||||
|
||||
@@ -170,6 +170,7 @@ export const ForumPostComposer = observer(({forum, initialTitle, onClose}: Forum
|
||||
enableReply={false}
|
||||
enableEditLast={false}
|
||||
enableSlashCommands={false}
|
||||
submitOnEnter={false}
|
||||
draftChannelId={draftKey}
|
||||
placeholder={i18n._(media ? D.POST_MEDIA_PLACEHOLDER_DESCRIPTOR : D.POST_MESSAGE_PLACEHOLDER_DESCRIPTOR)}
|
||||
bare
|
||||
|
||||
@@ -5,6 +5,7 @@ import {DesktopGuildSettingsView} from '@app/features/app/components/dialogs/com
|
||||
import {MobileGuildSettingsView} from '@app/features/app/components/dialogs/components/MobileGuildSettingsView';
|
||||
import * as Modal from '@app/features/app/components/dialogs/Modal';
|
||||
import {SettingsModalContainer} from '@app/features/app/components/dialogs/shared/SettingsModalLayout';
|
||||
import RuntimeConfig from '@app/features/app/state/RuntimeConfig';
|
||||
import GatewaySessions from '@app/features/gateway/transport/GatewaySessionPool';
|
||||
import GuildSettingsModalState from '@app/features/guild/state/GuildSettingsModal';
|
||||
import Guilds from '@app/features/guild/state/Guilds';
|
||||
@@ -35,6 +36,7 @@ export const GuildSettingsModal: React.FC<GuildSettingsModalProps> = observer(
|
||||
const {i18n} = useLingui();
|
||||
const guild = Guilds.getGuild(guildId);
|
||||
const [selectedTab, setSelectedTab] = useState<GuildSettingsTabType>(initialTabProp ?? 'overview');
|
||||
const discoveryEnabled = RuntimeConfig.discoveryEnabled;
|
||||
const availableTabs = useMemo(() => {
|
||||
const guildSettingsTabs = getGuildSettingsTabs(i18n);
|
||||
if (!guild) return guildSettingsTabs;
|
||||
@@ -48,9 +50,12 @@ export const GuildSettingsModal: React.FC<GuildSettingsModalProps> = observer(
|
||||
if (tab.requireFeature && !guild.features.has(tab.requireFeature)) {
|
||||
return false;
|
||||
}
|
||||
if (tab.requireDiscovery && !discoveryEnabled) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}, [guild, guildId, i18n.locale]);
|
||||
}, [discoveryEnabled, guild, guildId, i18n.locale]);
|
||||
|
||||
const mobileNav = useMobileNavigation<GuildSettingsTabType>();
|
||||
const mobileNavigateTo = mobileNav.navigateTo;
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "هل تريد حذف رسائلك في هذا المجتمع؟"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "هل تريد حذف رسائلك في هذه المحادثة؟"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "حذف رسائلك في هذا الموضوع؟"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "جارٍ القياس…"
|
||||
msgid "Media"
|
||||
msgstr "الوسائط"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "الوسائط"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "المقطع السابق"
|
||||
msgid "Media progress"
|
||||
msgstr "تقدّم تشغيل الوسائط"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "حجم الوسائط"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "سيؤدي هذا إلى إشعار <0>{memberCount, plural, zero {# ع
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "سيؤدي هذا إلى إشعار ما يصل إلى <0>{memberCount, plural, zero {# عضو متصل} one {عضو واحد متصل} two {عضوين متصلين} few {# أعضاء متصلين} many {# عضوًا متصلًا} other {# عضو متصل}}</0> في هذه القناة. هل أنت متأكد أنك تريد القيام بذلك؟"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "سيؤدي هذا إلى حذف كل رسالة أرسلتها بشكل دائم في هذه القناة وخيوطها. لا يمكن التراجع عن هذا الإجراء."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "سيؤدي هذا إلى حذف كل رسالة أرسلتها في هذ
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "سيؤدي هذا إلى حذف جميع الرسائل التي أرسلتها في هذه المحادثة نهائيًا. لا يمكن التراجع عن هذا الإجراء."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "سيؤدي هذا إلى حذف كل رسالة أرسلتها على الإطلاق في هذا الموضوع نهائيًا. لا يمكن التراجع عن هذا الإجراء."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "سيؤدي هذا إلى استبدال سمتك المخصصة الحالية. يمكنك تعديلها لاحقًا في {themeSettingsPath}."
|
||||
|
||||
@@ -1609,6 +1609,7 @@
|
||||
"This thread is locked. Only moderators can send messages.",
|
||||
"This username is already taken",
|
||||
"This username is available",
|
||||
"This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone.",
|
||||
"This {theOtherPlatform} template couldn't be read. It may use a format Fluxer doesn't support yet.",
|
||||
"Thread",
|
||||
"Thread created",
|
||||
@@ -2180,7 +2181,6 @@
|
||||
"{messageGroupSpacing}px",
|
||||
"{releaseChannel} Web {buildVersion}",
|
||||
"{resolution} {fps} FPS",
|
||||
["chat-settings-section","Media"],
|
||||
["keyboard-key-name","Delete"],
|
||||
["keyboard-key-name","End"],
|
||||
["keyboard-key-name","Home"],
|
||||
@@ -2834,7 +2834,6 @@
|
||||
"{zoomPercent}%",
|
||||
["accessibility-settings-section","Visual"],
|
||||
["chat-settings-section","Input"],
|
||||
["chat-settings-section","Media"],
|
||||
["community-settings-tab","Emoji"],
|
||||
["gamepad-button-name","Gamepad Back / Select"],
|
||||
["gamepad-button-name","Gamepad Guide"],
|
||||
@@ -3360,7 +3359,6 @@
|
||||
"{zoomPercent}%",
|
||||
["appearance-settings-section","Interface"],
|
||||
["channel-settings-tab","Webhooks"],
|
||||
["chat-settings-section","Media"],
|
||||
["community-settings-tab","Emoji"],
|
||||
["community-settings-tab","Stickers"],
|
||||
["community-settings-tab","Webhooks"],
|
||||
@@ -3920,7 +3918,6 @@
|
||||
"{renderedPresenceCount} online",
|
||||
"{resolution} {fps} FPS",
|
||||
"{zoomPercent}%",
|
||||
["chat-settings-section","Media"],
|
||||
["community-settings-tab","Emoji"],
|
||||
["keyboard-key-name","Delete"],
|
||||
["keyboard-key-name","End"],
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Да изтриеш ли съобщенията си в тази общ
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Да изтриеш ли съобщенията си в този разговор?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Изтрий съобщенията си в тази тема?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Измерване…"
|
||||
msgid "Media"
|
||||
msgstr "Медия"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Медия"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Предишна песен"
|
||||
msgid "Media progress"
|
||||
msgstr "Напредък на медията"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Размер на медия"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Това ще извести <0>{memberCount, plural, one {# член} o
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Това ще извести до <0>{memberCount, plural, one {# онлайн член} other {# онлайн членове}}</0> в този канал. Сигурен ли си, че искаш да го направиш?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Това ще изтрие завинаги всяко съобщение, което някога сте изпратили в този канал и неговите нишки. Това не може да бъде отменено."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Това ще изтрие завинаги всяко съобщени
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Това ще изтрие завинаги всяко съобщение, което си изпращал в този разговор. Това действие не може да бъде отменено."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Това ще изтрие завинаги всяко съобщение, което някога сте изпратили в тази нишка. Това не може да бъде отменено."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Това ще замени текущата ти персонализирана тема. Можеш да я редактираш по-късно в {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Smazat vaše zprávy v této komunitě?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Smazat vaše zprávy v této konverzaci?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Smazat zprávy v tomto vlákně?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Měření…"
|
||||
msgid "Media"
|
||||
msgstr "Média"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Média"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Předchozí skladba"
|
||||
msgid "Media progress"
|
||||
msgstr "Průběh přehrávání média"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Velikost médií"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Upozorníte tak <0>{memberCount, plural, one {# člena} few {# členy} m
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Upozorníte tak až <0>{memberCount, plural, one {# online člena} few {# online členy} many {# online člena} other {# online členů}}</0> v tomto kanálu. Opravdu to chcete udělat?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Tímto trvale smažete všechny zprávy, které jste kdy v tomto kanálu a jeho vláknech odeslali. To nelze vzít zpět."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Tímto trvale smažete všechny zprávy, které jste kdy odeslali v tomt
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Tímto trvale smažete všechny zprávy, které jste kdy odeslali v této konverzaci. Tuto akci nelze vrátit zpět."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Tímto trvale smažete všechny zprávy, které jste kdy v tomto vlákně poslali. Nelze to vzít zpět."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Tím se nahradí váš aktuální vlastní motiv. Upravit ho můžete později v {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Slet dine beskeder i dette fællesskab?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Slet dine beskeder i denne samtale?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Slet dine beskeder i denne tråd?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Måler…"
|
||||
msgid "Media"
|
||||
msgstr "Medier"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Medier"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Forrige nummer"
|
||||
msgid "Media progress"
|
||||
msgstr "Afspilningsposition"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Mediestørrelse"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Dette giver besked til <0>{memberCount, plural, one {# medlem} other {#
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Dette giver besked til op til <0>{memberCount, plural, one {# online medlem} other {# online medlemmer}}</0> i denne kanal. Er du sikker på, at du vil gøre dette?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Dette vil permanent slette alle beskeder, du nogensinde har sendt i denne kanal og dens tråde. Dette kan ikke fortrydes."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Dette vil slette alle de beskeder, du nogensinde har sendt i denne kanal
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Dette vil slette alle beskeder, du nogensinde har sendt i denne samtale, permanent. Dette kan ikke fortrydes."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Dette vil permanent slette alle beskeder, du nogensinde har sendt i denne tråd. Dette kan ikke fortrydes."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Dette vil erstatte dit nuværende tilpassede tema. Du kan redigere det senere under {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Eigene Nachrichten in dieser Community löschen?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Eigene Nachrichten in dieser Unterhaltung löschen?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Nachrichten in diesem Thread löschen?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Messung läuft…"
|
||||
msgid "Media"
|
||||
msgstr "Medien"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Medien"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Vorheriger Titel"
|
||||
msgid "Media progress"
|
||||
msgstr "Medienfortschritt"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Mediengröße"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Du benachrichtigst <0>{memberCount, plural, one {# Mitglied} other {# Mi
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Du benachrichtigst bis zu <0>{memberCount, plural, one {# Online-Mitglied} other {# Online-Mitglieder}}</0> in diesem Kanal. Möchtest du das wirklich tun?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Dadurch werden alle deine Nachrichten in diesem Kanal und seinen Threads dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Dadurch werden alle Nachrichten, die du jemals in diesem Kanal gesendet
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Dadurch werden alle Nachrichten, die du jemals in dieser Unterhaltung gesendet hast, dauerhaft gelöscht. Dies kann nicht rückgängig gemacht werden."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Dadurch werden alle deine Nachrichten in diesem Thread dauerhaft gelöscht. Das kann nicht rückgängig gemacht werden."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Dadurch wird dein aktuelles benutzerdefiniertes Design ersetzt. Du kannst es später unter {themeSettingsPath} bearbeiten."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Να διαγραφούν τα μηνύματά σας σε αυτήν
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Να διαγραφούν τα μηνύματά σας σε αυτήν τη συνομιλία;"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Διαγραφή μηνυμάτων σε αυτό το νήμα;"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Μέτρηση…"
|
||||
msgid "Media"
|
||||
msgstr "Πολυμέσα"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Πολυμέσα"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Προηγούμενο κομμάτι"
|
||||
msgid "Media progress"
|
||||
msgstr "Πρόοδος πολυμέσων"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Μέγεθος πολυμέσων"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Αυτό θα ειδοποιήσει <0>{memberCount, plural, one {# μ
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Αυτό θα ειδοποιήσει έως και <0>{memberCount, plural, one {# συνδεδεμένο μέλος} other {# συνδεδεμένα μέλη}}</0> σε αυτό το κανάλι. Είστε σίγουροι ότι θέλετε να το κάνετε;"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Αυτό θα διαγράψει μόνιμα κάθε μήνυμα που έχετε στείλει ποτέ σε αυτό το κανάλι και στα νήματά του. Αυτό δεν μπορεί να αναιρεθεί."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Αυτό θα διαγράψει οριστικά κάθε μήνυμα
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Αυτό θα διαγράψει οριστικά κάθε μήνυμα που έχετε στείλει ποτέ σε αυτήν τη συνομιλία. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Αυτό θα διαγράψει οριστικά κάθε μήνυμα που έχετε στείλει ποτέ σε αυτό το νήμα. Η ενέργεια αυτή δεν μπορεί να αναιρεθεί."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Αυτό θα αντικαταστήσει το τρέχον προσαρμοσμένο θέμα σας. Μπορείτε να το επεξεργαστείτε αργότερα στις {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Delete your messages in this community?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Delete your messages in this conversation?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Delete your messages in this thread?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Measuring…"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Media previous"
|
||||
msgid "Media progress"
|
||||
msgstr "Media progress"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Media size"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "This will notify <0>{memberCount, plural, one {# member} other {# member
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "This will permanently delete every message you have ever sent in this ch
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Delete your messages in this community?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Delete your messages in this conversation?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Delete your messages in this thread?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Measuring…"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Media previous"
|
||||
msgid "Media progress"
|
||||
msgstr "Media progress"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Media size"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "This will notify <0>{memberCount, plural, one {# member} other {# member
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "This will permanently delete every message you have ever sent in this ch
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "¿Eliminar tus mensajes en esta comunidad?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "¿Eliminar tus mensajes en esta conversación?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "¿Eliminar tus mensajes en este hilo?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Midiendo…"
|
||||
msgid "Media"
|
||||
msgstr "Archivos multimedia"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Archivos multimedia"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Pista anterior"
|
||||
msgid "Media progress"
|
||||
msgstr "Progreso del contenido multimedia"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Tamaño de los archivos multimedia"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Esto notificará a <0>{memberCount, plural, one {# miembro} many {# miem
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Esto notificará hasta a <0>{memberCount, plural, one {# miembro en línea} many {# miembros en línea} other {# miembros en línea}}</0> de este canal. ¿Seguro que quieres hacerlo?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Esto eliminará permanentemente todos los mensajes que hayas enviado en este canal y sus hilos. No se puede deshacer."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Esto eliminará permanentemente todos los mensajes que hayas enviado en
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Se eliminarán permanentemente todos los mensajes que hayas enviado en esta conversación. Esto no se puede deshacer."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Esto eliminará permanentemente todos los mensajes que hayas enviado en este hilo. No se puede deshacer."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Esto reemplazará tu tema personalizado actual. Puedes editarlo más tarde en {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "¿Eliminar tus mensajes en esta comunidad?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "¿Eliminar tus mensajes en esta conversación?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "¿Eliminar tus mensajes de este hilo?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Midiendo…"
|
||||
msgid "Media"
|
||||
msgstr "Archivos multimedia"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Archivos multimedia"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Pista anterior"
|
||||
msgid "Media progress"
|
||||
msgstr "Progreso del contenido multimedia"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Tamaño de los archivos multimedia"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Esto notificará a <0>{memberCount, plural, one {# miembro} many {# miem
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Esto notificará hasta a <0>{memberCount, plural, one {# miembro en línea} many {# miembros en línea} other {# miembros en línea}}</0> de este canal. ¿Seguro que quieres hacerlo?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Esto eliminará permanentemente todos los mensajes que hayas enviado en este canal y sus hilos. No se puede deshacer."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Se eliminarán permanentemente todos los mensajes que hayas enviado en e
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Se eliminarán permanentemente todos los mensajes que hayas enviado en esta conversación. Esta acción no se puede deshacer."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Esto eliminará permanentemente todos los mensajes que hayas enviado en este hilo. No se puede deshacer."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Esto reemplazará tu tema personalizado actual. Puedes editarlo más tarde en {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Poistetaanko viestisi tästä yhteisöstä?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Poistetaanko viestisi tästä keskustelusta?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Poistetaanko viestisi tässä keskustelussa?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Mitataan…"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Edellinen kappale"
|
||||
msgid "Media progress"
|
||||
msgstr "Median edistyminen"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Median koko"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Tämä lähettää ilmoituksen <0>{memberCount, plural, one {# jäsenell
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Tämä lähettää ilmoituksen enintään <0>{memberCount, plural, one {# paikalla olevalle jäsenelle} other {# paikalla olevalle jäsenelle}}</0> tällä kanavalla. Haluatko varmasti tehdä tämän?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Tämä poistaa pysyvästi kaikki viestisi tässä kanavassa ja sen ketjuissa. Tätä ei voi peruuttaa."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Tämä poistaa pysyvästi kaikki viestit, jotka olet lähettänyt täll
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Tämä poistaa pysyvästi kaikki viestit, jotka olet lähettänyt tässä keskustelussa. Toimintoa ei voi kumota."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Tämä poistaa pysyvästi kaikki viestit, jotka olet koskaan lähettänyt tässä keskustelussa. Tätä ei voi peruuttaa."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Tämä korvaa nykyisen mukautetun teemasi. Voit muokata sitä myöhemmin täällä: {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Supprimer vos messages dans cette communauté ?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Supprimer vos messages dans cette conversation ?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Supprimer vos messages dans ce fil de discussion ?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Mesure…"
|
||||
msgid "Media"
|
||||
msgstr "Médias"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Médias"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Piste précédente"
|
||||
msgid "Media progress"
|
||||
msgstr "Progression du média"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Taille des médias"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Cela va avertir <0>{memberCount, plural, one {# membre} many {# membres}
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Cela va avertir jusqu’à <0>{memberCount, plural, one {# membre en ligne} many {# membres en ligne} other {# membres en ligne}}</0> dans ce salon. Voulez-vous vraiment faire cela ?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Cela supprimera définitivement tous les messages que vous avez envoyés dans ce salon et ses fils. Cette action est irréversible."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Tous les messages que vous avez envoyés dans ce salon seront définitiv
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Tous les messages que vous avez envoyés dans cette conversation seront supprimés définitivement. Cette action est irréversible."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Cela supprimera définitivement tous les messages que vous avez envoyés dans ce fil. Cette action est irréversible."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Ceci remplacera votre thème personnalisé actuel. Vous pourrez le modifier plus tard dans {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "למחוק את ההודעות שלך בקהילה זו?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "למחוק את ההודעות שלך בשיחה זו?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "למחוק את ההודעות שלך בשרשור זה?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "מודד…"
|
||||
msgid "Media"
|
||||
msgstr "מדיה"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "מדיה"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "הרצועה הקודמת"
|
||||
msgid "Media progress"
|
||||
msgstr "התקדמות המדיה"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "גודל מדיה"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "פעולה זו תשלח התראה ל-<0>{memberCount, plural, one {#
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "פעולה זו תשלח התראה לעד <0>{memberCount, plural, one {# חבר מחובר} two {# חברים מחוברים} other {# חברים מחוברים}}</0> בערוץ זה. האם ברצונך להמשיך?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "פעולה זו תמחק לצמיתות כל הודעה ששלחת אי פעם בערוץ זה ובכל השרשורים שלו. לא ניתן יהיה לבטל פעולה זו."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "פעולה זו תמחק לצמיתות כל הודעה ששלחת אי
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "פעולה זו תמחק לצמיתות כל הודעה ששלחת אי פעם בשיחה זו. לא ניתן לבטל פעולה זו."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "פעולה זו תמחק לצמיתות כל הודעה ששלחת אי פעם בשרשור זה. לא ניתן יהיה לבטל פעולה זו."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "פעולה זו תחליף את העיצוב המותאם אישית הנוכחי שלך. תוכל לערוך אותו מאוחר יותר ב{themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "इस कम्युनिटी में अपने मैसे
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "इस बातचीत में अपने मैसेज मिटाएँ?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "इस थ्रेड में अपने संदेश हटाएं?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "मापा जा रहा है…"
|
||||
msgid "Media"
|
||||
msgstr "मीडिया"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "मीडिया"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "पिछला ट्रैक"
|
||||
msgid "Media progress"
|
||||
msgstr "मीडिया प्रगति"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "मीडिया का आकार"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "इससे इस चैनल में इस रोल वाले
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "इससे इस चैनल के अधिकतम <0>{memberCount, plural, =0 {# ऑनलाइन सदस्यों} one {# ऑनलाइन सदस्य} other {# ऑनलाइन सदस्यों}}</0> को सूचना मिलेगी। क्या आप वाकई ऐसा करना चाहते हैं?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "यह चैनल और इसकी थ्रेड्स में आपके द्वारा भेजे गए हर संदेश को स्थायी रूप से हटा देगा। इसे वापस नहीं लाया जा सकता।"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "इससे इस चैनल में आपके द्वार
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "इससे इस बातचीत में आपके द्वारा भेजे गए सभी मैसेज हमेशा के लिए मिट जाएंगे। इसे पहले जैसा नहीं किया जा सकता।"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "यह इस थ्रेड में आपके द्वारा भेजे गए हर संदेश को स्थायी रूप से हटा देगा। इसे वापस नहीं लाया जा सकता।"
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "इससे आपकी मौजूदा कस्टम थीम बदल जाएगी। आप इसे बाद में {themeSettingsPath} में एडिट कर सकते हैं।"
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Izbrisati vaše poruke u ovoj zajednici?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Izbrisati vaše poruke u ovom razgovoru?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Izbrisati svoje poruke u ovoj niti?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Mjerenje…"
|
||||
msgid "Media"
|
||||
msgstr "Mediji"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Mediji"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Prethodna pjesma"
|
||||
msgid "Media progress"
|
||||
msgstr "Napredak medija"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Veličina medija"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Ovo će obavijestiti <0>{memberCount, plural, one {# člana} few {# čla
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Ovo će obavijestiti do <0>{memberCount, plural, one {# člana na mreži} few {# člana na mreži} other {# članova na mreži}}</0> u ovom kanalu. Želite li to učiniti?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Ovo će trajno izbrisati svaku poruku koju ste ikada poslali u ovom kanalu i njegovim nitima. Ovo se ne može poništiti."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Ovo će trajno izbrisati svaku poruku koju ste ikada poslali u ovom kana
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Ovo će trajno izbrisati svaku poruku koju ste ikada poslali u ovom razgovoru. Ova se radnja ne može poništiti."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Ovo će trajno izbrisati svaku poruku koju ste ikada poslali u ovoj niti. Ovo se ne može poništiti."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Ovo će zamijeniti vašu trenutačnu prilagođenu temu. Možete je urediti kasnije u {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Törlöd az üzeneteidet ebből a közösségből?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Törlöd az üzeneteidet ebből a beszélgetésből?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Töröljem az üzeneteidet ebben a szálban?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Mérés…"
|
||||
msgid "Media"
|
||||
msgstr "Média"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Média"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Előző szám"
|
||||
msgid "Media progress"
|
||||
msgstr "Lejátszás folyamata"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Média mérete"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Ez értesíteni fogja a csatorna ezzel a szerepkörrel rendelkező <0>{m
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Ez legfeljebb <0>{memberCount, plural, one {# online tagot} other {# online tagot}}</0> fog értesíteni ebben a csatornában. Biztosan meg szeretnéd tenni?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Ez véglegesen törli az összes üzenetedet, amit valaha küldtél ebben a csatornában és a szálain. Ezt nem lehet visszavonni."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Ez véglegesen törli az összes üzenetet, amit valaha küldtél ebben
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Ez véglegesen törli az összes üzenetet, amit valaha küldtél ebben a beszélgetésben. Ez nem vonható vissza."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Ez véglegesen törli az összes üzenetet, amit valaha küldtél ebben a szálban. Ezt nem lehet visszavonni."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Ez felülírja az aktuális egyéni témát. Később szerkesztheted itt: {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Hapus pesanmu di komunitas ini?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Hapus pesanmu di percakapan ini?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Hapus pesan Anda di utas ini?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Mengukur…"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Trek sebelumnya"
|
||||
msgid "Media progress"
|
||||
msgstr "Progres media"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Ukuran media"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Ini akan memberi tahu <0>{memberCount, plural, other {# anggota}}</0> de
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Ini akan memberi tahu hingga <0>{memberCount, plural, other {# anggota online}}</0> di saluran ini. Kamu yakin ingin melakukannya?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Ini akan menghapus permanen setiap pesan yang pernah Anda kirim di saluran ini dan utasnya. Tindakan ini tidak dapat dibatalkan."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Ini akan menghapus secara permanen semua pesan yang pernah kamu kirim di
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Ini akan menghapus secara permanen semua pesan yang pernah kamu kirim di percakapan ini. Tindakan ini tidak dapat dibatalkan."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Ini akan menghapus permanen setiap pesan yang pernah Anda kirim di utas ini. Tindakan ini tidak dapat dibatalkan."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Ini akan mengganti tema kustommu saat ini. Kamu bisa mengeditnya nanti di {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Eliminare i tuoi messaggi in questa community?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Eliminare i tuoi messaggi in questa conversazione?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Eliminare i tuoi messaggi in questa conversazione?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Misurazione…"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Contenuti multimediali"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Traccia precedente"
|
||||
msgid "Media progress"
|
||||
msgstr "Avanzamento media"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Dimensione media"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Questo avviserà <0>{memberCount, plural, one {# membro} many {# membri}
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Questo avviserà fino a <0>{memberCount, plural, one {# membro online} many {# membri online} other {# membri online}}</0> in questo canale. Vuoi davvero farlo?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Questo eliminerà definitivamente ogni messaggio che hai inviato in questo canale e nelle sue discussioni. Non è possibile annullare questa operazione."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Verranno eliminati definitivamente tutti i messaggi che hai inviato in q
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Verranno eliminati definitivamente tutti i messaggi che hai inviato in questa conversazione. Questa azione non può essere annullata."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Questo eliminerà definitivamente ogni messaggio che hai inviato in questa conversazione. L'azione non può essere annullata."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Questo sostituirà il tuo tema personalizzato attuale. Potrai modificarlo in seguito in {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "このコミュニティの自分のメッセージを削除しますか
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "この会話の自分のメッセージを削除しますか?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "このスレッドのメッセージを削除しますか?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "測定中…"
|
||||
msgid "Media"
|
||||
msgstr "メディア"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "メディア"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "前のトラック"
|
||||
msgid "Media progress"
|
||||
msgstr "メディアの再生位置"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "メディアサイズ"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "このチャンネルでこのロールを持つ<0>{memberCount, plural,
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "このチャンネルの最大<0>{memberCount, plural, other {#人のオンラインメンバー}}</0>に通知が送信されます。よろしいですか?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "これにより、このチャンネルおよびそのスレッドであなたが送信したすべてのメッセージが完全に削除されます。この操作は元に戻せません。"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "このチャンネルであなたが送信したすべてのメッセー
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "この会話であなたが送信したすべてのメッセージが完全に削除されます。この操作は元に戻せません。"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "このスレッドであなたが送信したすべてのメッセージが完全に削除されます。この操作は元に戻せません。"
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "現在のカスタムテーマが上書きされます。テーマ設定は{themeSettingsPath}で後から編集できます。"
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "이 커뮤니티에서 내 메시지를 삭제할까요?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "이 대화에서 내 메시지를 삭제할까요?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "이 스레드의 메시지를 삭제하시겠어요?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "측정 중…"
|
||||
msgid "Media"
|
||||
msgstr "미디어"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "미디어"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "이전 트랙"
|
||||
msgid "Media progress"
|
||||
msgstr "미디어 진행률"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "미디어 크기"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "이 채널에서 이 역할을 가진 <0>{memberCount, plural, other {
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "이 채널의 최대 <0>{memberCount, plural, other {온라인 멤버 #명}}</0>에게 알림이 전송됩니다. 계속하시겠어요?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "이 작업은 채널 및 모든 스레드(활성 또는 보관됨)에 보낸 모든 메시지를 영구적으로 삭제합니다. 실행 취소가 불가능합니다."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "이 채널에서 회원님이 보낸 모든 메시지가 영구적으로
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "이 대화에서 회원님이 보낸 모든 메시지가 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "이 작업은 이 스레드에서 보낸 모든 메시지를 영구적으로 삭제합니다. 실행 취소할 수 없습니다."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "현재 사용 중인 테마를 대체합니다. 나중에 {themeSettingsPath}에서 수정할 수 있습니다."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Ištrinti savo žinutes šioje bendruomenėje?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Ištrinti savo žinutes šiame pokalbyje?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Ištrinti jūsų žinutes šioje temoje?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20718,12 +20723,6 @@ msgstr "Matuojama…"
|
||||
msgid "Media"
|
||||
msgstr "Medija"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Medija"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20801,11 +20800,6 @@ msgstr "Ankstesnis kūrinys"
|
||||
msgid "Media progress"
|
||||
msgstr "Medijos eiga"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Medijos dydis"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34957,6 +34951,11 @@ msgstr "Tai išsiųs pranešimą <0>{memberCount, plural, one {# nariui} few {#
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Tai išsiųs pranešimą iki <0>{memberCount, plural, one {# prisijungusio nario} few {# prisijungusių narių} many {# prisijungusio nario} other {# prisijungusių narių}}</0> šiame kanale. Ar tikrai norite tai padaryti?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Tai visam laikui ištrins kiekvieną jūsų kada nors šiame kanale ir jo gijose išsiųstą žinutę. Tai negali būti atšaukta."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34967,6 +34966,11 @@ msgstr "Tai visam laikui ištrins visas žinutes, kurias kada nors išsiuntėte
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Tai visam laikui ištrins visas žinutes, kurias kada nors išsiuntėte šiame pokalbyje. Šio veiksmo anuliuoti negalima."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Tai visam laikui ištrins kiekvieną jūsų kada nors šiame pokalbyje išsiųstą žinutę. Tai negali būti atšaukta."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Tai pakeis jūsų dabartinę pasirinktinę temą. Ją galėsite redaguoti vėliau čia: {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Je berichten in deze community verwijderen?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Je berichten in dit gesprek verwijderen?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Berichten in dit gesprek verwijderen?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Meten…"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Vorig nummer"
|
||||
msgid "Media progress"
|
||||
msgstr "Mediavoortgang"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Mediagrootte"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Dit stuurt een melding naar <0>{memberCount, plural, one {# lid} other {
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Dit stuurt een melding naar maximaal <0>{memberCount, plural, one {# online lid} other {# online leden}}</0> in dit kanaal. Weet je zeker dat je dit wilt doen?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Dit verwijdert permanent alle berichten die je ooit in dit kanaal en de bijbehorende threads hebt verzonden. Dit kan niet ongedaan worden gemaakt."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Hiermee worden alle berichten die je ooit in dit kanaal hebt verzonden,
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Hiermee worden alle berichten die je ooit in dit gesprek hebt verzonden permanent verwijderd. Dit kan niet ongedaan worden gemaakt."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Dit verwijdert permanent alle berichten die je ooit in dit gesprek hebt gestuurd. Dit kan niet ongedaan worden gemaakt."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Dit vervangt je huidige aangepaste thema. Je kunt het later bewerken via {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Slette meldingene dine i dette fellesskapet?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Slette meldingene dine i denne samtalen?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Slett meldingene dine i denne tråden?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Måler …"
|
||||
msgid "Media"
|
||||
msgstr "Medier"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Medier"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Forrige spor"
|
||||
msgid "Media progress"
|
||||
msgstr "Mediefremdrift"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Mediestørrelse"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Dette vil varsle <0>{memberCount, plural, one {# medlem} other {# medlem
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Dette vil varsle opptil <0>{memberCount, plural, one {# pålogget medlem} other {# påloggede medlemmer}}</0> i denne kanalen. Er du sikker på at du vil gjøre dette?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Dette vil permanent slette alle meldinger du noensinne har sendt i denne kanalen og dens tråder. Dette kan ikke angres."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Dette vil slette alle meldingene du har sendt i denne kanalen permanent.
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Dette vil slette alle meldingene du har sendt i denne samtalen permanent. Dette kan ikke angres."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Dette vil permanent slette alle meldinger du noensinne har sendt i denne tråden. Dette kan ikke angres."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Dette erstatter det nåværende egendefinerte temaet ditt. Du kan redigere det senere under {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Usunąć Twoje wiadomości w tej społeczności?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Usunąć Twoje wiadomości w tej rozmowie?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Usuń swoje wiadomości z tego wątku?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Pomiar…"
|
||||
msgid "Media"
|
||||
msgstr "Multimedia"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Multimedia"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Poprzedni utwór"
|
||||
msgid "Media progress"
|
||||
msgstr "Postęp odtwarzania"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Rozmiar multimediów"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Spowoduje to powiadomienie <0>{memberCount, plural, one {# członka} few
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Spowoduje to powiadomienie maksymalnie <0>{memberCount, plural, one {# członka online} few {# członków online} many {# członków online} other {# członka online}}</0> na tym kanale. Czy na pewno chcesz to zrobić?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Spowoduje to trwałe usunięcie wszystkich Twoich wiadomości wysłanych w tym kanale i jego wątkach. Tej operacji nie można cofnąć."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Spowoduje to trwałe usunięcie wszystkich wiadomości wysłanych przez
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Spowoduje to trwałe usunięcie wszystkich wiadomości wysłanych przez Ciebie w tej rozmowie. Tej operacji nie można cofnąć."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Spowoduje to trwałe usunięcie każdej wiadomości, którą kiedykolwiek wysłałeś w tym wątku. Tej operacji nie można cofnąć."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Spowoduje to zastąpienie Twojego obecnego motywu niestandardowego. Możesz go później edytować w {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Excluir suas mensagens nesta comunidade?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Excluir suas mensagens nesta conversa?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Apagar suas mensagens neste tópico?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Medindo…"
|
||||
msgid "Media"
|
||||
msgstr "Mídia"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Mídia"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Faixa anterior"
|
||||
msgid "Media progress"
|
||||
msgstr "Progresso da mídia"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Tamanho da mídia"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Isso vai notificar <0>{memberCount, plural, =0 {# membros} one {# membro
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Isso vai notificar até <0>{memberCount, plural, =0 {# membros online} one {# membro online} many {# membros online} other {# membros online}}</0> neste canal. Tem certeza de que deseja fazer isso?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Isso excluirá permanentemente todas as suas mensagens neste canal e em suas threads. Esta ação não pode ser desfeita."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Isso excluirá permanentemente todas as mensagens que você já enviou n
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Isso excluirá permanentemente todas as mensagens que você já enviou nesta conversa. Esta ação não pode ser desfeita."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Isso excluirá permanentemente todas as suas mensagens neste tópico. Esta ação não pode ser desfeita."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Isso substituirá seu tema personalizado atual. Você pode editá-lo mais tarde em {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Ștergi mesajele tale din această comunitate?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Ștergi mesajele tale din această conversație?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Ștergi mesajele tale din acest fir de discuție?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Se măsoară…"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Piesa anterioară"
|
||||
msgid "Media progress"
|
||||
msgstr "Progres media"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Dimensiune media"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Aceasta va notifica <0>{memberCount, plural, one {# membru} few {# membr
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Aceasta va notifica până la <0>{memberCount, plural, one {# membru online} few {# membri online} other {# de membri online}}</0> din acest canal. Ești sigur că vrei să faci asta?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Aceasta va șterge permanent fiecare mesaj pe care l-ai trimis vreodată în acest canal și în firele sale. Această acțiune nu poate fi anulată."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Aceasta va șterge definitiv toate mesajele pe care le-ai trimis vreodat
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Aceasta va șterge definitiv toate mesajele pe care le-ai trimis vreodată în această conversație. Această acțiune nu poate fi anulată."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Aceasta va șterge permanent toate mesajele pe care le-ai trimis vreodată în acest fir. Nu poate fi anulat."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Aceasta va înlocui tema ta personalizată actuală. O poți edita mai târziu în {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Удалить ваши сообщения в этом сообщест
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Удалить свои сообщения в этом чате?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Удалить ваши сообщения в этом чате?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Измерение…"
|
||||
msgid "Media"
|
||||
msgstr "Медиа"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Медиа"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Предыдущая дорожка"
|
||||
msgid "Media progress"
|
||||
msgstr "Ход воспроизведения"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Размер медиафайлов"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Это уведомит <0>{memberCount, plural, one {# участник
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Это уведомит до <0>{memberCount, plural, one {# участника онлайн} few {# участников онлайн} many {# участников онлайн} other {# участника онлайн}}</0> в этом канале. Вы уверены, что хотите это сделать?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Это навсегда удалит все ваши сообщения в этом канале и его ветках. Отменить это действие будет невозможно."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Это навсегда удалит все сообщения, кото
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Это навсегда удалит все сообщения, которые вы когда-либо отправляли в этом чате. Отменить это действие будет невозможно."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Это навсегда удалит все ваши сообщения в этом чате. Отменить это действие нельзя."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Это заменит вашу текущую тему. Вы сможете изменить её позже в {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Ta bort dina meddelanden i den här communityn?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Ta bort dina meddelanden i den här konversationen?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Radera dina meddelanden i den här tråden?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Mäter…"
|
||||
msgid "Media"
|
||||
msgstr "Medier"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Medier"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Föregående spår"
|
||||
msgid "Media progress"
|
||||
msgstr "Medieförlopp"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Mediestorlek"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Detta meddelar <0>{memberCount, plural, one {# medlem} other {# medlemma
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Detta meddelar upp till <0>{memberCount, plural, one {# medlem online} other {# medlemmar online}}</0> i den här kanalen. Är du säker på att du vill göra detta?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Detta kommer permanent att radera alla meddelanden du någonsin har skickat i den här kanalen och dess trådar. Detta kan inte ångras."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Detta kommer att radera alla meddelanden du någonsin har skickat i den
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Detta kommer att radera alla meddelanden du någonsin har skickat i den här konversationen permanent. Det går inte att ångra."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Detta kommer permanent att radera alla meddelanden du någonsin har skickat i den här tråden. Detta kan inte ångras."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Detta kommer att ersätta ditt nuvarande anpassade tema. Du kan redigera det senare i {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "ลบข้อความของคุณในคอมมูนิ
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "ลบข้อความของคุณในการสนทนานี้ใช่หรือไม่"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "ลบข้อความของคุณในเธรดนี้หรือไม่"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "กำลังวัด…"
|
||||
msgid "Media"
|
||||
msgstr "สื่อ"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "สื่อ"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "แทร็กก่อนหน้า"
|
||||
msgid "Media progress"
|
||||
msgstr "ความคืบหน้าของสื่อ"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "ขนาดสื่อ"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "ข้อความนี้จะแจ้งเตือน<0>{membe
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "ข้อความนี้จะแจ้งเตือน<0>{memberCount, plural, other {สมาชิกออนไลน์สูงสุด # คน}}</0>ในช่องนี้ คุณแน่ใจหรือไม่ว่าต้องการทำเช่นนี้"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "การดำเนินการนี้จะลบข้อความทั้งหมดที่คุณเคยส่งในช่องนี้และเธรดของช่องนี้อย่างถาวร ซึ่งไม่สามารถยกเลิกได้"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "ข้อความทั้งหมดที่คุณเคยส
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "ข้อความทั้งหมดที่คุณเคยส่งในการสนทนานี้จะถูกลบอย่างถาวร การดำเนินการนี้ไม่สามารถเลิกทำได้"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "การดำเนินการนี้จะลบข้อความทั้งหมดที่คุณเคยส่งในเธรดนี้อย่างถาวร ซึ่งไม่สามารถย้อนกลับได้"
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "การดำเนินการนี้จะแทนที่ธีมที่คุณกำหนดเองในปัจจุบัน คุณสามารถแก้ไขได้ในภายหลังที่ {themeSettingsPath}"
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Bu topluluktaki mesajlarınızı silmek istiyor musunuz?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Bu sohbetteki mesajlarınızı silmek istiyor musunuz?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Bu konudaki mesajlarını sil?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Ölçülüyor…"
|
||||
msgid "Media"
|
||||
msgstr "Medya"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Medya"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Önceki parça"
|
||||
msgid "Media progress"
|
||||
msgstr "Medya ilerlemesi"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Medya boyutu"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Bu işlem, bu kanalda bu role sahip <0>{memberCount, plural, one {# üye
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Bu işlem, bu kanaldaki en fazla <0>{memberCount, plural, one {# çevrimiçi üyeye} other {# çevrimiçi üyeye}}</0> bildirim gönderecek. Bunu yapmak istediğinizden emin misiniz?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Bu işlem, bu kanalda ve tüm başlattığınız başlıklarındaki tüm mesajlarınızı kalıcı olarak silecektir. Bu geri alınamaz."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Bu işlem, bu kanalda gönderdiğiniz tüm mesajları kalıcı olarak si
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Bu işlem, bu sohbette gönderdiğiniz tüm mesajları kalıcı olarak siler. Bu işlem geri alınamaz."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Bu işlem, bu başlıkta gönderdiğin tüm mesajları kalıcı olarak silecektir. Bu geri alınamaz."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Bu işlem mevcut özel temanızın yerini alacaktır. Daha sonra {themeSettingsPath} bölümünden düzenleyebilirsiniz."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Видалити ваші повідомлення в цій спіль
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Видалити ваші повідомлення в цій розмові?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Видалити ваші повідомлення в цьому чаті?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Вимірювання…"
|
||||
msgid "Media"
|
||||
msgstr "Медіа"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Медіа"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Попередня доріжка"
|
||||
msgid "Media progress"
|
||||
msgstr "Прогрес медіа"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Розмір медіафайлів"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Це сповістить <0>{memberCount, plural, one {# учасник
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Це сповістить до <0>{memberCount, plural, one {# учасника онлайн} few {# учасників онлайн} many {# учасників онлайн} other {# учасника онлайн}}</0> у цьому каналі. Ви впевнені, що хочете це зробити?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Це назавжди видалить усі ваші повідомлення в цьому каналі та його гілках. Цю дію не можна скасувати."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Це назавжди видалить усі повідомлення,
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Це назавжди видалить усі повідомлення, які ви коли-небудь надсилали в цій розмові. Цю дію не можна скасувати."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Це назавжди видалить усі ваші повідомлення в цьому чаті. Цю дію не можна скасувати."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Це замінить вашу поточну власну тему. Ви зможете змінити її пізніше в {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "Xóa tin nhắn của bạn trong cộng đồng này?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "Xóa tin nhắn của bạn trong cuộc trò chuyện này?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "Xóa tin nhắn của bạn trong luồng này?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "Đang đo…"
|
||||
msgid "Media"
|
||||
msgstr "Ảnh & video"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "Phương tiện"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "Bản nhạc trước"
|
||||
msgid "Media progress"
|
||||
msgstr "Tiến độ phát phương tiện"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "Kích thước phương tiện"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "Thao tác này sẽ thông báo cho <0>{memberCount, plural, other {# th
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "Thao tác này sẽ thông báo cho tối đa <0>{memberCount, plural, other {# thành viên đang trực tuyến}}</0> trong kênh này. Bạn có chắc chắn muốn làm vậy không?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "Thao tác này sẽ xóa vĩnh viễn mọi tin nhắn bạn từng gửi trong kênh này và các luồng của nó. Thao tác này không thể hoàn tác."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "Thao tác này sẽ xóa vĩnh viễn tất cả tin nhắn bạn đã g
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "Thao tác này sẽ xóa vĩnh viễn tất cả tin nhắn bạn đã gửi trong cuộc trò chuyện này. Không thể hoàn tác."
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "Thao tác này sẽ xóa vĩnh viễn mọi tin nhắn bạn từng gửi trong chuỗi này. Không thể hoàn tác."
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "Thao tác này sẽ thay thế chủ đề tùy chỉnh hiện tại của bạn. Bạn có thể chỉnh sửa sau trong {themeSettingsPath}."
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "删除你在此社区中的消息?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "删除你在此对话中的消息?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "删除此话题中的消息?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "正在测量…"
|
||||
msgid "Media"
|
||||
msgstr "媒体"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "媒体"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "上一曲"
|
||||
msgid "Media progress"
|
||||
msgstr "媒体播放进度"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "媒体大小"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "这会通知此频道中拥有此身份组的 <0>{memberCount, plural, o
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "这会通知此频道中最多 <0>{memberCount, plural, other {# 位在线成员}}</0>。确定要这样做吗?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "这将永久删除您在此频道及其所有帖子中发送的每条消息。此操作无法撤销。"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "此操作将永久删除你在此频道中发送过的所有消息,且
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "此操作将永久删除你在此对话中发送过的所有消息,且无法撤销。"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "这将永久删除您在此频道中发送的所有消息。此操作无法撤销。"
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "这会替换你当前的自定义主题。你之后可以在{themeSettingsPath}中编辑。"
|
||||
|
||||
+15
-11
@@ -12000,6 +12000,11 @@ msgstr "要刪除您在此社群中的訊息嗎?"
|
||||
msgid "Delete your messages in this conversation?"
|
||||
msgstr "要刪除您在此對話中的所有訊息嗎?"
|
||||
|
||||
#. Confirmation modal title for the destructive "delete all my messages in this thread" action. Also shown for forum and media posts.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "Delete your messages in this thread?"
|
||||
msgstr "刪除此串中的訊息嗎?"
|
||||
|
||||
#. Activity log detail line under a ban, shown when the ban also deleted the messages the banned user sent shortly before it. This matches the "Delete message history" choice in the ban dialog. "The member" is the banned user, a single person. {duration} is how far back from the ban the messages were deleted, shown as a full duration phrase such as "1 hour" or "7 days". The number and unit change at runtime, so do not put an article, adjective or case ending next to {duration} that has to agree with it. It continues the entry summary, so it has no subject. It is a past tense record of a change the actor in the summary already made, never an instruction to the reader. Do not write it as a command, a button label or in first or second person.
|
||||
#: src/features/guild/utils/guild_tabs/audit_log/AuditLogMemberMessages.ts
|
||||
msgid "Deleted {duration} of the member's recent message history"
|
||||
@@ -20717,12 +20722,6 @@ msgstr "正在測量…"
|
||||
msgid "Media"
|
||||
msgstr "媒體"
|
||||
|
||||
#. Chat settings section for image, video, embed, and media preferences.
|
||||
#: src/features/user/components/settings_utils/section_registry/ChatSettingsSections.ts
|
||||
msgctxt "chat-settings-section"
|
||||
msgid "Media"
|
||||
msgstr "媒體"
|
||||
|
||||
#. Settings search synonym. Used to match this term when the user types it in the settings search bar.
|
||||
#: src/features/user/components/settings_utils/search_index/ChatSettingsIndex.ts
|
||||
msgid "Media attachment buttons"
|
||||
@@ -20800,11 +20799,6 @@ msgstr "上一首"
|
||||
msgid "Media progress"
|
||||
msgstr "媒體播放進度"
|
||||
|
||||
#. 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/ChatSettingsSections.ts
|
||||
msgid "Media size"
|
||||
msgstr "媒體大小"
|
||||
|
||||
#: src/features/input/utils/KeybindUtils.ts
|
||||
msgctxt "keyboard-key-name"
|
||||
msgid "Media stop"
|
||||
@@ -34956,6 +34950,11 @@ msgstr "這會通知此頻道中擁有此身分組的<0>{memberCount, plural, on
|
||||
msgid "This will notify up to <0>{memberCount, plural, one {# online member} other {# online members}}</0> in this channel. Are you sure you want to do this?"
|
||||
msgstr "這會通知此頻道中最多<0>{memberCount, plural, one {# 位上線成員} other {# 位上線成員}}</0>。您確定要這麼做嗎?"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel and in all of its threads, active or archived, will be deleted. Also shown for forum and media channels, where the threads are their posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel and its threads. This cannot be undone."
|
||||
msgstr "這將永久刪除您在此頻道及其討論串中發送的所有訊息。此操作無法復原。"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this channel will be deleted. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this channel. This cannot be undone."
|
||||
@@ -34966,6 +34965,11 @@ msgstr "這會永久刪除您在此頻道中傳送過的所有訊息。此動作
|
||||
msgid "This will permanently delete every message you have ever sent in this conversation. This cannot be undone."
|
||||
msgstr "這會永久刪除您在此對話中傳送過的所有訊息。此動作無法復原。"
|
||||
|
||||
#. Confirmation modal description warning that every message the caller has sent in this thread will be deleted. Also shown for forum and media posts. Cannot be undone.
|
||||
#: src/features/channel/hooks/useDeleteMyMessagesInChannel.tsx
|
||||
msgid "This will permanently delete every message you have ever sent in this thread. This cannot be undone."
|
||||
msgstr "這將永久刪除您在此討論串中發送的所有訊息。此操作無法復原。"
|
||||
|
||||
#: src/features/theme/components/modals/ThemeAcceptModal.tsx
|
||||
msgid "This will replace your current custom theme. You can edit it later in {themeSettingsPath}."
|
||||
msgstr "這會取代您目前的自訂主題。之後您可以在{themeSettingsPath}中編輯。"
|
||||
|
||||
@@ -55,7 +55,7 @@ function isWebAppHost(host: string): boolean {
|
||||
|
||||
function isPageAvailable(page: AppPageDefinition): boolean {
|
||||
if (page.id === 'plutonium') return shouldShowPremiumFeatures();
|
||||
if (page.id === 'discovery') return !RuntimeConfig.singleCommunityEnabled;
|
||||
if (page.id === 'discovery') return RuntimeConfig.discoveryAvailable;
|
||||
if (page.id === 'direct_messages') return !RuntimeConfig.directMessagesDisabled;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ export function getDirectMessagesFallbackPath(): string {
|
||||
if (Accessibility.showFavorites) {
|
||||
return Routes.FAVORITES;
|
||||
}
|
||||
if (!RuntimeConfig.singleCommunityEnabled) {
|
||||
if (RuntimeConfig.discoveryAvailable) {
|
||||
return Routes.DISCOVER;
|
||||
}
|
||||
return Routes.ME;
|
||||
|
||||
@@ -110,7 +110,7 @@ function buildForwardGroupDMCandidates(i18n: I18n): ReadonlyArray<ForwardGroupDM
|
||||
return Object.freeze(candidates);
|
||||
}
|
||||
|
||||
function isForwardableThread(thread: Channel): boolean {
|
||||
export function isForwardableThread(thread: Channel): boolean {
|
||||
if (!ThreadGuilds.isActive(thread.guildId) || ChannelThreads.getThread(thread.id) == null) return false;
|
||||
if (thread.isArchived && thread.isLocked) return false;
|
||||
return ThreadMemberships.isMember(thread.id) || canJoinThreadChannel(thread);
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {ConfirmModal} from '@app/features/app/components/dialogs/ConfirmModal';
|
||||
import {useDeleteMyMessagesInChannel} from '@app/features/channel/hooks/useDeleteMyMessagesInChannel';
|
||||
import type {Channel} from '@app/features/channel/models/Channel';
|
||||
import {DELETE_MY_MESSAGES_DESCRIPTOR} from '@app/features/channel/utils/ChannelMessageDescriptors';
|
||||
import {CHANNEL_RECORD_DESCRIPTOR, RecordDebugModal} from '@app/features/devtools/components/debug/RecordDebugModal';
|
||||
import {
|
||||
COPY_LINK_DESCRIPTOR as D_COPY_THREAD_LINK_DESCRIPTOR,
|
||||
@@ -129,6 +131,7 @@ export function buildThreadNotificationItems(i18n: I18n, thread: Channel): Array
|
||||
|
||||
export function useThreadMenuData(thread: Channel, {onClose}: {onClose: () => void}): {groups: Array<MenuGroupType>} {
|
||||
const {i18n} = useLingui();
|
||||
const deleteMyMessagesInChannel = useDeleteMyMessagesInChannel();
|
||||
const joined = ThreadMemberships.isMember(thread.id);
|
||||
const muted = ThreadMemberships.isMuted(thread.id);
|
||||
const moderator = isThreadModeratorFor(thread);
|
||||
@@ -261,7 +264,15 @@ export function useThreadMenuData(thread: Channel, {onClose}: {onClose: () => vo
|
||||
},
|
||||
});
|
||||
}
|
||||
if (manageItems.length > 0) groups.push({items: manageItems});
|
||||
manageItems.push({
|
||||
icon: <DeleteIcon size={20} data-flx="threads.use-thread-menu-data.delete-icon" />,
|
||||
label: i18n._(DELETE_MY_MESSAGES_DESCRIPTOR),
|
||||
danger: true,
|
||||
onClick: () => {
|
||||
ModalCommands.runAfterBottomSheetClose(onClose, () => deleteMyMessagesInChannel(thread.id));
|
||||
},
|
||||
});
|
||||
groups.push({items: manageItems});
|
||||
const copyItems: Array<MenuSheetItem> = [
|
||||
{
|
||||
icon: <CopyLinkIcon size={20} data-flx="threads.use-thread-menu-data.copy-link-icon" />,
|
||||
|
||||
@@ -431,7 +431,7 @@ export function useChannelMenuData(
|
||||
|
||||
if (guild && (state.isTextChannel || state.isVoiceChannel || state.isLinkChannel || channel.isThreadOnly())) {
|
||||
const voiceItems: Array<MenuItemType> = [];
|
||||
if (state.isVoiceChannel && !Accessibility.voiceChannelJoinRequiresDoubleClick) {
|
||||
if (state.isVoiceChannel) {
|
||||
voiceItems.push({
|
||||
icon: <MessageUserIcon size={20} data-flx="ui.action-menu.items.channel-menu-data.groups.open-chat-icon" />,
|
||||
label: i18n._(OPEN_CHAT_DESCRIPTOR),
|
||||
@@ -612,7 +612,7 @@ export function useChannelMenuData(
|
||||
danger: true,
|
||||
});
|
||||
}
|
||||
if (state.isTextChannel || state.isVoiceChannel) {
|
||||
if (state.isTextChannel || state.isVoiceChannel || channel.isThreadOnly()) {
|
||||
destructiveItems.push({
|
||||
icon: <DeleteIcon size={20} data-flx="ui.action-menu.items.channel-menu-data.groups.delete-icon--3" />,
|
||||
label: i18n._(DELETE_MY_MESSAGES_DESCRIPTOR),
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import {Routes} from '@app/app/Routes';
|
||||
import {GuildSettingsModal, UserSettingsModal} from '@app/features/app/components/dialogs/LoadableSettingsModals';
|
||||
import RuntimeConfig from '@app/features/app/state/RuntimeConfig';
|
||||
import Authentication from '@app/features/auth/state/Authentication';
|
||||
import {CategoryCreateModal} from '@app/features/channel/components/modals/CategoryCreateModal';
|
||||
import {ChannelCreateModal} from '@app/features/channel/components/modals/ChannelCreateModal';
|
||||
@@ -284,6 +285,7 @@ export function useGuildMenuData(guild: Guild, options: UseGuildMenuDataOptions)
|
||||
}),
|
||||
[channels, deleteMyMessagesInGuild, guild, i18n.locale, leaveGuild, onClose],
|
||||
);
|
||||
const discoveryEnabled = RuntimeConfig.discoveryEnabled;
|
||||
const availableSettingsTabs = useMemo(() => {
|
||||
const allTabs = getGuildSettingsTabs(i18n);
|
||||
return allTabs.filter((tab) => {
|
||||
@@ -296,9 +298,12 @@ export function useGuildMenuData(guild: Guild, options: UseGuildMenuDataOptions)
|
||||
if (tab.requireFeature && !guild.features.has(tab.requireFeature)) {
|
||||
return false;
|
||||
}
|
||||
if (tab.requireDiscovery && !discoveryEnabled) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}, [guild.features, guild.id, i18n.locale]);
|
||||
}, [discoveryEnabled, guild.features, guild.id, i18n.locale]);
|
||||
const groups = useMemo(() => {
|
||||
const menuGroups: Array<MenuGroupType> = [];
|
||||
const quickActions: Array<MenuItemType | MenuSubmenuItemType> = [];
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {IS_DEV} from '@app/features/platform/types/Env';
|
||||
import {isElectron} from '@app/features/ui/utils/ElectronRuntime';
|
||||
import {makeAutoObservable} from 'mobx';
|
||||
|
||||
const IDLE_DURATION_MS = 1000 * (IS_DEV ? 10 : 60 * 10);
|
||||
@@ -12,6 +13,7 @@ interface DesktopIdleApi {
|
||||
}
|
||||
|
||||
function getDesktopIdleApi(): Required<DesktopIdleApi> | null {
|
||||
if (!isElectron()) return null;
|
||||
const electronApi = (
|
||||
window as {
|
||||
electron?: DesktopIdleApi | null;
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {afterEach, expect, it, vi} from 'vitest';
|
||||
|
||||
afterEach(async () => {
|
||||
const {default: Idle} = await import('@app/features/ui/state/Idle');
|
||||
Idle.destroy();
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
it('checks idle state on its timer when there is no window', async () => {
|
||||
vi.useFakeTimers();
|
||||
const {default: Idle} = await import('@app/features/ui/state/Idle');
|
||||
expect(typeof window).toBe('undefined');
|
||||
|
||||
await vi.advanceTimersByTimeAsync(11 * 60 * 1000);
|
||||
|
||||
expect(Idle.isIdle()).toBe(true);
|
||||
});
|
||||
@@ -357,7 +357,7 @@ export const UserProfileActionsSheet: React.FC<UserProfileActionsSheetProps> = o
|
||||
},
|
||||
]
|
||||
: []),
|
||||
...(showReportUserProfile
|
||||
...(showReportUserProfile && !user.system
|
||||
? [
|
||||
{
|
||||
icon: <FlagIcon className={styles.icon} data-flx="user.user-profile-actions-sheet.icon--12" />,
|
||||
@@ -385,7 +385,9 @@ export const UserProfileActionsSheet: React.FC<UserProfileActionsSheetProps> = o
|
||||
});
|
||||
}
|
||||
}
|
||||
menuGroups.push({items: reportBlockItems});
|
||||
if (reportBlockItems.length > 0) {
|
||||
menuGroups.push({items: reportBlockItems});
|
||||
}
|
||||
}
|
||||
return (
|
||||
<MenuBottomSheet
|
||||
|
||||
@@ -321,9 +321,6 @@ export const UserProfileModal: UserProfileModalComponent = observer(
|
||||
}
|
||||
};
|
||||
const renderBlockMenuItem = (onClose: () => void) => {
|
||||
if (displayUser?.system) {
|
||||
return null;
|
||||
}
|
||||
switch (relationshipType) {
|
||||
case RelationshipTypes.BLOCKED:
|
||||
return (
|
||||
@@ -449,7 +446,7 @@ export const UserProfileModal: UserProfileModalComponent = observer(
|
||||
</MenuItem>
|
||||
</MenuGroup>
|
||||
)}
|
||||
{!isCurrentUser && (
|
||||
{!isCurrentUser && !displayUser.system && (
|
||||
<MenuGroup data-flx="user.user-profile-modal.open-more-options-menu.menu-group--5">
|
||||
<MenuItem
|
||||
icon={<FlagIcon data-flx="user.user-profile-modal.open-more-options-menu.flag-icon" />}
|
||||
|
||||
@@ -114,6 +114,7 @@ export interface GuildSettingsTab {
|
||||
iconWeight?: IconWeight;
|
||||
permission?: bigint | ReadonlyArray<bigint>;
|
||||
requireFeature?: string;
|
||||
requireDiscovery?: boolean;
|
||||
}
|
||||
|
||||
interface GuildSettingsTabDescriptor {
|
||||
@@ -124,6 +125,7 @@ interface GuildSettingsTabDescriptor {
|
||||
iconWeight?: IconWeight;
|
||||
permission?: bigint | ReadonlyArray<bigint>;
|
||||
requireFeature?: string;
|
||||
requireDiscovery?: boolean;
|
||||
}
|
||||
|
||||
const GUILD_SETTINGS_TABS_DESCRIPTORS: Array<GuildSettingsTabDescriptor> = [
|
||||
@@ -176,6 +178,7 @@ const GUILD_SETTINGS_TABS_DESCRIPTORS: Array<GuildSettingsTabDescriptor> = [
|
||||
icon: CompassIcon,
|
||||
iconWeight: 'fill',
|
||||
permission: Permissions.MANAGE_GUILD,
|
||||
requireDiscovery: true,
|
||||
},
|
||||
{
|
||||
type: 'vanity_url',
|
||||
|
||||
-4
@@ -469,7 +469,6 @@ export const chatSettingsIndex: Array<SearchableSettingDescriptor> = [
|
||||
{
|
||||
id: 'chat-settings-auto-send-gifs',
|
||||
tabType: 'chat_settings',
|
||||
sectionId: 'media',
|
||||
label: AUTOMATICALLY_SEND_GIFS_WHEN_SELECTED_DESCRIPTOR,
|
||||
keywords: [
|
||||
ANIMATION_DESCRIPTOR,
|
||||
@@ -487,7 +486,6 @@ export const chatSettingsIndex: Array<SearchableSettingDescriptor> = [
|
||||
{
|
||||
id: 'chat-settings-save-gif-favorites',
|
||||
tabType: 'chat_settings',
|
||||
sectionId: 'media',
|
||||
label: SAVE_GIF_FAVORITES_AS_SAVED_MEDIA_DESCRIPTOR,
|
||||
keywords: [
|
||||
ANIMATION_DESCRIPTOR,
|
||||
@@ -508,7 +506,6 @@ export const chatSettingsIndex: Array<SearchableSettingDescriptor> = [
|
||||
{
|
||||
id: 'chat-settings-media-buttons',
|
||||
tabType: 'chat_settings',
|
||||
sectionId: 'media',
|
||||
label: MEDIA_BUTTONS_DESCRIPTOR,
|
||||
keywords: [
|
||||
MEDIA_ATTACHMENT_BUTTONS_DESCRIPTOR,
|
||||
@@ -750,7 +747,6 @@ export const chatSettingsIndex: Array<SearchableSettingDescriptor> = [
|
||||
{
|
||||
id: 'chat-settings-sequential-file-send',
|
||||
tabType: 'advanced_settings',
|
||||
sectionId: 'chat',
|
||||
label: SEQUENTIAL_FILE_SEND_DESCRIPTOR,
|
||||
keywords: [
|
||||
SEQUENTIAL_SEND_DESCRIPTOR,
|
||||
|
||||
+9
-28
@@ -116,10 +116,6 @@ const INLINE_DESCRIPTOR = msg({
|
||||
message: 'Inline',
|
||||
comment: 'Settings search synonym. Used to match this term when the user types it in the settings search bar.',
|
||||
});
|
||||
const MEDIA_SIZE_DESCRIPTOR = msg({
|
||||
message: 'Media size',
|
||||
comment: 'Settings search synonym. Used to match this term when the user types it in the settings search bar.',
|
||||
});
|
||||
const AUTOCOMPLETE_DESCRIPTOR = msg({
|
||||
message: 'Autocomplete',
|
||||
comment: 'Settings search synonym. Used to match this term when the user types it in the settings search bar.',
|
||||
@@ -174,11 +170,6 @@ const DISPLAY_DESCRIPTOR = msg({
|
||||
context: 'chat-settings-section',
|
||||
comment: 'Chat settings section for message display preferences.',
|
||||
});
|
||||
const MEDIA_DESCRIPTOR = msg({
|
||||
message: 'Media',
|
||||
context: 'chat-settings-section',
|
||||
comment: 'Chat settings section for image, video, embed, and media preferences.',
|
||||
});
|
||||
|
||||
const MANAGE_MESSAGES_PERMISSION_DESCRIPTOR = getPermissionTitleDescriptor(Permissions.MANAGE_MESSAGES)!;
|
||||
export const chatSettingsSections = [
|
||||
@@ -194,10 +185,19 @@ export const chatSettingsSections = [
|
||||
INLINE_MEDIA_DESCRIPTOR,
|
||||
EMBEDDED_MEDIA_DESCRIPTOR,
|
||||
UPLOADED_MEDIA_DESCRIPTOR,
|
||||
MEDIA_2_DESCRIPTOR,
|
||||
INLINE_DESCRIPTOR,
|
||||
IMAGES_DESCRIPTOR,
|
||||
VIDEOS_DESCRIPTOR,
|
||||
ATTACHMENTS_DESCRIPTOR,
|
||||
LINK_PREVIEWS_DESCRIPTOR,
|
||||
WEBSITE_PREVIEWS_DESCRIPTOR,
|
||||
SHOW_EMBEDS_DESCRIPTOR,
|
||||
EMBEDS_DESCRIPTOR,
|
||||
PREVIEWS_DESCRIPTOR,
|
||||
LINKS_DESCRIPTOR,
|
||||
URL_PREVIEW_DESCRIPTOR,
|
||||
LINK_PREVIEW_DESCRIPTOR,
|
||||
SPOILERS_DESCRIPTOR,
|
||||
SPOILER_DESCRIPTOR,
|
||||
HIDE_DESCRIPTOR,
|
||||
@@ -241,23 +241,4 @@ export const chatSettingsSections = [
|
||||
isAdvanced: false,
|
||||
tags: ['chat'],
|
||||
},
|
||||
{
|
||||
id: 'media',
|
||||
tabType: 'chat_settings',
|
||||
label: MEDIA_DESCRIPTOR,
|
||||
keywords: [
|
||||
EMBEDS_DESCRIPTOR,
|
||||
PREVIEWS_DESCRIPTOR,
|
||||
LINKS_DESCRIPTOR,
|
||||
URL_PREVIEW_DESCRIPTOR,
|
||||
LINK_PREVIEW_DESCRIPTOR,
|
||||
MEDIA_2_DESCRIPTOR,
|
||||
IMAGES_DESCRIPTOR,
|
||||
VIDEOS_DESCRIPTOR,
|
||||
ATTACHMENTS_DESCRIPTOR,
|
||||
INLINE_DESCRIPTOR,
|
||||
MEDIA_SIZE_DESCRIPTOR,
|
||||
],
|
||||
isAdvanced: false,
|
||||
},
|
||||
] as const satisfies ReadonlyArray<SectionDefinition>;
|
||||
@@ -1,8 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
readonly ELECTRON_VERSION=44.4.1
|
||||
readonly ELECTRON_REVISION=09d1a6590e3148a1a2132b07a5b107b7c2414191
|
||||
readonly ELECTRON_VERSION=44.9.1
|
||||
readonly ELECTRON_REVISION=e02265be96c5e13ae43644ef482b718e1e800499
|
||||
readonly DEPOT_TOOLS_REVISION=889099791deff38466d471fa6590951c91a1d8ab
|
||||
readonly BUILD_IMAGE='ghcr.io/electron/build:daad061f4b99a0ae1c841be4aa09188280a9c8a4@sha256:7a161ad561103ebbfb5ff18eaf47cb579ca0c528bb7ec9ed8cad30a41d5fa63e'
|
||||
readonly PATCH_NAME=fix_synchronize_vaapi_surfaces_before_output.patch
|
||||
@@ -13,13 +13,13 @@ die() { printf 'Error: %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
usage() {
|
||||
cat <<'USAGE'
|
||||
Build patched Electron 44.4.1 on a Linux x64 host with Podman or Docker.
|
||||
Build patched Electron 44.9.1 on a Linux x64 host with Podman or Docker.
|
||||
|
||||
Usage: build-linux.sh [--arch x64|arm64|all] [--build-root PATH] [--output-dir PATH] [--check]
|
||||
|
||||
--arch Target architecture; all builds x64 then arm64 (default: all).
|
||||
--build-root Dedicated persistent cache, source and output tree.
|
||||
Default: ${XDG_CACHE_HOME:-$HOME/.cache}/fluxer/electron-44.4.1
|
||||
Default: ${XDG_CACHE_HOME:-$HOME/.cache}/fluxer/electron-44.9.1
|
||||
--output-dir Distribution ZIPs and .fluxer.json manifests (default: BUILD_ROOT/artifacts).
|
||||
--check Validate host resources and configuration without pulling or compiling.
|
||||
|
||||
|
||||
+2
-2
@@ -650,9 +650,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustls-webpki"
|
||||
version = "0.103.15"
|
||||
version = "0.103.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2"
|
||||
checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281"
|
||||
dependencies = [
|
||||
"ring",
|
||||
"rustls-pki-types",
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "24.13.5",
|
||||
"electron": "44.4.1",
|
||||
"electron": "44.9.1",
|
||||
"electron-builder": "27.0.0-alpha.8",
|
||||
"esbuild": "catalog:",
|
||||
"typescript": "catalog:ts7"
|
||||
|
||||
@@ -6,8 +6,8 @@ const path = require('node:path');
|
||||
const {promisify} = require('node:util');
|
||||
|
||||
const execFileAsync = promisify(execFile);
|
||||
const expectedElectronVersion = '44.4.1';
|
||||
const expectedElectronRevision = '09d1a6590e3148a1a2132b07a5b107b7c2414191';
|
||||
const expectedElectronVersion = '44.9.1';
|
||||
const expectedElectronRevision = 'e02265be96c5e13ae43644ef482b718e1e800499';
|
||||
const chromiumPatchPath = path.join(
|
||||
__dirname,
|
||||
'../electron/patches/fix_synchronize_vaapi_surfaces_before_output.patch',
|
||||
@@ -89,12 +89,7 @@ async function verifyLinuxElectronArchive(directory, arch) {
|
||||
throw new Error(`Custom Electron manifest ${field} must be ${JSON.stringify(expected)}: ${manifestPath}`);
|
||||
}
|
||||
}
|
||||
const patchSha256 = await sha256File(chromiumPatchPath);
|
||||
const acceptedPatchSha256s = new Set([patchSha256]);
|
||||
if (patchSha256 === '21ea23b8a566f3f2dbdb69d0b361039dd9128c5e34a7ae89a8a61d7099808b8e') {
|
||||
acceptedPatchSha256s.add('d39d05d4a00cd09eca43c7cd83383eaefa18cae7ec1b7efc26987bdc0f23c83e');
|
||||
}
|
||||
if (!acceptedPatchSha256s.has(manifest?.chromiumPatchSha256)) {
|
||||
if ((await sha256File(chromiumPatchPath)) !== manifest?.chromiumPatchSha256) {
|
||||
throw new Error(`Custom Electron manifest chromiumPatchSha256 does not match the current patch: ${manifestPath}`);
|
||||
}
|
||||
if (!/^[a-f0-9]{64}$/.test(manifest.archiveSha256)) {
|
||||
|
||||
@@ -20,6 +20,7 @@ import {HttpStatus, MimeType} from '@fluxer/constants/src/HttpConstants';
|
||||
import {DESKTOP_RUNTIME_DISCOVERY_UNREACHABLE_ERROR_NAME} from '@fluxer/desktop_ipc/src/LocalAppRuntimeContract';
|
||||
import {
|
||||
buildInstanceDiscoveryCandidates,
|
||||
InstanceDiscoveryOriginMismatchError,
|
||||
parseInstanceDiscoveryDocument,
|
||||
requireDiscoveryDeclaresItsOwnOrigin,
|
||||
} from '@fluxer/instance_bootstrap/src/Discovery';
|
||||
@@ -79,6 +80,15 @@ class DesktopRuntimeDiscoveryFailedError extends Error {
|
||||
}
|
||||
}
|
||||
|
||||
class DesktopRuntimeDiscoveryDeclaredElsewhereError extends DesktopRuntimeDiscoveryFailedError {
|
||||
public readonly declaredApiEndpoint: string;
|
||||
|
||||
public constructor(apiEndpoint: string, attempts: ReadonlyArray<DiscoveryAttempt>, declaredApiEndpoint: string) {
|
||||
super(apiEndpoint, attempts);
|
||||
this.declaredApiEndpoint = declaredApiEndpoint;
|
||||
}
|
||||
}
|
||||
|
||||
class DesktopRuntimeDiscoveryUnreachableError extends DesktopRuntimeDiscoveryFailedError {
|
||||
public constructor(apiEndpoint: string, attempts: ReadonlyArray<DiscoveryAttempt>) {
|
||||
super(apiEndpoint, attempts);
|
||||
@@ -98,9 +108,28 @@ export async function resolveDesktopRuntimePlan({
|
||||
input,
|
||||
signal,
|
||||
}: ResolveDesktopRuntimeConfigInput): Promise<LocalAppRuntimePlan> {
|
||||
try {
|
||||
return await resolveDesktopRuntimePlanAt(input, signal);
|
||||
} catch (error) {
|
||||
if (!(error instanceof DesktopRuntimeDiscoveryDeclaredElsewhereError)) {
|
||||
throw error;
|
||||
}
|
||||
log.info('Instance discovery declared another API origin, resolving that instance', {
|
||||
input,
|
||||
declaredApiEndpoint: error.declaredApiEndpoint,
|
||||
});
|
||||
return resolveDesktopRuntimePlanAt(error.declaredApiEndpoint, signal, true);
|
||||
}
|
||||
}
|
||||
|
||||
async function resolveDesktopRuntimePlanAt(
|
||||
input: string,
|
||||
signal: AbortSignal | null,
|
||||
followed = false,
|
||||
): Promise<LocalAppRuntimePlan> {
|
||||
const apiEndpoint = requireDesktopRuntimeAPIEndpoint(input);
|
||||
const anchorOrigin = requireDesktopHTTPOrigin(new URL(apiEndpoint).origin);
|
||||
const resolved = await fetchRuntimePlan(apiEndpoint, anchorOrigin, signal);
|
||||
const resolved = await fetchRuntimePlan(apiEndpoint, anchorOrigin, signal, followed);
|
||||
let anchorRequirement: DesktopAddressRequirement;
|
||||
try {
|
||||
anchorRequirement = await getDesktopOutboundHTTP().registerAnchoredOrigins({
|
||||
@@ -147,9 +176,11 @@ async function fetchRuntimePlan(
|
||||
apiEndpoint: string,
|
||||
anchorOrigin: string,
|
||||
signal: AbortSignal | null,
|
||||
followed: boolean,
|
||||
): Promise<ResolvedRuntimePlan> {
|
||||
const candidates = buildInstanceDiscoveryCandidates({input: apiEndpoint});
|
||||
const attempts: Array<DiscoveryAttempt> = [];
|
||||
let declaredApiEndpoint: string | null = null;
|
||||
let instanceUnreachable = candidates.length > 0;
|
||||
for (const url of candidates) {
|
||||
let document: unknown;
|
||||
@@ -165,10 +196,16 @@ async function fetchRuntimePlan(
|
||||
return {plan, served: {url, document}, rememberedAnchorRequirement: null, attempts};
|
||||
} catch (error) {
|
||||
instanceUnreachable = false;
|
||||
if (error instanceof InstanceDiscoveryOriginMismatchError) {
|
||||
declaredApiEndpoint ??= error.declared;
|
||||
}
|
||||
attempts.push({url, reason: error instanceof Error ? error.message : String(error)});
|
||||
}
|
||||
}
|
||||
if (!instanceUnreachable) {
|
||||
if (declaredApiEndpoint !== null && !followed) {
|
||||
throw new DesktopRuntimeDiscoveryDeclaredElsewhereError(apiEndpoint, attempts, declaredApiEndpoint);
|
||||
}
|
||||
throw new DesktopRuntimeDiscoveryFailedError(apiEndpoint, attempts);
|
||||
}
|
||||
const lastServed = await readLastServedDiscovery(apiEndpoint);
|
||||
|
||||
@@ -103,11 +103,45 @@ describe('desktop discovery for an account stored on the migrated official domai
|
||||
});
|
||||
}
|
||||
|
||||
test('another instance that serves a foreign API is still refused', async () => {
|
||||
network.served.set('https://chat.example.test', officialDocument('https://web.fluxer.app'));
|
||||
test('an alias domain that declares another API resolves the instance it declares', async () => {
|
||||
network.served.set('https://domain2.example.test', officialDocument('https://domain1.example.test'));
|
||||
network.served.set('https://domain1.example.test', officialDocument('https://domain1.example.test'));
|
||||
|
||||
await assert.rejects(resolveDesktopRuntimePlan({input: 'https://chat.example.test/api', signal: null}), {
|
||||
const plan = await resolveDesktopRuntimePlan({input: 'https://domain2.example.test/api', signal: null});
|
||||
|
||||
assert.equal(plan.instanceKey, 'https://domain1.example.test/api');
|
||||
assert.equal(plan.endpoints.apiEndpoint, 'https://domain1.example.test/api');
|
||||
assert.equal(network.anchored.length, 1);
|
||||
assert.equal(network.anchored[0].anchorOrigin, 'https://domain1.example.test');
|
||||
assert.deepEqual(
|
||||
network.fetched
|
||||
.filter((request) => new URL(request.url).origin === 'https://domain1.example.test')
|
||||
.map((request) => request.expectedOrigin),
|
||||
['https://domain1.example.test'],
|
||||
);
|
||||
});
|
||||
|
||||
test('the declared instance must declare itself, so a chain stops after one hop', async () => {
|
||||
network.served.set('https://a.example.test', officialDocument('https://b.example.test'));
|
||||
network.served.set('https://b.example.test', officialDocument('https://c.example.test'));
|
||||
network.served.set('https://c.example.test', officialDocument('https://c.example.test'));
|
||||
|
||||
await assert.rejects(resolveDesktopRuntimePlan({input: 'https://a.example.test/api', signal: null}), {
|
||||
name: 'DesktopRuntimeDiscoveryFailedError',
|
||||
});
|
||||
assert.equal(
|
||||
network.fetched.some((request) => new URL(request.url).origin === 'https://c.example.test'),
|
||||
false,
|
||||
);
|
||||
assert.equal(network.anchored.length, 0);
|
||||
});
|
||||
|
||||
test('a declared instance that serves no discovery is refused', async () => {
|
||||
network.served.set('https://chat.example.test', officialDocument('https://gone.example.test'));
|
||||
|
||||
await assert.rejects(resolveDesktopRuntimePlan({input: 'https://chat.example.test/api', signal: null}), {
|
||||
name: /DesktopRuntimeDiscovery/,
|
||||
});
|
||||
assert.equal(network.anchored.length, 0);
|
||||
});
|
||||
});
|
||||
@@ -618,7 +618,7 @@ Deleting a guild channel destroys the channel record, every message in it, every
|
||||
| Field | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| silent?<sup>1</sup> | boolean | Whether to suppress the leave system message of a group direct message (default false) |
|
||||
| delete_messages?<sup>1</sup> | boolean | Whether to delete the caller's own messages in this channel first (default false) |
|
||||
| delete_messages?<sup>1</sup> | boolean | Whether to delete the caller's own messages in this channel and its threads first (default false) |
|
||||
|
||||
<sup>1</sup> Only the exact trimmed values `true`, `True`, and `1` are true. An absent parameter and every other value, including `TRUE` and `yes`, are false
|
||||
|
||||
@@ -681,7 +681,7 @@ Remaining recipients receive [Channel Recipient Remove](/gateway/events/#channel
|
||||
|
||||
Leaving as the final recipient permanently deletes the channel's messages and the channel record, with no system message.
|
||||
|
||||
Setting `delete_messages` deletes the caller's authored messages in this channel after sudo verification and before the channel operation runs, and the response waits for that deletion to finish.
|
||||
Setting `delete_messages` deletes the caller's authored messages in this channel and its threads after sudo verification and before the channel operation runs, and the response waits for that deletion to finish.
|
||||
|
||||
### Rate limit
|
||||
|
||||
|
||||
@@ -98,6 +98,6 @@ A route every deployment registers can still produce a different answer on a sel
|
||||
|
||||
Premium state is the clearest case. Every deployment registers [Get premium state](/http-api/premium/#get-premium-state) and [Set premium perks disabled](/http-api/premium/#set-premium-perks-disabled). A self-hosted instance still reports premium state and still records the perks-disabled flag. The response repeats the deployment kind in `self_hosted` on the [effective premium state object](/http-api/premium/#effective-premium-state-object). That flag alone does not make `is_premium` true. A self-hosted deployment grants premium to every account only while its instance [premium mode](/admin-api/instance/#premium-modes) is `everyone`. That mode also overrides the perks-disabled flag, so `is_premium` stays true while `premium_perks_disabled` is true.
|
||||
|
||||
The other instance feature flags published by [instance discovery](/http-api/instance/#instance-features-object) work the same way. `voice_enabled`, `presigned_attachment_uploads`, and `emails_enabled` each report whether a capability is switched on. The routes for that capability stay registered when the flag is false, so a client reads the flag before it uses them.
|
||||
The other instance feature flags published by [instance discovery](/http-api/instance/#instance-features-object) work the same way. `voice_enabled`, `presigned_attachment_uploads`, `emails_enabled`, and `discovery_enabled` each report whether a capability is switched on. The routes for that capability stay registered when the flag is false, so a client reads the flag before it uses them.
|
||||
|
||||
`account_identity` is the same kind of flag. Every deployment registers the email routes and the username-only routes alike. A `username` deployment answers the email routes with 400 `EMAIL_UNAVAILABLE_ON_INSTANCE`, and an `email` deployment answers the username-only routes with 400 `USERNAME_SIGN_IN_ONLY`. A hosted deployment is always `email`.
|
||||
@@ -146,6 +146,7 @@ Deployment-wide switches a client reads before it offers a feature, plus whether
|
||||
| account_identity<sup>5</sup> | string | How members sign in, one of the [account identity modes](#account-identity-modes) |
|
||||
| tag_style<sup>6</sup> | string | How usernames are tagged, one of the [tag styles](#tag-styles) |
|
||||
| desktop_modules_enabled? | boolean | Whether desktop clients may load downloadable modules |
|
||||
| discovery_enabled?<sup>7</sup> | boolean | Whether community discovery is enabled |
|
||||
| account_deletion_grace_period_hours? | integer | Hours between a deletion request and the permanent deletion of the account (1-8,760) |
|
||||
| max_background_gateway_connections? | integer | Maximum Gateway connections a client may keep open for background accounts (0-64) |
|
||||
|
||||
@@ -161,6 +162,8 @@ Deployment-wide switches a client reads before it offers a feature, plus whether
|
||||
|
||||
<sup>6</sup> Always `none` on a `username` deployment. Always `random` on a hosted deployment and on an instance that existed before the field. A client treats a missing value as `random`
|
||||
|
||||
<sup>7</sup> A client treats a missing value as true
|
||||
|
||||
A deployment that reports `emails_enabled` as false sends no verification, password recovery, or IP authorisation message, and the flows that depend on one are unusable there. [Deployment availability](/http-api/deployment-availability/) states which routes a self-hosted deployment does not serve at all.
|
||||
|
||||
### Account identity modes
|
||||
|
||||
@@ -1754,7 +1754,9 @@ It emits no [Channel Pins Update](/gateway/events/#channel-pins-update) and no i
|
||||
|
||||
<RouteHeader method="POST" path="/v1/channels/{channel_id}/messages/bulk-delete-mine" bot mfa />
|
||||
|
||||
Deletes every message the caller authored in one channel. Returns 202 with an empty body. Emits a [Message Delete Bulk](/gateway/events/#message-delete-bulk) Gateway event.
|
||||
Deletes every message the caller authored in one channel and in every thread under it, active or archived. Returns 202 with an empty body. Emits a [Message Delete Bulk](/gateway/events/#message-delete-bulk) Gateway event in each channel and thread that held such messages.
|
||||
|
||||
When `channel_id` is a thread, only that thread is cleared. For a forum or media channel, the deleted messages are the ones in its posts.
|
||||
|
||||
### Limitations
|
||||
|
||||
@@ -1762,7 +1764,6 @@ Deletes every message the caller authored in one channel. Returns 202 with an em
|
||||
- The caller must be able to resolve the channel and be in [sudo mode](/http-api/users/mfa/#sudo-mode), established by the `X-Fluxer-Sudo-Mode-JWT` header or by supplying a proof in the body.
|
||||
- A caller who satisfies none of those receives 403 `SUDO_MODE_REQUIRED` with `has_mfa` and the available `methods`, which report `totp`, `webauthn`, and `backup_codes`.
|
||||
- An account that holds no verifiable credential at all, meaning it is not a bot, has no TOTP secret, no registered WebAuthn credential, and no stored password, satisfies the sudo requirement with an empty body.
|
||||
- A thread is a separate channel. The operation leaves the caller's messages in the threads of the channel, and a forum or media channel has no message of its own to delete.
|
||||
|
||||
The deletion runs inside the request despite the 202 status, so every matching message is gone by the time the response is returned.
|
||||
|
||||
@@ -1770,7 +1771,7 @@ The deletion runs inside the request despite the 202 status, so every matching m
|
||||
|
||||
| Field | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| channel_id | snowflake | The ID of the channel whose caller-authored messages are deleted |
|
||||
| channel_id | snowflake | The ID of the channel or thread whose caller-authored messages are deleted |
|
||||
|
||||
### Request headers
|
||||
|
||||
@@ -1872,7 +1873,6 @@ Pins a `DEFAULT` or `REPLY` message. Returns 204 with an empty body on success.
|
||||
### Limitations
|
||||
|
||||
- A guild caller requires [PIN_MESSAGES](/http-api/permissions/) and channel access.
|
||||
- A guild caller without [READ_MESSAGE_HISTORY](/http-api/permissions/) can pin only a message on or after the guild's message history cutoff.
|
||||
- A one-to-one direct message caller must satisfy the recipient's direct message policy, and one who may not send fails with 400 `CANNOT_SEND_MESSAGES_TO_USER`.
|
||||
- A one-to-one direct message pin is refused with 403 `NEW_CONVERSATIONS_LIMITED` when the caller is under a [new conversation limit](/http-api/users/private-channels/#new-conversation-limit), the recipient is not a friend or a bot, and the recipient has not written in that direct message.
|
||||
- A group direct message and the personal notes channel apply no send policy.
|
||||
@@ -1899,7 +1899,7 @@ Pins a `DEFAULT` or `REPLY` message. Returns 204 with an empty body on success.
|
||||
| 403 | [error response](/http-api/#error-response) | Caller lacks `VIEW_CHANNEL` or `PIN_MESSAGES` and the request returns `MISSING_PERMISSIONS`, or message sending is temporarily disabled for the guild and the request returns `FEATURE_TEMPORARILY_DISABLED` |
|
||||
| 403 | [error response](/http-api/#error-response) | The caller is under a new conversation limit in a direct message the recipient has not written in, and the request returns `NEW_CONVERSATIONS_LIMITED` |
|
||||
| 403 | [error response](/http-api/#error-response) | Caller is timed out in a thread and the request returns `COMMUNICATION_DISABLED` |
|
||||
| 404 | [error response](/http-api/#error-response) | Channel or message does not exist, or the message is outside the caller's message history cutoff |
|
||||
| 404 | [error response](/http-api/#error-response) | Channel or message does not exist |
|
||||
|
||||
### Side effects
|
||||
|
||||
@@ -1944,7 +1944,7 @@ Unpins a message. Returns 204 with an empty body on success. Emits [Message Upda
|
||||
| 400 | [error response](/http-api/#error-response) | Thread is locked and the caller is not a thread moderator, returning `THREAD_LOCKED` |
|
||||
| 403 | [error response](/http-api/#error-response) | Caller lacks `VIEW_CHANNEL` or `PIN_MESSAGES` and the request returns `MISSING_PERMISSIONS`, or message sending is temporarily disabled for the guild and the request returns `FEATURE_TEMPORARILY_DISABLED` |
|
||||
| 403 | [error response](/http-api/#error-response) | Caller is timed out in a thread and the request returns `COMMUNICATION_DISABLED` |
|
||||
| 404 | [error response](/http-api/#error-response) | Channel or message does not exist, or the message is outside the caller's message history cutoff |
|
||||
| 404 | [error response](/http-api/#error-response) | Channel or message does not exist |
|
||||
|
||||
### Side effects
|
||||
|
||||
|
||||
@@ -660,7 +660,7 @@ Files a report about another user's profile from the reporter's answers to the `
|
||||
### Limitations
|
||||
|
||||
- A reporter naming their own account receives 400 `CANNOT_REPORT_YOURSELF`.
|
||||
- A `user_id` that resolves to no account returns 404 `UNKNOWN_USER`.
|
||||
- A `user_id` that resolves to no account, or to the system account, returns 404 `UNKNOWN_USER`.
|
||||
- A `guild_id` that resolves to no guild, or to a guild the reporter is not a member of, returns 404 `UNKNOWN_GUILD`.
|
||||
|
||||
Fluxer checks the answers right after the claimed account and verified email checks, before the report ban check and before it looks up the user. An invalid walk still counts against the `report:create` bucket but not against the per-reporter allowance below.
|
||||
@@ -689,7 +689,7 @@ Fluxer checks the answers right after the claimed account and verified email che
|
||||
| 403 | [error response](/http-api/#error-response) | The credential is a bot token or OAuth2 bearer and the request returns `ACCESS_DENIED` |
|
||||
| 403 | [error response](/http-api/#error-response) | Its email is unverified and the request returns `REPORT_EMAIL_VERIFICATION_REQUIRED` |
|
||||
| 403 | [error response](/http-api/#error-response) | The account is report banned and the request returns `REPORT_BANNED` |
|
||||
| 404 | [error response](/http-api/#error-response) | The reported user does not exist and the request returns `UNKNOWN_USER` |
|
||||
| 404 | [error response](/http-api/#error-response) | The reported user does not exist or is the system account, and the request returns `UNKNOWN_USER` |
|
||||
| 404 | [error response](/http-api/#error-response) | The supplied `guild_id` is not a guild the reporter is in and the request returns `UNKNOWN_GUILD` |
|
||||
| 409 | [error response](/http-api/#error-response) | The answers came from an outdated flow and do not fit the current one, returning `REPORT_FLOW_OUTDATED` |
|
||||
| 409<sup>1</sup> | [error response](/http-api/#error-response) | The reporter already reported this user within 24 hours, returning `CONFLICT` |
|
||||
|
||||
Loaded 100 of 107 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user