mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-07 19:22:14 +09:00
feat(web): prepare the fluxer.com domain migration (#2952)
This commit is contained in:
@@ -19,6 +19,8 @@ const DEFAULT_PASSKEY_ORIGINS = [
|
||||
'https://fluxer.app',
|
||||
'https://web.fluxer.app',
|
||||
'https://web.canary.fluxer.app',
|
||||
'https://fluxer.com',
|
||||
'https://canary.fluxer.com',
|
||||
'android:apk-key-hash:keSY4bimyLqZQV7bKXgpa2xYuqXi0qZJzsYtp6gpx7w',
|
||||
];
|
||||
|
||||
@@ -106,6 +108,7 @@ function defaultConfig(): MasterConfig {
|
||||
presigned_attachment_uploads_enabled: false,
|
||||
presigned_harvest_downloads_enabled: true,
|
||||
unfurl_ignored_hosts: [],
|
||||
app_origin_aliases: [],
|
||||
embeds: {
|
||||
oembed_html_enabled: false,
|
||||
oembed_html_allow_untrusted_on_self_hosted: false,
|
||||
@@ -491,6 +494,21 @@ function validateStorageChangeFeedConfig(config: MasterConfig): void {
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeAppOriginAliases(config: MasterConfig): void {
|
||||
const api = config.services.api;
|
||||
api.app_origin_aliases = [
|
||||
...new Set(
|
||||
api.app_origin_aliases.map((alias, index) => {
|
||||
const origin = parseWebOrigin(alias);
|
||||
if (!origin) {
|
||||
throw new Error(`FLUXER_APP_ORIGIN_ALIASES entry ${index + 1} must be an HTTP(S) origin`);
|
||||
}
|
||||
return origin.origin;
|
||||
}),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
function validateCachePurgeConfig(config: MasterConfig): void {
|
||||
const cachePurge = config.integrations.cache_purge;
|
||||
if (cachePurge.adapter !== 'http') {
|
||||
@@ -582,6 +600,7 @@ function normalizeConfig(config: MasterConfig): MasterConfig {
|
||||
validateApiWorkerConfig(config);
|
||||
validateStorageChangeFeedConfig(config);
|
||||
validateCachePurgeConfig(config);
|
||||
normalizeAppOriginAliases(config);
|
||||
assertIntegerInRange(config.services.api.max_inflight_requests, 'FLUXER_API_MAX_INFLIGHT_REQUESTS', 1, 100_000);
|
||||
assertIntegerInRange(config.services.api.headers_timeout_ms, 'FLUXER_API_HEADERS_TIMEOUT_MS', 1_000, 3_600_000);
|
||||
assertIntegerInRange(config.services.api.request_timeout_ms, 'FLUXER_API_REQUEST_TIMEOUT_MS', 1_000, 3_600_000);
|
||||
|
||||
@@ -94,6 +94,7 @@ export interface MasterConfig {
|
||||
presigned_attachment_uploads_enabled: boolean;
|
||||
presigned_harvest_downloads_enabled: boolean;
|
||||
unfurl_ignored_hosts: Array<string>;
|
||||
app_origin_aliases: Array<string>;
|
||||
embeds: {
|
||||
oembed_html_enabled: boolean;
|
||||
oembed_html_allow_untrusted_on_self_hosted: boolean;
|
||||
|
||||
@@ -209,11 +209,40 @@ describe('ConfigLoader', () => {
|
||||
'https://fluxer.app',
|
||||
'https://web.fluxer.app',
|
||||
'https://web.canary.fluxer.app',
|
||||
'https://fluxer.com',
|
||||
'https://canary.fluxer.com',
|
||||
'android:apk-key-hash:keSY4bimyLqZQV7bKXgpa2xYuqXi0qZJzsYtp6gpx7w',
|
||||
'http://localhost:8088',
|
||||
]);
|
||||
});
|
||||
|
||||
test('defaults to no app origin aliases', async () => {
|
||||
stubMinimalEnv();
|
||||
const config = await loadConfig();
|
||||
expect(config.services.api.app_origin_aliases).toEqual([]);
|
||||
});
|
||||
|
||||
test('normalizes and deduplicates app origin aliases', async () => {
|
||||
stubMinimalEnv({
|
||||
FLUXER_APP_ORIGIN_ALIASES:
|
||||
'https://Web.Fluxer.App/, https://fluxer.com,https://fluxer.com:443,http://localhost:3000',
|
||||
});
|
||||
const config = await loadConfig();
|
||||
expect(config.services.api.app_origin_aliases).toEqual([
|
||||
'https://web.fluxer.app',
|
||||
'https://fluxer.com',
|
||||
'http://localhost:3000',
|
||||
]);
|
||||
});
|
||||
|
||||
test.each(['fluxer.com', 'https://fluxer.com/app', 'ftp://fluxer.com', 'https://[email protected]'])(
|
||||
'rejects the app origin alias %s',
|
||||
async (alias) => {
|
||||
stubMinimalEnv({FLUXER_APP_ORIGIN_ALIASES: alias});
|
||||
await expect(loadConfig()).rejects.toThrow('FLUXER_APP_ORIGIN_ALIASES entry 1 must be an HTTP(S) origin');
|
||||
},
|
||||
);
|
||||
|
||||
test('rejects an empty client API endpoint override', async () => {
|
||||
stubMinimalEnv({FLUXER_API_CLIENT_ENDPOINT: ''});
|
||||
await expect(loadConfig()).rejects.toThrow('FLUXER_API_CLIENT_ENDPOINT is required');
|
||||
|
||||
@@ -107,6 +107,7 @@ const NAMED_FLUXER_ENV_OVERRIDES: Record<string, NamedEnvOverride> = {
|
||||
parse: parseCsv,
|
||||
},
|
||||
FLUXER_API_UNFURL_IGNORED_HOSTS: {path: ['services', 'api', 'unfurl_ignored_hosts'], parse: parseCsv},
|
||||
FLUXER_APP_ORIGIN_ALIASES: {path: ['services', 'api', 'app_origin_aliases'], parse: parseCsv},
|
||||
FLUXER_API_EMBEDS_OEMBED_HTML_ENABLED: {
|
||||
path: ['services', 'api', 'embeds', 'oembed_html_enabled'],
|
||||
parse: parseBoolean,
|
||||
|
||||
@@ -105,6 +105,7 @@ export const APIErrorCodes = {
|
||||
INVALID_FLAGS_FORMAT: 'INVALID_FLAGS_FORMAT',
|
||||
INVALID_FORM_BODY: 'INVALID_FORM_BODY',
|
||||
INVALID_HANDOFF_CODE: 'INVALID_HANDOFF_CODE',
|
||||
INVALID_ORIGIN_HANDOFF_NONCE: 'INVALID_ORIGIN_HANDOFF_NONCE',
|
||||
INVALID_PERMISSIONS_INTEGER: 'INVALID_PERMISSIONS_INTEGER',
|
||||
INVALID_PERMISSIONS_NEGATIVE: 'INVALID_PERMISSIONS_NEGATIVE',
|
||||
INVALID_PHONE_NUMBER: 'INVALID_PHONE_NUMBER',
|
||||
@@ -244,6 +245,7 @@ export const APIErrorCodes = {
|
||||
UNKNOWN_INVITE: 'UNKNOWN_INVITE',
|
||||
UNKNOWN_MEMBER: 'UNKNOWN_MEMBER',
|
||||
UNKNOWN_MESSAGE: 'UNKNOWN_MESSAGE',
|
||||
UNKNOWN_ORIGIN_HANDOFF: 'UNKNOWN_ORIGIN_HANDOFF',
|
||||
UNKNOWN_REPORT: 'UNKNOWN_REPORT',
|
||||
UNKNOWN_ROLE: 'UNKNOWN_ROLE',
|
||||
UNKNOWN_STICKER: 'UNKNOWN_STICKER',
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
|
||||
import {BadRequestError} from '@fluxer/errors/src/domains/core/BadRequestError';
|
||||
|
||||
export class InvalidOriginHandoffNonceError extends BadRequestError {
|
||||
constructor() {
|
||||
super({code: APIErrorCodes.INVALID_ORIGIN_HANDOFF_NONCE});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
|
||||
import {NotFoundError} from '@fluxer/errors/src/domains/core/NotFoundError';
|
||||
|
||||
export class UnknownOriginHandoffError extends NotFoundError {
|
||||
constructor() {
|
||||
super({code: APIErrorCodes.UNKNOWN_ORIGIN_HANDOFF});
|
||||
}
|
||||
}
|
||||
@@ -132,6 +132,7 @@ export const ErrorCodeToI18nKey = {
|
||||
[ValidationErrorCodes.INVALID_OR_EXPIRED_AUTHORIZATION_TICKET]:
|
||||
'auth_and_oauth.invalid_or_expired_authorization_ticket',
|
||||
[ValidationErrorCodes.INVALID_OR_EXPIRED_SSO_STATE]: 'auth_and_oauth.invalid_or_expired_sso_state',
|
||||
[APIErrorCodes.INVALID_ORIGIN_HANDOFF_NONCE]: 'auth_and_oauth.origin_handoff_nonce_invalid',
|
||||
[APIErrorCodes.INVALID_PERMISSIONS_INTEGER]: 'misc.invalid_permissions_integer',
|
||||
[APIErrorCodes.INVALID_PERMISSIONS_NEGATIVE]: 'misc.invalid_permissions_negative',
|
||||
[APIErrorCodes.INVALID_PHONE_NUMBER]: 'phone.invalid_number',
|
||||
@@ -295,6 +296,7 @@ export const ErrorCodeToI18nKey = {
|
||||
[APIErrorCodes.UNKNOWN_INVITE]: 'unknown_entities.unknown_invite',
|
||||
[APIErrorCodes.UNKNOWN_MEMBER]: 'unknown_entities.unknown_member',
|
||||
[APIErrorCodes.UNKNOWN_MESSAGE]: 'unknown_entities.unknown_message',
|
||||
[APIErrorCodes.UNKNOWN_ORIGIN_HANDOFF]: 'auth_and_oauth.unknown_origin_handoff',
|
||||
[APIErrorCodes.UNKNOWN_REPORT]: 'moderation_and_reports.unknown_report',
|
||||
[APIErrorCodes.UNKNOWN_ROLE]: 'unknown_entities.unknown_role',
|
||||
[APIErrorCodes.UNKNOWN_STICKER]: 'stickers_and_emojis.unknown_sticker',
|
||||
|
||||
@@ -118,6 +118,7 @@ export const ERROR_I18N_MESSAGES = {
|
||||
'auth_and_oauth.invalid_token_admin_api_key': 'Invalid admin API key.',
|
||||
'auth_and_oauth.missing_authorization': 'Missing or invalid authorization header.',
|
||||
'auth_and_oauth.must_start_session_before_sending_messages': 'You must start a session before sending messages.',
|
||||
'auth_and_oauth.origin_handoff_nonce_invalid': "This sign-in transfer doesn't match the one you started.",
|
||||
'auth_and_oauth.registration_closed': 'Registration is closed on this instance.',
|
||||
'auth_and_oauth.registration_pending_approval': 'This registration is waiting for admin approval.',
|
||||
'auth_and_oauth.registration_rejected': 'This registration request was rejected.',
|
||||
@@ -132,6 +133,7 @@ export const ERROR_I18N_MESSAGES = {
|
||||
"We couldn't allocate a discriminator for your SSO account. Please try again.",
|
||||
'auth_and_oauth.sudo_mode_required': 'Sudo mode is required.',
|
||||
'auth_and_oauth.unknown_application': 'Unknown application.',
|
||||
'auth_and_oauth.unknown_origin_handoff': 'This sign-in transfer has expired or was already used.',
|
||||
'auth_and_registration.password_is_too_common':
|
||||
'Your password is too common. Please choose a less predictable password.',
|
||||
'auth_and_registration.password_not_set': "Password isn't set.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_AR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "مفتاح API الإداري غير صالح.",
|
||||
"auth_and_oauth.missing_authorization": "رأس التفويض مفقود أو غير صالح.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "يجب عليك بدء جلسة قبل إرسال الرسائل.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "عملية نقل تسجيل الدخول هذه لا تطابق العملية التي بدأتها.",
|
||||
"auth_and_oauth.registration_closed": "التسجيل مغلق في هذا المثيل.",
|
||||
"auth_and_oauth.registration_pending_approval": "هذا التسجيل في انتظار موافقة المسؤول.",
|
||||
"auth_and_oauth.registration_rejected": "تم رفض طلب التسجيل هذا.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_AR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "لم نتمكن من تخصيص مميّز لحساب SSO الخاص بك. حاول مجددًا.",
|
||||
"auth_and_oauth.sudo_mode_required": "وضع Sudo مطلوب.",
|
||||
"auth_and_oauth.unknown_application": "تطبيق غير معروف.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "انتهت صلاحية عملية نقل تسجيل الدخول هذه أو تم استخدامها بالفعل.",
|
||||
"auth_and_registration.password_is_too_common": "كلمة مرورك شائعة جدًا. اختر كلمة مرور يصعب تخمينها.",
|
||||
"auth_and_registration.password_not_set": "لم تُعيّن كلمة المرور.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "لا يمكن تغيير مميّز البوت.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_BG_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Невалиден админ API ключ.",
|
||||
"auth_and_oauth.missing_authorization": "Липсваща или невалидна заглавка за оторизация.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Трябва да започнеш сесия, преди да изпращаш съобщения.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Това прехвърляне на вписването не съвпада с това, което сте започнали.",
|
||||
"auth_and_oauth.registration_closed": "Регистрацията е затворена на тази инстанция.",
|
||||
"auth_and_oauth.registration_pending_approval": "Тази регистрация чака одобрение от администратор.",
|
||||
"auth_and_oauth.registration_rejected": "Тази заявка за регистрация беше отхвърлена.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_BG_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Не успяхме да присвоим дискриминатор за твоя SSO акаунт. Опитай отново.",
|
||||
"auth_and_oauth.sudo_mode_required": "Изисква се sudo режим.",
|
||||
"auth_and_oauth.unknown_application": "Неизвестно приложение.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Това прехвърляне на вписването е изтекло или вече е използвано.",
|
||||
"auth_and_registration.password_is_too_common": "Паролата ти е твърде често срещана. Избери по-трудна за отгатване парола.",
|
||||
"auth_and_registration.password_not_set": "Паролата не е зададена.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Дискриминаторът на бота не може да се променя.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_CS_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Neplatný API klíč administrátora.",
|
||||
"auth_and_oauth.missing_authorization": "Chybí nebo je neplatná autorizační hlavička.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Před odesíláním zpráv musíte zahájit relaci.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Tento přenos přihlášení neodpovídá tomu, který jste zahájili.",
|
||||
"auth_and_oauth.registration_closed": "Registrace na této instanci je uzavřena.",
|
||||
"auth_and_oauth.registration_pending_approval": "Tato registrace čeká na schválení administrátorem.",
|
||||
"auth_and_oauth.registration_rejected": "Tato žádost o registraci byla zamítnuta.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_CS_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nepodařilo se přidělit čtyřmístný identifikátor pro váš účet SSO. Zkuste to znovu.",
|
||||
"auth_and_oauth.sudo_mode_required": "Je vyžadován režim sudo.",
|
||||
"auth_and_oauth.unknown_application": "Neznámá aplikace.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Platnost tohoto přenosu přihlášení vypršela nebo už byl použit.",
|
||||
"auth_and_registration.password_is_too_common": "Vaše heslo je příliš běžné. Zvolte si hůře odhadnutelné heslo.",
|
||||
"auth_and_registration.password_not_set": "Heslo není nastavené.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Čtyřmístný identifikátor bota nelze změnit.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_DA_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Ugyldig administrator-API-nøgle.",
|
||||
"auth_and_oauth.missing_authorization": "Manglende eller ugyldig godkendelsesheader.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Du skal starte en session, før du sender beskeder.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Denne overførsel af login matcher ikke den, du startede.",
|
||||
"auth_and_oauth.registration_closed": "Tilmelding er lukket på denne instans.",
|
||||
"auth_and_oauth.registration_pending_approval": "Denne tilmelding afventer godkendelse fra administratoren.",
|
||||
"auth_and_oauth.registration_rejected": "Denne anmodning om tilmelding blev afvist.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_DA_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Vi kunne ikke tildele et tag til din SSO-konto. Prøv igen.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-tilstand er påkrævet.",
|
||||
"auth_and_oauth.unknown_application": "Ukendt applikation.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Denne overførsel af login er udløbet eller allerede brugt.",
|
||||
"auth_and_registration.password_is_too_common": "Din adgangskode er for almindelig. Vælg en adgangskode, der er sværere at gætte.",
|
||||
"auth_and_registration.password_not_set": "Der er ikke angivet nogen adgangskode.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "En bots tag kan ikke ændres.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_DE_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Ungültiger Admin-API-Schlüssel.",
|
||||
"auth_and_oauth.missing_authorization": "Fehlender oder ungültiger Autorisierungsheader.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Du musst eine Sitzung starten, bevor du Nachrichten senden kannst.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Diese Anmeldeübertragung stimmt nicht mit der von dir gestarteten überein.",
|
||||
"auth_and_oauth.registration_closed": "Die Registrierung ist auf dieser Instanz geschlossen.",
|
||||
"auth_and_oauth.registration_pending_approval": "Diese Registrierung wartet auf die Genehmigung durch einen Administrator.",
|
||||
"auth_and_oauth.registration_rejected": "Diese Registrierungsanfrage wurde abgelehnt.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_DE_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Wir konnten keinen Discriminator für deinen SSO-Account vergeben. Versuche es noch einmal.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-Modus ist erforderlich.",
|
||||
"auth_and_oauth.unknown_application": "Unbekannte Anwendung.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Diese Anmeldeübertragung ist abgelaufen oder wurde bereits verwendet.",
|
||||
"auth_and_registration.password_is_too_common": "Dein Passwort wird zu häufig verwendet. Wähle bitte ein Passwort, das weniger leicht zu erraten ist.",
|
||||
"auth_and_registration.password_not_set": "Das Passwort ist nicht festgelegt.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Der Bot-Discriminator kann nicht geändert werden.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_EL_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Το κλειδί API διαχειριστή είναι μη έγκυρο.",
|
||||
"auth_and_oauth.missing_authorization": "Λείπει ή είναι άκυρη η κεφαλίδα εξουσιοδότησης.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Πρέπει να ξεκινήσεις συνεδρία πριν στείλεις μηνύματα.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Αυτή η μεταφορά σύνδεσης δεν αντιστοιχεί σε αυτήν που ξεκινήσατε.",
|
||||
"auth_and_oauth.registration_closed": "Η εγγραφή είναι κλειστή σε αυτήν την εγκατάσταση.",
|
||||
"auth_and_oauth.registration_pending_approval": "Αυτή η εγγραφή περιμένει έγκριση από τον διαχειριστή.",
|
||||
"auth_and_oauth.registration_rejected": "Αυτό το αίτημα εγγραφής απορρίφθηκε.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_EL_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Δεν μπορέσαμε να εκχωρήσουμε διακριτικό για τον λογαριασμό σου SSO. Δοκίμασε ξανά.",
|
||||
"auth_and_oauth.sudo_mode_required": "Απαιτείται η λειτουργία sudo.",
|
||||
"auth_and_oauth.unknown_application": "Άγνωστη εφαρμογή.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Αυτή η μεταφορά σύνδεσης έχει λήξει ή έχει ήδη χρησιμοποιηθεί.",
|
||||
"auth_and_registration.password_is_too_common": "Ο κωδικός πρόσβασής σου είναι πολύ κοινός. Διάλεξε έναν λιγότερο προβλέψιμο κωδικό πρόσβασης.",
|
||||
"auth_and_registration.password_not_set": "Ο κωδικός πρόσβασης δεν έχει οριστεί.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Το διακριτικό του bot δεν μπορεί να αλλάξει.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_EN_GB_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Invalid admin API key.",
|
||||
"auth_and_oauth.missing_authorization": "Missing or invalid authorisation header.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "You must start a session before sending messages.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "This sign-in transfer doesn't match the one you started.",
|
||||
"auth_and_oauth.registration_closed": "Registration is closed on this instance.",
|
||||
"auth_and_oauth.registration_pending_approval": "This registration is waiting for admin approval.",
|
||||
"auth_and_oauth.registration_rejected": "This registration request was rejected.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_EN_GB_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "We couldn't allocate a discriminator for your SSO account. Please try again.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo mode is required.",
|
||||
"auth_and_oauth.unknown_application": "Unknown application.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "This sign-in transfer has expired or was already used.",
|
||||
"auth_and_registration.password_is_too_common": "Your password is too common. Please choose a less predictable password.",
|
||||
"auth_and_registration.password_not_set": "Password isn't set.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Bot discriminator can't be changed.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_ES_419_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Clave de API de administrador no válida.",
|
||||
"auth_and_oauth.missing_authorization": "Falta el encabezado de autorización o no es válido.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Debes iniciar una sesión antes de enviar mensajes.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Esta transferencia de inicio de sesión no coincide con la que iniciaste.",
|
||||
"auth_and_oauth.registration_closed": "El registro está cerrado en esta instancia.",
|
||||
"auth_and_oauth.registration_pending_approval": "Este registro está esperando la aprobación del administrador.",
|
||||
"auth_and_oauth.registration_rejected": "Esta solicitud de registro fue rechazada.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_ES_419_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "No pudimos asignar un discriminador para tu cuenta de SSO. Inténtalo de nuevo.",
|
||||
"auth_and_oauth.sudo_mode_required": "Se requiere el modo sudo.",
|
||||
"auth_and_oauth.unknown_application": "Aplicación desconocida.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Esta transferencia de inicio de sesión caducó o ya se usó.",
|
||||
"auth_and_registration.password_is_too_common": "Tu contraseña es demasiado común. Elige una contraseña menos predecible.",
|
||||
"auth_and_registration.password_not_set": "La contraseña no está configurada.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "El discriminador del bot no se puede cambiar.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_ES_ES_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Clave de API de administrador no válida.",
|
||||
"auth_and_oauth.missing_authorization": "Falta la cabecera de autorización o no es válida.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Debes iniciar sesión antes de enviar mensajes.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Esta transferencia de inicio de sesión no coincide con la que iniciaste.",
|
||||
"auth_and_oauth.registration_closed": "El registro está cerrado en esta instancia.",
|
||||
"auth_and_oauth.registration_pending_approval": "Este registro está pendiente de aprobación por parte del administrador.",
|
||||
"auth_and_oauth.registration_rejected": "Esta solicitud de registro ha sido rechazada.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_ES_ES_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "No se pudo asignar un discriminador para tu cuenta SSO. Inténtalo de nuevo.",
|
||||
"auth_and_oauth.sudo_mode_required": "Se requiere el modo sudo.",
|
||||
"auth_and_oauth.unknown_application": "Aplicación desconocida.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Esta transferencia de inicio de sesión ha caducado o ya se ha usado.",
|
||||
"auth_and_registration.password_is_too_common": "Tu contraseña es demasiado común. Elige una contraseña menos predecible.",
|
||||
"auth_and_registration.password_not_set": "La contraseña no está establecida.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "El discriminador del bot no se puede cambiar.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_FI_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Virheellinen ylläpidon API-avain.",
|
||||
"auth_and_oauth.missing_authorization": "Valtuutusotsake puuttuu tai on virheellinen.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Sinun on aloitettava istunto ennen viestien lähettämistä.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Tämä kirjautumisen siirto ei vastaa aloittamaasi siirtoa.",
|
||||
"auth_and_oauth.registration_closed": "Rekisteröinti on suljettu tällä instanssilla.",
|
||||
"auth_and_oauth.registration_pending_approval": "Tämä rekisteröinti odottaa järjestelmänvalvojan hyväksyntää.",
|
||||
"auth_and_oauth.registration_rejected": "Tämä rekisteröintipyyntö hylättiin.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_FI_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "SSO-tilillesi ei voitu varata nelinumeroista tunnistetta. Yritä uudelleen.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-tila vaaditaan.",
|
||||
"auth_and_oauth.unknown_application": "Tuntematon sovellus.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Tämä kirjautumisen siirto on vanhentunut tai jo käytetty.",
|
||||
"auth_and_registration.password_is_too_common": "Salasanasi on liian yleinen. Valitse vaikeammin arvattava salasana.",
|
||||
"auth_and_registration.password_not_set": "Salasanaa ei ole asetettu.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Botin nelinumeroista tunnistetta ei voi muuttaa.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_FR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Clé API administrateur non valide.",
|
||||
"auth_and_oauth.missing_authorization": "En-tête d'autorisation manquant ou non valide.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Vous devez démarrer une session avant d’envoyer des messages.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Ce transfert de connexion ne correspond pas à celui que tu as lancé.",
|
||||
"auth_and_oauth.registration_closed": "L'inscription est fermée sur cette instance.",
|
||||
"auth_and_oauth.registration_pending_approval": "Cette inscription est en attente d'approbation par un administrateur.",
|
||||
"auth_and_oauth.registration_rejected": "Cette demande d'inscription a été rejetée.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_FR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Impossible d’attribuer un discriminateur à votre compte SSO. Réessayez.",
|
||||
"auth_and_oauth.sudo_mode_required": "Le mode Sudo est requis.",
|
||||
"auth_and_oauth.unknown_application": "Application inconnue.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Ce transfert de connexion a expiré ou a déjà été utilisé.",
|
||||
"auth_and_registration.password_is_too_common": "Votre mot de passe est trop courant. Choisissez-en un moins prévisible.",
|
||||
"auth_and_registration.password_not_set": "Le mot de passe n'est pas défini.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Le discriminateur du bot ne peut pas être modifié.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_HE_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "מפתח API של אדמין שגוי.",
|
||||
"auth_and_oauth.missing_authorization": "כותרת ההרשאה חסרה או שגויה.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "יש להתחיל סשן לפני שליחת הודעות.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "העברת ההתחברות הזו אינה תואמת לזו שהתחלת.",
|
||||
"auth_and_oauth.registration_closed": "ההרשמה סגורה במופע זה.",
|
||||
"auth_and_oauth.registration_pending_approval": "הרשמה זו ממתינה לאישור מנהל.",
|
||||
"auth_and_oauth.registration_rejected": "בקשת הרשמה זו נדחתה.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_HE_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "לא הצלחנו להקצות מזהה לחשבון ה-SSO שלך. ניתן לנסות שוב.",
|
||||
"auth_and_oauth.sudo_mode_required": "נדרש מצב sudo.",
|
||||
"auth_and_oauth.unknown_application": "אפליקציה לא ידועה.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "פג תוקפה של העברת ההתחברות הזו או שכבר נעשה בה שימוש.",
|
||||
"auth_and_registration.password_is_too_common": "הסיסמה שלך נפוצה מדי. מומלץ לבחור סיסמה פחות צפויה.",
|
||||
"auth_and_registration.password_not_set": "סיסמה לא הוגדרה.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "לא ניתן לשנות את המזהה של הבוט.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_HI_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "एडमिन API कुंजी अमान्य है।",
|
||||
"auth_and_oauth.missing_authorization": "ऑथराइज़ेशन हेडर गायब या अमान्य है।",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "मैसेज भेजने से पहले आपको एक सेशन शुरू करना होगा।",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "यह साइन-इन ट्रांसफ़र आपके द्वारा शुरू किए गए ट्रांसफ़र से मेल नहीं खाता।",
|
||||
"auth_and_oauth.registration_closed": "इस इंस्टेंस पर रजिस्ट्रेशन बंद है।",
|
||||
"auth_and_oauth.registration_pending_approval": "यह रजिस्ट्रेशन एडमिन अप्रूवल का इंतज़ार कर रहा है।",
|
||||
"auth_and_oauth.registration_rejected": "यह रजिस्ट्रेशन रिक्वेस्ट रिजेक्ट कर दी गई है।",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_HI_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "हम आपके SSO अकाउंट के लिए डिस्क्रिमिनेटर अलॉट नहीं कर सके। फिर से कोशिश करें।",
|
||||
"auth_and_oauth.sudo_mode_required": "सुडो मोड ज़रूरी है।",
|
||||
"auth_and_oauth.unknown_application": "अज्ञात एप्लीकेशन।",
|
||||
"auth_and_oauth.unknown_origin_handoff": "यह साइन-इन ट्रांसफ़र समाप्त हो गया है या पहले ही उपयोग किया जा चुका है।",
|
||||
"auth_and_registration.password_is_too_common": "आपका पासवर्ड बहुत कॉमन है। कृपया ऐसा पासवर्ड चुनें जिसका अंदाज़ा लगाना मुश्किल हो।",
|
||||
"auth_and_registration.password_not_set": "पासवर्ड सेट नहीं है।",
|
||||
"bots.bot_discriminator_cannot_be_changed": "बॉट डिस्क्रिमिनेटर को बदला नहीं जा सकता।",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_HR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Nevažeći administratorski API ključ.",
|
||||
"auth_and_oauth.missing_authorization": "Nedostaje ili je nevažeće autorizacijsko zaglavlje.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Moraš započeti sesiju prije slanja poruka.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Ovaj prijenos prijave ne odgovara onome koji ste započeli.",
|
||||
"auth_and_oauth.registration_closed": "Registracija je zatvorena na ovoj instanci.",
|
||||
"auth_and_oauth.registration_pending_approval": "Ova registracija čeka odobrenje administratora.",
|
||||
"auth_and_oauth.registration_rejected": "Ovaj zahtjev za registraciju je odbijen.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_HR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nismo mogli dodijeliti diskriminator tvom SSO računu. Pokušaj ponovno.",
|
||||
"auth_and_oauth.sudo_mode_required": "Potreban je sudo način rada.",
|
||||
"auth_and_oauth.unknown_application": "Nepoznata aplikacija.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Ovaj prijenos prijave je istekao ili je već iskorišten.",
|
||||
"auth_and_registration.password_is_too_common": "Tvoja je lozinka previše uobičajena. Odaberi manje predvidljivu lozinku.",
|
||||
"auth_and_registration.password_not_set": "Lozinka nije postavljena.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Diskriminator bota ne može se promijeniti.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_HU_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Érvénytelen adminisztrátori API-kulcs.",
|
||||
"auth_and_oauth.missing_authorization": "Hiányzó vagy érvénytelen hitelesítési fejléc.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Üzenetek küldéséhez előbb munkamenetet kell indítanod.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Ez a bejelentkezés-átvitel nem egyezik azzal, amelyet elindítottál.",
|
||||
"auth_and_oauth.registration_closed": "Ezen a példányon a regisztráció le van zárva.",
|
||||
"auth_and_oauth.registration_pending_approval": "Ez a regisztráció rendszergazdai jóváhagyásra vár.",
|
||||
"auth_and_oauth.registration_rejected": "Ez a regisztrációs kérelem el lett utasítva.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_HU_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nem sikerült számazonosítót kiosztani az SSO-fiókodhoz. Próbáld újra.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo mód szükséges.",
|
||||
"auth_and_oauth.unknown_application": "Ismeretlen alkalmazás.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Ez a bejelentkezés-átvitel lejárt, vagy már felhasználták.",
|
||||
"auth_and_registration.password_is_too_common": "A jelszavad túl gyakori. Válassz nehezebben kitalálható jelszót.",
|
||||
"auth_and_registration.password_not_set": "Nincs beállítva jelszó.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "A bot számazonosítója nem módosítható.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_ID_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Kunci API admin tidak valid.",
|
||||
"auth_and_oauth.missing_authorization": "Header otorisasi hilang atau tidak valid.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Kamu harus memulai sesi sebelum mengirim pesan.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Transfer masuk ini tidak cocok dengan yang kamu mulai.",
|
||||
"auth_and_oauth.registration_closed": "Pendaftaran ditutup di instance ini.",
|
||||
"auth_and_oauth.registration_pending_approval": "Pendaftaran ini menunggu persetujuan admin.",
|
||||
"auth_and_oauth.registration_rejected": "Permintaan pendaftaran ini ditolak.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_ID_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Tidak bisa mengalokasikan diskriminator untuk akun SSO kamu. Silakan coba lagi.",
|
||||
"auth_and_oauth.sudo_mode_required": "Mode sudo diperlukan.",
|
||||
"auth_and_oauth.unknown_application": "Aplikasi tidak dikenal.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Transfer masuk ini sudah kedaluwarsa atau sudah digunakan.",
|
||||
"auth_and_registration.password_is_too_common": "Kata sandimu terlalu umum. Pilih kata sandi yang lebih sulit ditebak.",
|
||||
"auth_and_registration.password_not_set": "Kata sandi belum diatur.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Diskriminator bot tidak dapat diubah.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_IT_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Chiave API amministratore non valida.",
|
||||
"auth_and_oauth.missing_authorization": "Header di autorizzazione mancante o non valido.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Devi avviare una sessione prima di inviare messaggi.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Questo trasferimento di accesso non corrisponde a quello che hai avviato.",
|
||||
"auth_and_oauth.registration_closed": "La registrazione è chiusa su questa istanza.",
|
||||
"auth_and_oauth.registration_pending_approval": "Questa registrazione è in attesa dell'approvazione dell'amministratore.",
|
||||
"auth_and_oauth.registration_rejected": "Questa richiesta di registrazione è stata rifiutata.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_IT_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Non è stato possibile assegnare un discriminatore al tuo account SSO. Riprova.",
|
||||
"auth_and_oauth.sudo_mode_required": "La modalità Sudo è richiesta.",
|
||||
"auth_and_oauth.unknown_application": "Applicazione sconosciuta.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Questo trasferimento di accesso è scaduto o è già stato usato.",
|
||||
"auth_and_registration.password_is_too_common": "La tua password è troppo comune. Scegli una password meno prevedibile.",
|
||||
"auth_and_registration.password_not_set": "La password non è impostata.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Il discriminatore del bot non può essere modificato.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_JA_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "管理者APIキーが無効です。",
|
||||
"auth_and_oauth.missing_authorization": "認証ヘッダーが見つからないか、無効です。",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "メッセージを送信する前にセッションを開始してください。",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "このサインインの引き継ぎは、開始したものと一致しません。",
|
||||
"auth_and_oauth.registration_closed": "このインスタンスでは新規登録を受け付けていません。",
|
||||
"auth_and_oauth.registration_pending_approval": "この登録は管理者による承認待ちです。",
|
||||
"auth_and_oauth.registration_rejected": "この登録リクエストは拒否されました。",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_JA_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "SSOアカウントの識別子を割り当てられませんでした。もう一度お試しください。",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudoモードが必要です。",
|
||||
"auth_and_oauth.unknown_application": "不明なアプリケーションです。",
|
||||
"auth_and_oauth.unknown_origin_handoff": "このサインインの引き継ぎは期限切れか、すでに使用されています。",
|
||||
"auth_and_registration.password_is_too_common": "パスワードが一般的すぎます。より推測されにくいパスワードを設定してください。",
|
||||
"auth_and_registration.password_not_set": "パスワードが未設定です。",
|
||||
"bots.bot_discriminator_cannot_be_changed": "ボットの識別子は変更できません。",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_KO_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "잘못된 관리자 API 키예요.",
|
||||
"auth_and_oauth.missing_authorization": "인증 헤더가 없거나 유효하지 않아요.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "메시지를 보내기 전에 세션을 시작해야 해요.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "이 로그인 이전 요청이 시작한 요청과 일치하지 않습니다.",
|
||||
"auth_and_oauth.registration_closed": "이 인스턴스에서는 가입을 받고 있지 않아요.",
|
||||
"auth_and_oauth.registration_pending_approval": "이 가입 신청은 관리자 승인을 기다리고 있어요.",
|
||||
"auth_and_oauth.registration_rejected": "이 가입 요청은 거부되었어요.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_KO_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "SSO 계정에 디스크리미네이터를 할당하지 못했어요. 다시 시도해 주세요.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo 모드가 필요해요.",
|
||||
"auth_and_oauth.unknown_application": "알 수 없는 애플리케이션이에요.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "이 로그인 이전 요청이 만료되었거나 이미 사용되었습니다.",
|
||||
"auth_and_registration.password_is_too_common": "비밀번호가 너무 흔해요. 추측하기 어려운 비밀번호를 사용해 주세요.",
|
||||
"auth_and_registration.password_not_set": "비밀번호가 설정되지 않았어요.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "봇 디스크리미네이터를 변경할 수 없어요.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_LT_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Negaliojantis administratoriaus API raktas.",
|
||||
"auth_and_oauth.missing_authorization": "Trūksta autorizacijos antraštės arba ji neteisinga.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Kad galėtum siųsti žinutes, pirmiausia pradėk seansą.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Šis prisijungimo perkėlimas nesutampa su tuo, kurį pradėjote.",
|
||||
"auth_and_oauth.registration_closed": "Registracija šioje instancijoje yra uždaryta.",
|
||||
"auth_and_oauth.registration_pending_approval": "Ši registracija laukia administratoriaus patvirtinimo.",
|
||||
"auth_and_oauth.registration_rejected": "Šis registracijos prašymas buvo atmestas.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_LT_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nepavyko priskirti diskriminatoriaus tavo SSO paskyrai. Pabandyk dar kartą.",
|
||||
"auth_and_oauth.sudo_mode_required": "Reikalingas sudo režimas.",
|
||||
"auth_and_oauth.unknown_application": "Nežinoma programa.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Šio prisijungimo perkėlimo galiojimas baigėsi arba jis jau panaudotas.",
|
||||
"auth_and_registration.password_is_too_common": "Tavo slaptažodis per dažnai naudojamas. Pasirink sunkiau nuspėjamą slaptažodį.",
|
||||
"auth_and_registration.password_not_set": "Slaptažodis nenustatytas.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Boto diskriminatoriaus negalima pakeisti.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_NL_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "De admin-API-sleutel is ongeldig.",
|
||||
"auth_and_oauth.missing_authorization": "De autorisatieheader ontbreekt of is ongeldig.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Je moet een sessie starten voordat je berichten kunt verzenden.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Deze aanmeldoverdracht komt niet overeen met de overdracht die je hebt gestart.",
|
||||
"auth_and_oauth.registration_closed": "Registratie is gesloten op deze instantie.",
|
||||
"auth_and_oauth.registration_pending_approval": "Deze registratie wacht op goedkeuring van de beheerder.",
|
||||
"auth_and_oauth.registration_rejected": "Dit registratieverzoek is afgewezen.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_NL_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "We konden geen discriminator toewijzen aan je SSO-account. Probeer het nog eens.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-modus is vereist.",
|
||||
"auth_and_oauth.unknown_application": "Onbekende app.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Deze aanmeldoverdracht is verlopen of al gebruikt.",
|
||||
"auth_and_registration.password_is_too_common": "Je wachtwoord komt te vaak voor. Kies een minder voorspelbaar wachtwoord.",
|
||||
"auth_and_registration.password_not_set": "Wachtwoord is niet ingesteld.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "De discriminator van een bot kan niet worden gewijzigd.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_NO_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Ugyldig API-nøkkel for administrasjon.",
|
||||
"auth_and_oauth.missing_authorization": "Autorisasjonsheaderen mangler eller er ugyldig.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Du må starte en økt før du sender meldinger.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Denne overføringen av innloggingen samsvarer ikke med den du startet.",
|
||||
"auth_and_oauth.registration_closed": "Registrering er stengt på denne instansen.",
|
||||
"auth_and_oauth.registration_pending_approval": "Denne registreringen venter på administratorgodkjenning.",
|
||||
"auth_and_oauth.registration_rejected": "Denne registreringsforespørselen ble avvist.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_NO_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Vi klarte ikke å tildele en diskriminator til SSO-kontoen din. Prøv igjen.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-modus er påkrevd.",
|
||||
"auth_and_oauth.unknown_application": "Ukjent app.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Denne overføringen av innloggingen er utløpt eller allerede brukt.",
|
||||
"auth_and_registration.password_is_too_common": "Passordet ditt er for vanlig. Velg et passord som er vanskeligere å gjette.",
|
||||
"auth_and_registration.password_not_set": "Det er ikke angitt noe passord.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Botens diskriminator kan ikke endres.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_PL_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Nieprawidłowy klucz API administratora.",
|
||||
"auth_and_oauth.missing_authorization": "Brakuje nagłówka autoryzacji lub jest on nieprawidłowy.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Musisz rozpocząć sesję, zanim wyślesz wiadomości.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "To przeniesienie logowania nie pasuje do tego, które zostało rozpoczęte.",
|
||||
"auth_and_oauth.registration_closed": "Rejestracja na tej instancji jest zamknięta.",
|
||||
"auth_and_oauth.registration_pending_approval": "Ta rejestracja czeka na zatwierdzenie przez administratora.",
|
||||
"auth_and_oauth.registration_rejected": "Ten wniosek o rejestrację został odrzucony.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_PL_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nie udało się przydzielić dyskryminatora dla Twojego konta SSO. Spróbuj ponownie.",
|
||||
"auth_and_oauth.sudo_mode_required": "Wymagany tryb sudo.",
|
||||
"auth_and_oauth.unknown_application": "Nieznana aplikacja.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "To przeniesienie logowania wygasło lub zostało już użyte.",
|
||||
"auth_and_registration.password_is_too_common": "Twoje hasło jest zbyt popularne. Wybierz mniej przewidywalne hasło.",
|
||||
"auth_and_registration.password_not_set": "Hasło nie jest ustawione.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Nie można zmienić dyskryminatora bota.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_PT_BR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Chave de API de administrador inválida.",
|
||||
"auth_and_oauth.missing_authorization": "Cabeçalho de autorização ausente ou inválido.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Você deve iniciar uma sessão antes de enviar mensagens.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Esta transferência de login não corresponde à que você iniciou.",
|
||||
"auth_and_oauth.registration_closed": "O cadastro está fechado nesta instância.",
|
||||
"auth_and_oauth.registration_pending_approval": "Este cadastro está aguardando a aprovação de um administrador.",
|
||||
"auth_and_oauth.registration_rejected": "Esta solicitação de cadastro foi rejeitada.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_PT_BR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Não foi possível alocar um discriminador para sua conta SSO. Tente novamente.",
|
||||
"auth_and_oauth.sudo_mode_required": "O modo sudo é obrigatório.",
|
||||
"auth_and_oauth.unknown_application": "Aplicativo desconhecido.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Esta transferência de login expirou ou já foi usada.",
|
||||
"auth_and_registration.password_is_too_common": "Sua senha é muito comum. Escolha uma senha menos previsível.",
|
||||
"auth_and_registration.password_not_set": "A senha não foi definida.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "O discriminador do bot não pode ser alterado.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_RO_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Cheia API de administrator este invalidă.",
|
||||
"auth_and_oauth.missing_authorization": "Headerul de autorizare lipsește sau este invalid.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Trebuie să începi o sesiune înainte de a trimite mesaje.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Acest transfer de autentificare nu corespunde celui pe care l-ai început.",
|
||||
"auth_and_oauth.registration_closed": "Înregistrarea este închisă pe această instanță.",
|
||||
"auth_and_oauth.registration_pending_approval": "Această înregistrare așteaptă aprobarea administratorului.",
|
||||
"auth_and_oauth.registration_rejected": "Această cerere de înregistrare a fost respinsă.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_RO_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nu s-a putut aloca un discriminator pentru contul tău SSO. Încearcă din nou.",
|
||||
"auth_and_oauth.sudo_mode_required": "Modul Sudo este necesar.",
|
||||
"auth_and_oauth.unknown_application": "Aplicație necunoscută.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Acest transfer de autentificare a expirat sau a fost deja folosit.",
|
||||
"auth_and_registration.password_is_too_common": "Parola ta este prea comună. Alege o parolă mai greu de ghicit.",
|
||||
"auth_and_registration.password_not_set": "Parola nu este setată.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Discriminatorul botului nu poate fi schimbat.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_RU_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Недействительный ключ Admin API.",
|
||||
"auth_and_oauth.missing_authorization": "Заголовок авторизации отсутствует или недействителен.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Перед отправкой сообщений нужно начать сессию.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Этот перенос входа не совпадает с тем, который вы начали.",
|
||||
"auth_and_oauth.registration_closed": "Регистрация в этом экземпляре закрыта.",
|
||||
"auth_and_oauth.registration_pending_approval": "Эта регистрация ожидает одобрения администратора.",
|
||||
"auth_and_oauth.registration_rejected": "Заявка на регистрацию отклонена.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_RU_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Не удалось назначить дискриминатор для твоего аккаунта SSO. Попробуй ещё раз.",
|
||||
"auth_and_oauth.sudo_mode_required": "Требуется режим sudo.",
|
||||
"auth_and_oauth.unknown_application": "Неизвестное приложение.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Срок действия этого переноса входа истёк, или он уже использован.",
|
||||
"auth_and_registration.password_is_too_common": "Твой пароль слишком распространённый. Придумай менее предсказуемый пароль.",
|
||||
"auth_and_registration.password_not_set": "Пароль не установлен.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Дискриминатор бота нельзя изменить.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_SV_SE_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Ogiltig admin-API-nyckel.",
|
||||
"auth_and_oauth.missing_authorization": "Authorization-huvudet saknas eller är ogiltigt.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Du måste starta en session innan du kan skicka meddelanden.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Den här inloggningsöverföringen matchar inte den du startade.",
|
||||
"auth_and_oauth.registration_closed": "Registrering är stängd på den här instansen.",
|
||||
"auth_and_oauth.registration_pending_approval": "Den här registreringen väntar på administratörsgodkännande.",
|
||||
"auth_and_oauth.registration_rejected": "Den här registreringsbegäran avslogs.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_SV_SE_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Vi kunde inte tilldela en diskriminator för ditt SSO-konto. Försök igen.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-läge krävs.",
|
||||
"auth_and_oauth.unknown_application": "Okänd applikation.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Den här inloggningsöverföringen har gått ut eller har redan använts.",
|
||||
"auth_and_registration.password_is_too_common": "Ditt lösenord är för vanligt. Välj ett lösenord som är svårare att gissa.",
|
||||
"auth_and_registration.password_not_set": "Inget lösenord har angetts.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Botdiskriminatorn kan inte ändras.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_TH_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Admin API key ไม่ถูกต้อง",
|
||||
"auth_and_oauth.missing_authorization": "ส่วนหัว Authorization หายไปหรือไม่ถูกต้อง",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "ต้องเริ่มเซสชันก่อนส่งข้อความ",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "การโอนการลงชื่อเข้าใช้นี้ไม่ตรงกับรายการที่คุณเริ่มไว้",
|
||||
"auth_and_oauth.registration_closed": "การลงทะเบียนปิดให้บริการในอินสแตนซ์นี้",
|
||||
"auth_and_oauth.registration_pending_approval": "การลงทะเบียนนี้กำลังรอการอนุมัติจากผู้ดูแลระบบ",
|
||||
"auth_and_oauth.registration_rejected": "คำขอลงทะเบียนนี้ถูกปฏิเสธ",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_TH_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "ไม่สามารถสร้าง discriminator สำหรับบัญชี SSO ของคุณได้ โปรดลองอีกครั้ง",
|
||||
"auth_and_oauth.sudo_mode_required": "ต้องใช้โหมด sudo",
|
||||
"auth_and_oauth.unknown_application": "ไม่พบแอปพลิเคชัน",
|
||||
"auth_and_oauth.unknown_origin_handoff": "การโอนการลงชื่อเข้าใช้นี้หมดอายุแล้วหรือถูกใช้ไปแล้ว",
|
||||
"auth_and_registration.password_is_too_common": "รหัสผ่านของคุณเป็นรหัสที่พบบ่อยเกินไป โปรดเลือกรหัสผ่านที่เดาได้ยากขึ้น",
|
||||
"auth_and_registration.password_not_set": "ยังไม่ได้ตั้งรหัสผ่าน",
|
||||
"bots.bot_discriminator_cannot_be_changed": "ไม่สามารถเปลี่ยน discriminator ของบอทได้",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_TR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Geçersiz yönetici API anahtarı.",
|
||||
"auth_and_oauth.missing_authorization": "Eksik veya geçersiz yetkilendirme başlığı.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Mesaj göndermeden önce bir oturum başlatmalısın.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Bu oturum açma aktarımı başlattığın aktarımla eşleşmiyor.",
|
||||
"auth_and_oauth.registration_closed": "Bu kurulumda kayıt kapalı.",
|
||||
"auth_and_oauth.registration_pending_approval": "Bu kayıt yönetici onayını bekliyor.",
|
||||
"auth_and_oauth.registration_rejected": "Bu kayıt isteği reddedildi.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_TR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "SSO hesabın için bir etiket atayamadık. Lütfen tekrar dene.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo modu gerekli.",
|
||||
"auth_and_oauth.unknown_application": "Bilinmeyen uygulama.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Bu oturum açma aktarımının süresi doldu veya zaten kullanıldı.",
|
||||
"auth_and_registration.password_is_too_common": "Şifren çok yaygın. Lütfen tahmin edilmesi daha zor bir şifre seç.",
|
||||
"auth_and_registration.password_not_set": "Şifre ayarlanmamış.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Bot etiketi değiştirilemez.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_UK_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Недійсний API-ключ адміністратора.",
|
||||
"auth_and_oauth.missing_authorization": "Відсутній або недійсний заголовок авторизації.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Потрібно розпочати сесію, перш ніж надсилати повідомлення.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Це перенесення входу не збігається з тим, яке ви розпочали.",
|
||||
"auth_and_oauth.registration_closed": "Реєстрацію на цьому екземплярі закрито.",
|
||||
"auth_and_oauth.registration_pending_approval": "Ця реєстрація очікує на схвалення адміністратором.",
|
||||
"auth_and_oauth.registration_rejected": "Цей запит на реєстрацію було відхилено.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_UK_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Не вдалося призначити дискримінатор для твого акаунта SSO. Спробуй ще раз.",
|
||||
"auth_and_oauth.sudo_mode_required": "Потрібен режим sudo.",
|
||||
"auth_and_oauth.unknown_application": "Невідомий застосунок.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Термін дії цього перенесення входу минув, або його вже використано.",
|
||||
"auth_and_registration.password_is_too_common": "Твій пароль занадто поширений. Обери менш передбачуваний пароль.",
|
||||
"auth_and_registration.password_not_set": "Пароль не встановлено.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Дискримінатор бота не можна змінити.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_VI_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Khóa API quản trị viên không hợp lệ.",
|
||||
"auth_and_oauth.missing_authorization": "Header ủy quyền bị thiếu hoặc không hợp lệ.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Bạn phải bắt đầu một phiên trước khi gửi tin nhắn.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Lần chuyển đăng nhập này không khớp với lần bạn đã bắt đầu.",
|
||||
"auth_and_oauth.registration_closed": "Đăng ký đã bị đóng trên phiên bản này.",
|
||||
"auth_and_oauth.registration_pending_approval": "Đăng ký này đang chờ quản trị viên phê duyệt.",
|
||||
"auth_and_oauth.registration_rejected": "Yêu cầu đăng ký này đã bị từ chối.",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_VI_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Chúng tôi không thể cấp phát mã phân biệt cho tài khoản SSO của bạn. Vui lòng thử lại.",
|
||||
"auth_and_oauth.sudo_mode_required": "Yêu cầu chế độ sudo.",
|
||||
"auth_and_oauth.unknown_application": "Ứng dụng không xác định.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Lần chuyển đăng nhập này đã hết hạn hoặc đã được sử dụng.",
|
||||
"auth_and_registration.password_is_too_common": "Mật khẩu của bạn quá phổ biến. Vui lòng chọn mật khẩu khó đoán hơn.",
|
||||
"auth_and_registration.password_not_set": "Mật khẩu chưa được đặt.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Không thể thay đổi mã phân biệt của bot.",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_ZH_CN_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "无效的管理员 API 密钥。",
|
||||
"auth_and_oauth.missing_authorization": "缺少或无效的授权请求头。",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "你必须先开始会话才能发送消息。",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "此登录转移与你发起的不一致。",
|
||||
"auth_and_oauth.registration_closed": "此实例的注册已关闭。",
|
||||
"auth_and_oauth.registration_pending_approval": "此注册正在等待管理员批准。",
|
||||
"auth_and_oauth.registration_rejected": "此注册请求已被拒绝。",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_ZH_CN_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "无法为你的 SSO 账号分配识别码。请重试。",
|
||||
"auth_and_oauth.sudo_mode_required": "需要 Sudo 模式。",
|
||||
"auth_and_oauth.unknown_application": "未知应用。",
|
||||
"auth_and_oauth.unknown_origin_handoff": "此登录转移已过期或已被使用。",
|
||||
"auth_and_registration.password_is_too_common": "你的密码太常见了。请换一个更难猜的密码。",
|
||||
"auth_and_registration.password_not_set": "密码未设置。",
|
||||
"bots.bot_discriminator_cannot_be_changed": "机器人识别码无法更改。",
|
||||
|
||||
@@ -101,6 +101,7 @@ const ERROR_I18N_ZH_TW_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "無效的管理 API 金鑰。",
|
||||
"auth_and_oauth.missing_authorization": "授權標頭遺失或無效。",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "你必須先開始工作階段才能傳送訊息。",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "此登入轉移與你發起的不一致。",
|
||||
"auth_and_oauth.registration_closed": "此實例已關閉註冊。",
|
||||
"auth_and_oauth.registration_pending_approval": "此註冊正在等待管理員核准。",
|
||||
"auth_and_oauth.registration_rejected": "此註冊要求已被拒絕。",
|
||||
@@ -113,6 +114,7 @@ const ERROR_I18N_ZH_TW_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "無法為你的 SSO 帳號分配識別碼。請再試一次。",
|
||||
"auth_and_oauth.sudo_mode_required": "需要 Sudo 模式。",
|
||||
"auth_and_oauth.unknown_application": "不明應用程式。",
|
||||
"auth_and_oauth.unknown_origin_handoff": "此登入轉移已過期或已被使用。",
|
||||
"auth_and_registration.password_is_too_common": "你的密碼太常見。請選擇較難預測的密碼。",
|
||||
"auth_and_registration.password_not_set": "密碼尚未設定。",
|
||||
"bots.bot_discriminator_cannot_be_changed": "機器人識別碼無法變更。",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "مفتاح API الإداري غير صالح.",
|
||||
"auth_and_oauth.missing_authorization": "رأس التفويض مفقود أو غير صالح.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "يجب عليك بدء جلسة قبل إرسال الرسائل.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "عملية نقل تسجيل الدخول هذه لا تطابق العملية التي بدأتها.",
|
||||
"auth_and_oauth.registration_closed": "التسجيل مغلق في هذا المثيل.",
|
||||
"auth_and_oauth.registration_pending_approval": "هذا التسجيل في انتظار موافقة المسؤول.",
|
||||
"auth_and_oauth.registration_rejected": "تم رفض طلب التسجيل هذا.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "لم نتمكن من تخصيص مميّز لحساب SSO الخاص بك. حاول مجددًا.",
|
||||
"auth_and_oauth.sudo_mode_required": "وضع Sudo مطلوب.",
|
||||
"auth_and_oauth.unknown_application": "تطبيق غير معروف.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "انتهت صلاحية عملية نقل تسجيل الدخول هذه أو تم استخدامها بالفعل.",
|
||||
"auth_and_registration.password_is_too_common": "كلمة مرورك شائعة جدًا. اختر كلمة مرور يصعب تخمينها.",
|
||||
"auth_and_registration.password_not_set": "لم تُعيّن كلمة المرور.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "لا يمكن تغيير مميّز البوت.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Невалиден админ API ключ.",
|
||||
"auth_and_oauth.missing_authorization": "Липсваща или невалидна заглавка за оторизация.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Трябва да започнеш сесия, преди да изпращаш съобщения.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Това прехвърляне на вписването не съвпада с това, което сте започнали.",
|
||||
"auth_and_oauth.registration_closed": "Регистрацията е затворена на тази инстанция.",
|
||||
"auth_and_oauth.registration_pending_approval": "Тази регистрация чака одобрение от администратор.",
|
||||
"auth_and_oauth.registration_rejected": "Тази заявка за регистрация беше отхвърлена.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Не успяхме да присвоим дискриминатор за твоя SSO акаунт. Опитай отново.",
|
||||
"auth_and_oauth.sudo_mode_required": "Изисква се sudo режим.",
|
||||
"auth_and_oauth.unknown_application": "Неизвестно приложение.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Това прехвърляне на вписването е изтекло или вече е използвано.",
|
||||
"auth_and_registration.password_is_too_common": "Паролата ти е твърде често срещана. Избери по-трудна за отгатване парола.",
|
||||
"auth_and_registration.password_not_set": "Паролата не е зададена.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Дискриминаторът на бота не може да се променя.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Neplatný API klíč administrátora.",
|
||||
"auth_and_oauth.missing_authorization": "Chybí nebo je neplatná autorizační hlavička.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Před odesíláním zpráv musíte zahájit relaci.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Tento přenos přihlášení neodpovídá tomu, který jste zahájili.",
|
||||
"auth_and_oauth.registration_closed": "Registrace na této instanci je uzavřena.",
|
||||
"auth_and_oauth.registration_pending_approval": "Tato registrace čeká na schválení administrátorem.",
|
||||
"auth_and_oauth.registration_rejected": "Tato žádost o registraci byla zamítnuta.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nepodařilo se přidělit čtyřmístný identifikátor pro váš účet SSO. Zkuste to znovu.",
|
||||
"auth_and_oauth.sudo_mode_required": "Je vyžadován režim sudo.",
|
||||
"auth_and_oauth.unknown_application": "Neznámá aplikace.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Platnost tohoto přenosu přihlášení vypršela nebo už byl použit.",
|
||||
"auth_and_registration.password_is_too_common": "Vaše heslo je příliš běžné. Zvolte si hůře odhadnutelné heslo.",
|
||||
"auth_and_registration.password_not_set": "Heslo není nastavené.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Čtyřmístný identifikátor bota nelze změnit.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Ugyldig administrator-API-nøgle.",
|
||||
"auth_and_oauth.missing_authorization": "Manglende eller ugyldig godkendelsesheader.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Du skal starte en session, før du sender beskeder.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Denne overførsel af login matcher ikke den, du startede.",
|
||||
"auth_and_oauth.registration_closed": "Tilmelding er lukket på denne instans.",
|
||||
"auth_and_oauth.registration_pending_approval": "Denne tilmelding afventer godkendelse fra administratoren.",
|
||||
"auth_and_oauth.registration_rejected": "Denne anmodning om tilmelding blev afvist.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Vi kunne ikke tildele et tag til din SSO-konto. Prøv igen.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-tilstand er påkrævet.",
|
||||
"auth_and_oauth.unknown_application": "Ukendt applikation.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Denne overførsel af login er udløbet eller allerede brugt.",
|
||||
"auth_and_registration.password_is_too_common": "Din adgangskode er for almindelig. Vælg en adgangskode, der er sværere at gætte.",
|
||||
"auth_and_registration.password_not_set": "Der er ikke angivet nogen adgangskode.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "En bots tag kan ikke ændres.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Ungültiger Admin-API-Schlüssel.",
|
||||
"auth_and_oauth.missing_authorization": "Fehlender oder ungültiger Autorisierungsheader.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Du musst eine Sitzung starten, bevor du Nachrichten senden kannst.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Diese Anmeldeübertragung stimmt nicht mit der von dir gestarteten überein.",
|
||||
"auth_and_oauth.registration_closed": "Die Registrierung ist auf dieser Instanz geschlossen.",
|
||||
"auth_and_oauth.registration_pending_approval": "Diese Registrierung wartet auf die Genehmigung durch einen Administrator.",
|
||||
"auth_and_oauth.registration_rejected": "Diese Registrierungsanfrage wurde abgelehnt.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Wir konnten keinen Discriminator für deinen SSO-Account vergeben. Versuche es noch einmal.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-Modus ist erforderlich.",
|
||||
"auth_and_oauth.unknown_application": "Unbekannte Anwendung.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Diese Anmeldeübertragung ist abgelaufen oder wurde bereits verwendet.",
|
||||
"auth_and_registration.password_is_too_common": "Dein Passwort wird zu häufig verwendet. Wähle bitte ein Passwort, das weniger leicht zu erraten ist.",
|
||||
"auth_and_registration.password_not_set": "Das Passwort ist nicht festgelegt.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Der Bot-Discriminator kann nicht geändert werden.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Το κλειδί API διαχειριστή είναι μη έγκυρο.",
|
||||
"auth_and_oauth.missing_authorization": "Λείπει ή είναι άκυρη η κεφαλίδα εξουσιοδότησης.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Πρέπει να ξεκινήσεις συνεδρία πριν στείλεις μηνύματα.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Αυτή η μεταφορά σύνδεσης δεν αντιστοιχεί σε αυτήν που ξεκινήσατε.",
|
||||
"auth_and_oauth.registration_closed": "Η εγγραφή είναι κλειστή σε αυτήν την εγκατάσταση.",
|
||||
"auth_and_oauth.registration_pending_approval": "Αυτή η εγγραφή περιμένει έγκριση από τον διαχειριστή.",
|
||||
"auth_and_oauth.registration_rejected": "Αυτό το αίτημα εγγραφής απορρίφθηκε.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Δεν μπορέσαμε να εκχωρήσουμε διακριτικό για τον λογαριασμό σου SSO. Δοκίμασε ξανά.",
|
||||
"auth_and_oauth.sudo_mode_required": "Απαιτείται η λειτουργία sudo.",
|
||||
"auth_and_oauth.unknown_application": "Άγνωστη εφαρμογή.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Αυτή η μεταφορά σύνδεσης έχει λήξει ή έχει ήδη χρησιμοποιηθεί.",
|
||||
"auth_and_registration.password_is_too_common": "Ο κωδικός πρόσβασής σου είναι πολύ κοινός. Διάλεξε έναν λιγότερο προβλέψιμο κωδικό πρόσβασης.",
|
||||
"auth_and_registration.password_not_set": "Ο κωδικός πρόσβασης δεν έχει οριστεί.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Το διακριτικό του bot δεν μπορεί να αλλάξει.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Invalid admin API key.",
|
||||
"auth_and_oauth.missing_authorization": "Missing or invalid authorisation header.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "You must start a session before sending messages.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "This sign-in transfer doesn't match the one you started.",
|
||||
"auth_and_oauth.registration_closed": "Registration is closed on this instance.",
|
||||
"auth_and_oauth.registration_pending_approval": "This registration is waiting for admin approval.",
|
||||
"auth_and_oauth.registration_rejected": "This registration request was rejected.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "We couldn't allocate a discriminator for your SSO account. Please try again.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo mode is required.",
|
||||
"auth_and_oauth.unknown_application": "Unknown application.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "This sign-in transfer has expired or was already used.",
|
||||
"auth_and_registration.password_is_too_common": "Your password is too common. Please choose a less predictable password.",
|
||||
"auth_and_registration.password_not_set": "Password isn't set.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Bot discriminator can't be changed.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Clave de API de administrador no válida.",
|
||||
"auth_and_oauth.missing_authorization": "Falta el encabezado de autorización o no es válido.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Debes iniciar una sesión antes de enviar mensajes.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Esta transferencia de inicio de sesión no coincide con la que iniciaste.",
|
||||
"auth_and_oauth.registration_closed": "El registro está cerrado en esta instancia.",
|
||||
"auth_and_oauth.registration_pending_approval": "Este registro está esperando la aprobación del administrador.",
|
||||
"auth_and_oauth.registration_rejected": "Esta solicitud de registro fue rechazada.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "No pudimos asignar un discriminador para tu cuenta de SSO. Inténtalo de nuevo.",
|
||||
"auth_and_oauth.sudo_mode_required": "Se requiere el modo sudo.",
|
||||
"auth_and_oauth.unknown_application": "Aplicación desconocida.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Esta transferencia de inicio de sesión caducó o ya se usó.",
|
||||
"auth_and_registration.password_is_too_common": "Tu contraseña es demasiado común. Elige una contraseña menos predecible.",
|
||||
"auth_and_registration.password_not_set": "La contraseña no está configurada.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "El discriminador del bot no se puede cambiar.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Clave de API de administrador no válida.",
|
||||
"auth_and_oauth.missing_authorization": "Falta la cabecera de autorización o no es válida.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Debes iniciar sesión antes de enviar mensajes.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Esta transferencia de inicio de sesión no coincide con la que iniciaste.",
|
||||
"auth_and_oauth.registration_closed": "El registro está cerrado en esta instancia.",
|
||||
"auth_and_oauth.registration_pending_approval": "Este registro está pendiente de aprobación por parte del administrador.",
|
||||
"auth_and_oauth.registration_rejected": "Esta solicitud de registro ha sido rechazada.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "No se pudo asignar un discriminador para tu cuenta SSO. Inténtalo de nuevo.",
|
||||
"auth_and_oauth.sudo_mode_required": "Se requiere el modo sudo.",
|
||||
"auth_and_oauth.unknown_application": "Aplicación desconocida.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Esta transferencia de inicio de sesión ha caducado o ya se ha usado.",
|
||||
"auth_and_registration.password_is_too_common": "Tu contraseña es demasiado común. Elige una contraseña menos predecible.",
|
||||
"auth_and_registration.password_not_set": "La contraseña no está establecida.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "El discriminador del bot no se puede cambiar.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Virheellinen ylläpidon API-avain.",
|
||||
"auth_and_oauth.missing_authorization": "Valtuutusotsake puuttuu tai on virheellinen.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Sinun on aloitettava istunto ennen viestien lähettämistä.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Tämä kirjautumisen siirto ei vastaa aloittamaasi siirtoa.",
|
||||
"auth_and_oauth.registration_closed": "Rekisteröinti on suljettu tällä instanssilla.",
|
||||
"auth_and_oauth.registration_pending_approval": "Tämä rekisteröinti odottaa järjestelmänvalvojan hyväksyntää.",
|
||||
"auth_and_oauth.registration_rejected": "Tämä rekisteröintipyyntö hylättiin.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "SSO-tilillesi ei voitu varata nelinumeroista tunnistetta. Yritä uudelleen.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-tila vaaditaan.",
|
||||
"auth_and_oauth.unknown_application": "Tuntematon sovellus.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Tämä kirjautumisen siirto on vanhentunut tai jo käytetty.",
|
||||
"auth_and_registration.password_is_too_common": "Salasanasi on liian yleinen. Valitse vaikeammin arvattava salasana.",
|
||||
"auth_and_registration.password_not_set": "Salasanaa ei ole asetettu.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Botin nelinumeroista tunnistetta ei voi muuttaa.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Clé API administrateur non valide.",
|
||||
"auth_and_oauth.missing_authorization": "En-tête d'autorisation manquant ou non valide.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Vous devez démarrer une session avant d’envoyer des messages.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Ce transfert de connexion ne correspond pas à celui que tu as lancé.",
|
||||
"auth_and_oauth.registration_closed": "L'inscription est fermée sur cette instance.",
|
||||
"auth_and_oauth.registration_pending_approval": "Cette inscription est en attente d'approbation par un administrateur.",
|
||||
"auth_and_oauth.registration_rejected": "Cette demande d'inscription a été rejetée.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Impossible d’attribuer un discriminateur à votre compte SSO. Réessayez.",
|
||||
"auth_and_oauth.sudo_mode_required": "Le mode Sudo est requis.",
|
||||
"auth_and_oauth.unknown_application": "Application inconnue.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Ce transfert de connexion a expiré ou a déjà été utilisé.",
|
||||
"auth_and_registration.password_is_too_common": "Votre mot de passe est trop courant. Choisissez-en un moins prévisible.",
|
||||
"auth_and_registration.password_not_set": "Le mot de passe n'est pas défini.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Le discriminateur du bot ne peut pas être modifié.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "מפתח API של אדמין שגוי.",
|
||||
"auth_and_oauth.missing_authorization": "כותרת ההרשאה חסרה או שגויה.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "יש להתחיל סשן לפני שליחת הודעות.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "העברת ההתחברות הזו אינה תואמת לזו שהתחלת.",
|
||||
"auth_and_oauth.registration_closed": "ההרשמה סגורה במופע זה.",
|
||||
"auth_and_oauth.registration_pending_approval": "הרשמה זו ממתינה לאישור מנהל.",
|
||||
"auth_and_oauth.registration_rejected": "בקשת הרשמה זו נדחתה.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "לא הצלחנו להקצות מזהה לחשבון ה-SSO שלך. ניתן לנסות שוב.",
|
||||
"auth_and_oauth.sudo_mode_required": "נדרש מצב sudo.",
|
||||
"auth_and_oauth.unknown_application": "אפליקציה לא ידועה.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "פג תוקפה של העברת ההתחברות הזו או שכבר נעשה בה שימוש.",
|
||||
"auth_and_registration.password_is_too_common": "הסיסמה שלך נפוצה מדי. מומלץ לבחור סיסמה פחות צפויה.",
|
||||
"auth_and_registration.password_not_set": "סיסמה לא הוגדרה.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "לא ניתן לשנות את המזהה של הבוט.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "एडमिन API कुंजी अमान्य है।",
|
||||
"auth_and_oauth.missing_authorization": "ऑथराइज़ेशन हेडर गायब या अमान्य है।",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "मैसेज भेजने से पहले आपको एक सेशन शुरू करना होगा।",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "यह साइन-इन ट्रांसफ़र आपके द्वारा शुरू किए गए ट्रांसफ़र से मेल नहीं खाता।",
|
||||
"auth_and_oauth.registration_closed": "इस इंस्टेंस पर रजिस्ट्रेशन बंद है।",
|
||||
"auth_and_oauth.registration_pending_approval": "यह रजिस्ट्रेशन एडमिन अप्रूवल का इंतज़ार कर रहा है।",
|
||||
"auth_and_oauth.registration_rejected": "यह रजिस्ट्रेशन रिक्वेस्ट रिजेक्ट कर दी गई है।",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "हम आपके SSO अकाउंट के लिए डिस्क्रिमिनेटर अलॉट नहीं कर सके। फिर से कोशिश करें।",
|
||||
"auth_and_oauth.sudo_mode_required": "सुडो मोड ज़रूरी है।",
|
||||
"auth_and_oauth.unknown_application": "अज्ञात एप्लीकेशन।",
|
||||
"auth_and_oauth.unknown_origin_handoff": "यह साइन-इन ट्रांसफ़र समाप्त हो गया है या पहले ही उपयोग किया जा चुका है।",
|
||||
"auth_and_registration.password_is_too_common": "आपका पासवर्ड बहुत कॉमन है। कृपया ऐसा पासवर्ड चुनें जिसका अंदाज़ा लगाना मुश्किल हो।",
|
||||
"auth_and_registration.password_not_set": "पासवर्ड सेट नहीं है।",
|
||||
"bots.bot_discriminator_cannot_be_changed": "बॉट डिस्क्रिमिनेटर को बदला नहीं जा सकता।",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Nevažeći administratorski API ključ.",
|
||||
"auth_and_oauth.missing_authorization": "Nedostaje ili je nevažeće autorizacijsko zaglavlje.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Moraš započeti sesiju prije slanja poruka.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Ovaj prijenos prijave ne odgovara onome koji ste započeli.",
|
||||
"auth_and_oauth.registration_closed": "Registracija je zatvorena na ovoj instanci.",
|
||||
"auth_and_oauth.registration_pending_approval": "Ova registracija čeka odobrenje administratora.",
|
||||
"auth_and_oauth.registration_rejected": "Ovaj zahtjev za registraciju je odbijen.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nismo mogli dodijeliti diskriminator tvom SSO računu. Pokušaj ponovno.",
|
||||
"auth_and_oauth.sudo_mode_required": "Potreban je sudo način rada.",
|
||||
"auth_and_oauth.unknown_application": "Nepoznata aplikacija.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Ovaj prijenos prijave je istekao ili je već iskorišten.",
|
||||
"auth_and_registration.password_is_too_common": "Tvoja je lozinka previše uobičajena. Odaberi manje predvidljivu lozinku.",
|
||||
"auth_and_registration.password_not_set": "Lozinka nije postavljena.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Diskriminator bota ne može se promijeniti.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Érvénytelen adminisztrátori API-kulcs.",
|
||||
"auth_and_oauth.missing_authorization": "Hiányzó vagy érvénytelen hitelesítési fejléc.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Üzenetek küldéséhez előbb munkamenetet kell indítanod.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Ez a bejelentkezés-átvitel nem egyezik azzal, amelyet elindítottál.",
|
||||
"auth_and_oauth.registration_closed": "Ezen a példányon a regisztráció le van zárva.",
|
||||
"auth_and_oauth.registration_pending_approval": "Ez a regisztráció rendszergazdai jóváhagyásra vár.",
|
||||
"auth_and_oauth.registration_rejected": "Ez a regisztrációs kérelem el lett utasítva.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nem sikerült számazonosítót kiosztani az SSO-fiókodhoz. Próbáld újra.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo mód szükséges.",
|
||||
"auth_and_oauth.unknown_application": "Ismeretlen alkalmazás.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Ez a bejelentkezés-átvitel lejárt, vagy már felhasználták.",
|
||||
"auth_and_registration.password_is_too_common": "A jelszavad túl gyakori. Válassz nehezebben kitalálható jelszót.",
|
||||
"auth_and_registration.password_not_set": "Nincs beállítva jelszó.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "A bot számazonosítója nem módosítható.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Kunci API admin tidak valid.",
|
||||
"auth_and_oauth.missing_authorization": "Header otorisasi hilang atau tidak valid.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Kamu harus memulai sesi sebelum mengirim pesan.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Transfer masuk ini tidak cocok dengan yang kamu mulai.",
|
||||
"auth_and_oauth.registration_closed": "Pendaftaran ditutup di instance ini.",
|
||||
"auth_and_oauth.registration_pending_approval": "Pendaftaran ini menunggu persetujuan admin.",
|
||||
"auth_and_oauth.registration_rejected": "Permintaan pendaftaran ini ditolak.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Tidak bisa mengalokasikan diskriminator untuk akun SSO kamu. Silakan coba lagi.",
|
||||
"auth_and_oauth.sudo_mode_required": "Mode sudo diperlukan.",
|
||||
"auth_and_oauth.unknown_application": "Aplikasi tidak dikenal.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Transfer masuk ini sudah kedaluwarsa atau sudah digunakan.",
|
||||
"auth_and_registration.password_is_too_common": "Kata sandimu terlalu umum. Pilih kata sandi yang lebih sulit ditebak.",
|
||||
"auth_and_registration.password_not_set": "Kata sandi belum diatur.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Diskriminator bot tidak dapat diubah.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Chiave API amministratore non valida.",
|
||||
"auth_and_oauth.missing_authorization": "Header di autorizzazione mancante o non valido.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Devi avviare una sessione prima di inviare messaggi.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Questo trasferimento di accesso non corrisponde a quello che hai avviato.",
|
||||
"auth_and_oauth.registration_closed": "La registrazione è chiusa su questa istanza.",
|
||||
"auth_and_oauth.registration_pending_approval": "Questa registrazione è in attesa dell'approvazione dell'amministratore.",
|
||||
"auth_and_oauth.registration_rejected": "Questa richiesta di registrazione è stata rifiutata.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Non è stato possibile assegnare un discriminatore al tuo account SSO. Riprova.",
|
||||
"auth_and_oauth.sudo_mode_required": "La modalità Sudo è richiesta.",
|
||||
"auth_and_oauth.unknown_application": "Applicazione sconosciuta.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Questo trasferimento di accesso è scaduto o è già stato usato.",
|
||||
"auth_and_registration.password_is_too_common": "La tua password è troppo comune. Scegli una password meno prevedibile.",
|
||||
"auth_and_registration.password_not_set": "La password non è impostata.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Il discriminatore del bot non può essere modificato.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "管理者APIキーが無効です。",
|
||||
"auth_and_oauth.missing_authorization": "認証ヘッダーが見つからないか、無効です。",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "メッセージを送信する前にセッションを開始してください。",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "このサインインの引き継ぎは、開始したものと一致しません。",
|
||||
"auth_and_oauth.registration_closed": "このインスタンスでは新規登録を受け付けていません。",
|
||||
"auth_and_oauth.registration_pending_approval": "この登録は管理者による承認待ちです。",
|
||||
"auth_and_oauth.registration_rejected": "この登録リクエストは拒否されました。",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "SSOアカウントの識別子を割り当てられませんでした。もう一度お試しください。",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudoモードが必要です。",
|
||||
"auth_and_oauth.unknown_application": "不明なアプリケーションです。",
|
||||
"auth_and_oauth.unknown_origin_handoff": "このサインインの引き継ぎは期限切れか、すでに使用されています。",
|
||||
"auth_and_registration.password_is_too_common": "パスワードが一般的すぎます。より推測されにくいパスワードを設定してください。",
|
||||
"auth_and_registration.password_not_set": "パスワードが未設定です。",
|
||||
"bots.bot_discriminator_cannot_be_changed": "ボットの識別子は変更できません。",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "잘못된 관리자 API 키예요.",
|
||||
"auth_and_oauth.missing_authorization": "인증 헤더가 없거나 유효하지 않아요.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "메시지를 보내기 전에 세션을 시작해야 해요.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "이 로그인 이전 요청이 시작한 요청과 일치하지 않습니다.",
|
||||
"auth_and_oauth.registration_closed": "이 인스턴스에서는 가입을 받고 있지 않아요.",
|
||||
"auth_and_oauth.registration_pending_approval": "이 가입 신청은 관리자 승인을 기다리고 있어요.",
|
||||
"auth_and_oauth.registration_rejected": "이 가입 요청은 거부되었어요.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "SSO 계정에 디스크리미네이터를 할당하지 못했어요. 다시 시도해 주세요.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo 모드가 필요해요.",
|
||||
"auth_and_oauth.unknown_application": "알 수 없는 애플리케이션이에요.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "이 로그인 이전 요청이 만료되었거나 이미 사용되었습니다.",
|
||||
"auth_and_registration.password_is_too_common": "비밀번호가 너무 흔해요. 추측하기 어려운 비밀번호를 사용해 주세요.",
|
||||
"auth_and_registration.password_not_set": "비밀번호가 설정되지 않았어요.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "봇 디스크리미네이터를 변경할 수 없어요.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Negaliojantis administratoriaus API raktas.",
|
||||
"auth_and_oauth.missing_authorization": "Trūksta autorizacijos antraštės arba ji neteisinga.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Kad galėtum siųsti žinutes, pirmiausia pradėk seansą.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Šis prisijungimo perkėlimas nesutampa su tuo, kurį pradėjote.",
|
||||
"auth_and_oauth.registration_closed": "Registracija šioje instancijoje yra uždaryta.",
|
||||
"auth_and_oauth.registration_pending_approval": "Ši registracija laukia administratoriaus patvirtinimo.",
|
||||
"auth_and_oauth.registration_rejected": "Šis registracijos prašymas buvo atmestas.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nepavyko priskirti diskriminatoriaus tavo SSO paskyrai. Pabandyk dar kartą.",
|
||||
"auth_and_oauth.sudo_mode_required": "Reikalingas sudo režimas.",
|
||||
"auth_and_oauth.unknown_application": "Nežinoma programa.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Šio prisijungimo perkėlimo galiojimas baigėsi arba jis jau panaudotas.",
|
||||
"auth_and_registration.password_is_too_common": "Tavo slaptažodis per dažnai naudojamas. Pasirink sunkiau nuspėjamą slaptažodį.",
|
||||
"auth_and_registration.password_not_set": "Slaptažodis nenustatytas.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Boto diskriminatoriaus negalima pakeisti.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "De admin-API-sleutel is ongeldig.",
|
||||
"auth_and_oauth.missing_authorization": "De autorisatieheader ontbreekt of is ongeldig.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Je moet een sessie starten voordat je berichten kunt verzenden.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Deze aanmeldoverdracht komt niet overeen met de overdracht die je hebt gestart.",
|
||||
"auth_and_oauth.registration_closed": "Registratie is gesloten op deze instantie.",
|
||||
"auth_and_oauth.registration_pending_approval": "Deze registratie wacht op goedkeuring van de beheerder.",
|
||||
"auth_and_oauth.registration_rejected": "Dit registratieverzoek is afgewezen.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "We konden geen discriminator toewijzen aan je SSO-account. Probeer het nog eens.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-modus is vereist.",
|
||||
"auth_and_oauth.unknown_application": "Onbekende app.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Deze aanmeldoverdracht is verlopen of al gebruikt.",
|
||||
"auth_and_registration.password_is_too_common": "Je wachtwoord komt te vaak voor. Kies een minder voorspelbaar wachtwoord.",
|
||||
"auth_and_registration.password_not_set": "Wachtwoord is niet ingesteld.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "De discriminator van een bot kan niet worden gewijzigd.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Ugyldig API-nøkkel for administrasjon.",
|
||||
"auth_and_oauth.missing_authorization": "Autorisasjonsheaderen mangler eller er ugyldig.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Du må starte en økt før du sender meldinger.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Denne overføringen av innloggingen samsvarer ikke med den du startet.",
|
||||
"auth_and_oauth.registration_closed": "Registrering er stengt på denne instansen.",
|
||||
"auth_and_oauth.registration_pending_approval": "Denne registreringen venter på administratorgodkjenning.",
|
||||
"auth_and_oauth.registration_rejected": "Denne registreringsforespørselen ble avvist.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Vi klarte ikke å tildele en diskriminator til SSO-kontoen din. Prøv igjen.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-modus er påkrevd.",
|
||||
"auth_and_oauth.unknown_application": "Ukjent app.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Denne overføringen av innloggingen er utløpt eller allerede brukt.",
|
||||
"auth_and_registration.password_is_too_common": "Passordet ditt er for vanlig. Velg et passord som er vanskeligere å gjette.",
|
||||
"auth_and_registration.password_not_set": "Det er ikke angitt noe passord.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Botens diskriminator kan ikke endres.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Nieprawidłowy klucz API administratora.",
|
||||
"auth_and_oauth.missing_authorization": "Brakuje nagłówka autoryzacji lub jest on nieprawidłowy.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Musisz rozpocząć sesję, zanim wyślesz wiadomości.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "To przeniesienie logowania nie pasuje do tego, które zostało rozpoczęte.",
|
||||
"auth_and_oauth.registration_closed": "Rejestracja na tej instancji jest zamknięta.",
|
||||
"auth_and_oauth.registration_pending_approval": "Ta rejestracja czeka na zatwierdzenie przez administratora.",
|
||||
"auth_and_oauth.registration_rejected": "Ten wniosek o rejestrację został odrzucony.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nie udało się przydzielić dyskryminatora dla Twojego konta SSO. Spróbuj ponownie.",
|
||||
"auth_and_oauth.sudo_mode_required": "Wymagany tryb sudo.",
|
||||
"auth_and_oauth.unknown_application": "Nieznana aplikacja.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "To przeniesienie logowania wygasło lub zostało już użyte.",
|
||||
"auth_and_registration.password_is_too_common": "Twoje hasło jest zbyt popularne. Wybierz mniej przewidywalne hasło.",
|
||||
"auth_and_registration.password_not_set": "Hasło nie jest ustawione.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Nie można zmienić dyskryminatora bota.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Chave de API de administrador inválida.",
|
||||
"auth_and_oauth.missing_authorization": "Cabeçalho de autorização ausente ou inválido.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Você deve iniciar uma sessão antes de enviar mensagens.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Esta transferência de login não corresponde à que você iniciou.",
|
||||
"auth_and_oauth.registration_closed": "O cadastro está fechado nesta instância.",
|
||||
"auth_and_oauth.registration_pending_approval": "Este cadastro está aguardando a aprovação de um administrador.",
|
||||
"auth_and_oauth.registration_rejected": "Esta solicitação de cadastro foi rejeitada.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Não foi possível alocar um discriminador para sua conta SSO. Tente novamente.",
|
||||
"auth_and_oauth.sudo_mode_required": "O modo sudo é obrigatório.",
|
||||
"auth_and_oauth.unknown_application": "Aplicativo desconhecido.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Esta transferência de login expirou ou já foi usada.",
|
||||
"auth_and_registration.password_is_too_common": "Sua senha é muito comum. Escolha uma senha menos previsível.",
|
||||
"auth_and_registration.password_not_set": "A senha não foi definida.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "O discriminador do bot não pode ser alterado.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Cheia API de administrator este invalidă.",
|
||||
"auth_and_oauth.missing_authorization": "Headerul de autorizare lipsește sau este invalid.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Trebuie să începi o sesiune înainte de a trimite mesaje.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Acest transfer de autentificare nu corespunde celui pe care l-ai început.",
|
||||
"auth_and_oauth.registration_closed": "Înregistrarea este închisă pe această instanță.",
|
||||
"auth_and_oauth.registration_pending_approval": "Această înregistrare așteaptă aprobarea administratorului.",
|
||||
"auth_and_oauth.registration_rejected": "Această cerere de înregistrare a fost respinsă.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Nu s-a putut aloca un discriminator pentru contul tău SSO. Încearcă din nou.",
|
||||
"auth_and_oauth.sudo_mode_required": "Modul Sudo este necesar.",
|
||||
"auth_and_oauth.unknown_application": "Aplicație necunoscută.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Acest transfer de autentificare a expirat sau a fost deja folosit.",
|
||||
"auth_and_registration.password_is_too_common": "Parola ta este prea comună. Alege o parolă mai greu de ghicit.",
|
||||
"auth_and_registration.password_not_set": "Parola nu este setată.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Discriminatorul botului nu poate fi schimbat.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Недействительный ключ Admin API.",
|
||||
"auth_and_oauth.missing_authorization": "Заголовок авторизации отсутствует или недействителен.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Перед отправкой сообщений нужно начать сессию.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Этот перенос входа не совпадает с тем, который вы начали.",
|
||||
"auth_and_oauth.registration_closed": "Регистрация в этом экземпляре закрыта.",
|
||||
"auth_and_oauth.registration_pending_approval": "Эта регистрация ожидает одобрения администратора.",
|
||||
"auth_and_oauth.registration_rejected": "Заявка на регистрацию отклонена.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Не удалось назначить дискриминатор для твоего аккаунта SSO. Попробуй ещё раз.",
|
||||
"auth_and_oauth.sudo_mode_required": "Требуется режим sudo.",
|
||||
"auth_and_oauth.unknown_application": "Неизвестное приложение.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Срок действия этого переноса входа истёк, или он уже использован.",
|
||||
"auth_and_registration.password_is_too_common": "Твой пароль слишком распространённый. Придумай менее предсказуемый пароль.",
|
||||
"auth_and_registration.password_not_set": "Пароль не установлен.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Дискриминатор бота нельзя изменить.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Ogiltig admin-API-nyckel.",
|
||||
"auth_and_oauth.missing_authorization": "Authorization-huvudet saknas eller är ogiltigt.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Du måste starta en session innan du kan skicka meddelanden.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Den här inloggningsöverföringen matchar inte den du startade.",
|
||||
"auth_and_oauth.registration_closed": "Registrering är stängd på den här instansen.",
|
||||
"auth_and_oauth.registration_pending_approval": "Den här registreringen väntar på administratörsgodkännande.",
|
||||
"auth_and_oauth.registration_rejected": "Den här registreringsbegäran avslogs.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Vi kunde inte tilldela en diskriminator för ditt SSO-konto. Försök igen.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo-läge krävs.",
|
||||
"auth_and_oauth.unknown_application": "Okänd applikation.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Den här inloggningsöverföringen har gått ut eller har redan använts.",
|
||||
"auth_and_registration.password_is_too_common": "Ditt lösenord är för vanligt. Välj ett lösenord som är svårare att gissa.",
|
||||
"auth_and_registration.password_not_set": "Inget lösenord har angetts.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Botdiskriminatorn kan inte ändras.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Admin API key ไม่ถูกต้อง",
|
||||
"auth_and_oauth.missing_authorization": "ส่วนหัว Authorization หายไปหรือไม่ถูกต้อง",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "ต้องเริ่มเซสชันก่อนส่งข้อความ",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "การโอนการลงชื่อเข้าใช้นี้ไม่ตรงกับรายการที่คุณเริ่มไว้",
|
||||
"auth_and_oauth.registration_closed": "การลงทะเบียนปิดให้บริการในอินสแตนซ์นี้",
|
||||
"auth_and_oauth.registration_pending_approval": "การลงทะเบียนนี้กำลังรอการอนุมัติจากผู้ดูแลระบบ",
|
||||
"auth_and_oauth.registration_rejected": "คำขอลงทะเบียนนี้ถูกปฏิเสธ",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "ไม่สามารถสร้าง discriminator สำหรับบัญชี SSO ของคุณได้ โปรดลองอีกครั้ง",
|
||||
"auth_and_oauth.sudo_mode_required": "ต้องใช้โหมด sudo",
|
||||
"auth_and_oauth.unknown_application": "ไม่พบแอปพลิเคชัน",
|
||||
"auth_and_oauth.unknown_origin_handoff": "การโอนการลงชื่อเข้าใช้นี้หมดอายุแล้วหรือถูกใช้ไปแล้ว",
|
||||
"auth_and_registration.password_is_too_common": "รหัสผ่านของคุณเป็นรหัสที่พบบ่อยเกินไป โปรดเลือกรหัสผ่านที่เดาได้ยากขึ้น",
|
||||
"auth_and_registration.password_not_set": "ยังไม่ได้ตั้งรหัสผ่าน",
|
||||
"bots.bot_discriminator_cannot_be_changed": "ไม่สามารถเปลี่ยน discriminator ของบอทได้",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Geçersiz yönetici API anahtarı.",
|
||||
"auth_and_oauth.missing_authorization": "Eksik veya geçersiz yetkilendirme başlığı.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Mesaj göndermeden önce bir oturum başlatmalısın.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Bu oturum açma aktarımı başlattığın aktarımla eşleşmiyor.",
|
||||
"auth_and_oauth.registration_closed": "Bu kurulumda kayıt kapalı.",
|
||||
"auth_and_oauth.registration_pending_approval": "Bu kayıt yönetici onayını bekliyor.",
|
||||
"auth_and_oauth.registration_rejected": "Bu kayıt isteği reddedildi.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "SSO hesabın için bir etiket atayamadık. Lütfen tekrar dene.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo modu gerekli.",
|
||||
"auth_and_oauth.unknown_application": "Bilinmeyen uygulama.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Bu oturum açma aktarımının süresi doldu veya zaten kullanıldı.",
|
||||
"auth_and_registration.password_is_too_common": "Şifren çok yaygın. Lütfen tahmin edilmesi daha zor bir şifre seç.",
|
||||
"auth_and_registration.password_not_set": "Şifre ayarlanmamış.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Bot etiketi değiştirilemez.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Недійсний API-ключ адміністратора.",
|
||||
"auth_and_oauth.missing_authorization": "Відсутній або недійсний заголовок авторизації.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Потрібно розпочати сесію, перш ніж надсилати повідомлення.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Це перенесення входу не збігається з тим, яке ви розпочали.",
|
||||
"auth_and_oauth.registration_closed": "Реєстрацію на цьому екземплярі закрито.",
|
||||
"auth_and_oauth.registration_pending_approval": "Ця реєстрація очікує на схвалення адміністратором.",
|
||||
"auth_and_oauth.registration_rejected": "Цей запит на реєстрацію було відхилено.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Не вдалося призначити дискримінатор для твого акаунта SSO. Спробуй ще раз.",
|
||||
"auth_and_oauth.sudo_mode_required": "Потрібен режим sudo.",
|
||||
"auth_and_oauth.unknown_application": "Невідомий застосунок.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Термін дії цього перенесення входу минув, або його вже використано.",
|
||||
"auth_and_registration.password_is_too_common": "Твій пароль занадто поширений. Обери менш передбачуваний пароль.",
|
||||
"auth_and_registration.password_not_set": "Пароль не встановлено.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Дискримінатор бота не можна змінити.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Khóa API quản trị viên không hợp lệ.",
|
||||
"auth_and_oauth.missing_authorization": "Header ủy quyền bị thiếu hoặc không hợp lệ.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "Bạn phải bắt đầu một phiên trước khi gửi tin nhắn.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "Lần chuyển đăng nhập này không khớp với lần bạn đã bắt đầu.",
|
||||
"auth_and_oauth.registration_closed": "Đăng ký đã bị đóng trên phiên bản này.",
|
||||
"auth_and_oauth.registration_pending_approval": "Đăng ký này đang chờ quản trị viên phê duyệt.",
|
||||
"auth_and_oauth.registration_rejected": "Yêu cầu đăng ký này đã bị từ chối.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "Chúng tôi không thể cấp phát mã phân biệt cho tài khoản SSO của bạn. Vui lòng thử lại.",
|
||||
"auth_and_oauth.sudo_mode_required": "Yêu cầu chế độ sudo.",
|
||||
"auth_and_oauth.unknown_application": "Ứng dụng không xác định.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "Lần chuyển đăng nhập này đã hết hạn hoặc đã được sử dụng.",
|
||||
"auth_and_registration.password_is_too_common": "Mật khẩu của bạn quá phổ biến. Vui lòng chọn mật khẩu khó đoán hơn.",
|
||||
"auth_and_registration.password_not_set": "Mật khẩu chưa được đặt.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Không thể thay đổi mã phân biệt của bot.",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "无效的管理员 API 密钥。",
|
||||
"auth_and_oauth.missing_authorization": "缺少或无效的授权请求头。",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "你必须先开始会话才能发送消息。",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "此登录转移与你发起的不一致。",
|
||||
"auth_and_oauth.registration_closed": "此实例的注册已关闭。",
|
||||
"auth_and_oauth.registration_pending_approval": "此注册正在等待管理员批准。",
|
||||
"auth_and_oauth.registration_rejected": "此注册请求已被拒绝。",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "无法为你的 SSO 账号分配识别码。请重试。",
|
||||
"auth_and_oauth.sudo_mode_required": "需要 Sudo 模式。",
|
||||
"auth_and_oauth.unknown_application": "未知应用。",
|
||||
"auth_and_oauth.unknown_origin_handoff": "此登录转移已过期或已被使用。",
|
||||
"auth_and_registration.password_is_too_common": "你的密码太常见了。请换一个更难猜的密码。",
|
||||
"auth_and_registration.password_not_set": "密码未设置。",
|
||||
"bots.bot_discriminator_cannot_be_changed": "机器人识别码无法更改。",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "無效的管理 API 金鑰。",
|
||||
"auth_and_oauth.missing_authorization": "授權標頭遺失或無效。",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "你必須先開始工作階段才能傳送訊息。",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "此登入轉移與你發起的不一致。",
|
||||
"auth_and_oauth.registration_closed": "此實例已關閉註冊。",
|
||||
"auth_and_oauth.registration_pending_approval": "此註冊正在等待管理員核准。",
|
||||
"auth_and_oauth.registration_rejected": "此註冊要求已被拒絕。",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "無法為你的 SSO 帳號分配識別碼。請再試一次。",
|
||||
"auth_and_oauth.sudo_mode_required": "需要 Sudo 模式。",
|
||||
"auth_and_oauth.unknown_application": "不明應用程式。",
|
||||
"auth_and_oauth.unknown_origin_handoff": "此登入轉移已過期或已被使用。",
|
||||
"auth_and_registration.password_is_too_common": "你的密碼太常見。請選擇較難預測的密碼。",
|
||||
"auth_and_registration.password_not_set": "密碼尚未設定。",
|
||||
"bots.bot_discriminator_cannot_be_changed": "機器人識別碼無法變更。",
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
"auth_and_oauth.invalid_token_admin_api_key": "Invalid admin API key.",
|
||||
"auth_and_oauth.missing_authorization": "Missing or invalid authorization header.",
|
||||
"auth_and_oauth.must_start_session_before_sending_messages": "You must start a session before sending messages.",
|
||||
"auth_and_oauth.origin_handoff_nonce_invalid": "This sign-in transfer doesn't match the one you started.",
|
||||
"auth_and_oauth.registration_closed": "Registration is closed on this instance.",
|
||||
"auth_and_oauth.registration_pending_approval": "This registration is waiting for admin approval.",
|
||||
"auth_and_oauth.registration_rejected": "This registration request was rejected.",
|
||||
@@ -109,6 +110,7 @@
|
||||
"auth_and_oauth.sso_unable_to_allocate_discriminator": "We couldn't allocate a discriminator for your SSO account. Please try again.",
|
||||
"auth_and_oauth.sudo_mode_required": "Sudo mode is required.",
|
||||
"auth_and_oauth.unknown_application": "Unknown application.",
|
||||
"auth_and_oauth.unknown_origin_handoff": "This sign-in transfer has expired or was already used.",
|
||||
"auth_and_registration.password_is_too_common": "Your password is too common. Please choose a less predictable password.",
|
||||
"auth_and_registration.password_not_set": "Password isn't set.",
|
||||
"bots.bot_discriminator_cannot_be_changed": "Bot discriminator can't be changed.",
|
||||
|
||||
@@ -11,6 +11,10 @@ import {ADMIN_ACL_COUNT, AdminAclType} from '@fluxer/schema/src/domains/admin/Ad
|
||||
import {AdminArchiveResponseSchema} from '@fluxer/schema/src/domains/admin/AdminArchiveSchemas';
|
||||
import {GuildAdminResponse} from '@fluxer/schema/src/domains/admin/AdminGuildSchemas';
|
||||
import {UserAdminResponseSchema} from '@fluxer/schema/src/domains/admin/AdminUserSchemas';
|
||||
import {
|
||||
DomainMigrationConfigResponse,
|
||||
DomainMigrationConfigUpdateRequest,
|
||||
} from '@fluxer/schema/src/domains/admin/DomainMigrationSchemas';
|
||||
import {
|
||||
GatewayRolloutConfigResponse,
|
||||
GatewayRolloutConfigUpdateRequest,
|
||||
@@ -649,6 +653,7 @@ export const InstanceConfigResponse = z.object({
|
||||
gateway_rollout: GatewayRolloutConfigResponse,
|
||||
voice_noise_suppression: VoiceNoiseSuppressionConfigResponse,
|
||||
push_service_delivery: PushServiceDeliveryConfigResponse,
|
||||
domain_migration: DomainMigrationConfigResponse,
|
||||
experiment_delivery: ExperimentDeliveryConfigResponse,
|
||||
registration: InstanceRegistrationResponse,
|
||||
self_hosted: z.boolean(),
|
||||
@@ -686,6 +691,7 @@ export const InstanceConfigUpdateRequest = z.object({
|
||||
gateway_rollout: GatewayRolloutConfigUpdateRequest.nullish(),
|
||||
voice_noise_suppression: VoiceNoiseSuppressionConfigUpdateRequest.nullish(),
|
||||
push_service_delivery: PushServiceDeliveryConfigUpdateRequest.nullish(),
|
||||
domain_migration: DomainMigrationConfigUpdateRequest.nullish(),
|
||||
experiment_delivery: ExperimentDeliveryConfigUpdateRequest.nullish(),
|
||||
registration: z
|
||||
.object({
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
DEFAULT_DOMAIN_MIGRATION_CONFIG,
|
||||
type DomainMigrationConfig,
|
||||
DomainMigrationConfigSchema,
|
||||
DomainMigrationConfigUpdateRequest,
|
||||
INERT_DOMAIN_MIGRATION_ASSIGNMENT,
|
||||
resolveDomainMigrationAssignment,
|
||||
toDomainMigrationDiscovery,
|
||||
} from '@fluxer/schema/src/domains/admin/DomainMigrationSchemas';
|
||||
import {experimentBucket} from '@fluxer/schema/src/domains/experiment/ExperimentBucket';
|
||||
import {describe, expect, test} from 'vitest';
|
||||
|
||||
const TARGETED_USER_ID = '1000000000000000001';
|
||||
const OTHER_USER_ID = '1000000000000000002';
|
||||
|
||||
function createConfig(overrides: Partial<DomainMigrationConfig> = {}): DomainMigrationConfig {
|
||||
return {
|
||||
...DEFAULT_DOMAIN_MIGRATION_CONFIG,
|
||||
included_user_ids: [],
|
||||
excluded_user_ids: [],
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
function syntheticUserIds(count: number): Array<string> {
|
||||
const ids: Array<string> = [];
|
||||
for (let index = 0; index < count; index++) {
|
||||
ids.push((1400000000000000000n + BigInt(index)).toString());
|
||||
}
|
||||
return ids;
|
||||
}
|
||||
|
||||
function targetedUserIds(config: DomainMigrationConfig, userIds: ReadonlyArray<string>): Set<string> {
|
||||
const targeted = new Set<string>();
|
||||
for (const userId of userIds) {
|
||||
if (resolveDomainMigrationAssignment(config, userId).enabled) {
|
||||
targeted.add(userId);
|
||||
}
|
||||
}
|
||||
return targeted;
|
||||
}
|
||||
|
||||
describe('domain migration configuration', () => {
|
||||
test('derives defaults from the schema with independently owned arrays', () => {
|
||||
const first = DomainMigrationConfigSchema.parse({});
|
||||
const second = DomainMigrationConfigSchema.parse({});
|
||||
expect(first).toEqual(DEFAULT_DOMAIN_MIGRATION_CONFIG);
|
||||
first.included_user_ids.push(TARGETED_USER_ID);
|
||||
first.excluded_user_ids.push(OTHER_USER_ID);
|
||||
expect(second).toEqual(DEFAULT_DOMAIN_MIGRATION_CONFIG);
|
||||
});
|
||||
|
||||
test('defaults to disabled with an empty rollout', () => {
|
||||
expect(DEFAULT_DOMAIN_MIGRATION_CONFIG.enabled).toBe(false);
|
||||
expect(DEFAULT_DOMAIN_MIGRATION_CONFIG.rollout_basis_points).toBe(0);
|
||||
expect(DEFAULT_DOMAIN_MIGRATION_CONFIG.anonymous_rollout_basis_points).toBe(0);
|
||||
expect(DEFAULT_DOMAIN_MIGRATION_CONFIG.rollout_salt).toBe('domain-migration-v1');
|
||||
expect(DEFAULT_DOMAIN_MIGRATION_CONFIG.standalone_forwarding).toBe(false);
|
||||
});
|
||||
|
||||
test('fills standalone forwarding in for configs stored before it existed', () => {
|
||||
const stored = DomainMigrationConfigSchema.parse({enabled: true, config_version: 4, rollout_basis_points: 100});
|
||||
expect(stored.standalone_forwarding).toBe(false);
|
||||
});
|
||||
|
||||
test.each([{}, {enabled: false}, {enabled: undefined}, {rollout_basis_points: 2500}, {standalone_forwarding: true}])(
|
||||
'keeps partial updates free of configuration defaults: %j',
|
||||
(patch) => {
|
||||
expect(DomainMigrationConfigUpdateRequest.parse(patch)).toEqual(patch);
|
||||
},
|
||||
);
|
||||
|
||||
test('does not accept a client-provided configuration version', () => {
|
||||
expect(DomainMigrationConfigUpdateRequest.parse({config_version: 12})).toEqual({});
|
||||
});
|
||||
|
||||
test.each([
|
||||
{rollout_basis_points: -1},
|
||||
{rollout_basis_points: 10001},
|
||||
{anonymous_rollout_basis_points: -1},
|
||||
{anonymous_rollout_basis_points: 10001},
|
||||
{anonymous_rollout_basis_points: 1.5},
|
||||
{rollout_salt: ' '},
|
||||
{rollout_salt: 'domain-migration-\u00e9'},
|
||||
{included_user_ids: ['not-an-id']},
|
||||
{excluded_user_ids: ['not-an-id']},
|
||||
{standalone_forwarding: 'yes'},
|
||||
])('applies the same validation to stored configuration and updates: %j', (value) => {
|
||||
expect(DomainMigrationConfigSchema.safeParse(value).success).toBe(false);
|
||||
expect(DomainMigrationConfigUpdateRequest.safeParse(value).success).toBe(false);
|
||||
});
|
||||
|
||||
test('rejects more than a thousand targeted user ids', () => {
|
||||
const ids = syntheticUserIds(1001);
|
||||
expect(DomainMigrationConfigSchema.safeParse({included_user_ids: ids}).success).toBe(false);
|
||||
expect(DomainMigrationConfigSchema.safeParse({included_user_ids: ids.slice(0, 1000)}).success).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('resolveDomainMigrationAssignment', () => {
|
||||
test('the inert assignment is disabled', () => {
|
||||
expect(INERT_DOMAIN_MIGRATION_ASSIGNMENT.enabled).toBe(false);
|
||||
});
|
||||
|
||||
test('returns the inert assignment when the master switch is off', () => {
|
||||
const config = createConfig({
|
||||
enabled: false,
|
||||
rollout_basis_points: 10000,
|
||||
included_user_ids: [TARGETED_USER_ID],
|
||||
});
|
||||
expect(resolveDomainMigrationAssignment(config, TARGETED_USER_ID)).toEqual(INERT_DOMAIN_MIGRATION_ASSIGNMENT);
|
||||
});
|
||||
|
||||
test('returns the inert assignment for the default config', () => {
|
||||
expect(resolveDomainMigrationAssignment(createConfig(), TARGETED_USER_ID)).toEqual(
|
||||
INERT_DOMAIN_MIGRATION_ASSIGNMENT,
|
||||
);
|
||||
});
|
||||
|
||||
test('never hands back the shared inert object', () => {
|
||||
const assignment = resolveDomainMigrationAssignment(createConfig(), TARGETED_USER_ID);
|
||||
expect(assignment).not.toBe(INERT_DOMAIN_MIGRATION_ASSIGNMENT);
|
||||
});
|
||||
|
||||
test('denylist beats allowlist', () => {
|
||||
const config = createConfig({
|
||||
enabled: true,
|
||||
included_user_ids: [TARGETED_USER_ID],
|
||||
excluded_user_ids: [TARGETED_USER_ID],
|
||||
});
|
||||
expect(resolveDomainMigrationAssignment(config, TARGETED_USER_ID).enabled).toBe(false);
|
||||
});
|
||||
|
||||
test('denylist beats the bucket', () => {
|
||||
const config = createConfig({
|
||||
enabled: true,
|
||||
rollout_basis_points: 10000,
|
||||
excluded_user_ids: [TARGETED_USER_ID],
|
||||
});
|
||||
expect(resolveDomainMigrationAssignment(config, TARGETED_USER_ID).enabled).toBe(false);
|
||||
expect(resolveDomainMigrationAssignment(config, OTHER_USER_ID).enabled).toBe(true);
|
||||
});
|
||||
|
||||
test('allowlist beats the bucket', () => {
|
||||
const config = createConfig({
|
||||
enabled: true,
|
||||
rollout_basis_points: 0,
|
||||
included_user_ids: [TARGETED_USER_ID],
|
||||
});
|
||||
expect(resolveDomainMigrationAssignment(config, TARGETED_USER_ID).enabled).toBe(true);
|
||||
expect(resolveDomainMigrationAssignment(config, OTHER_USER_ID).enabled).toBe(false);
|
||||
});
|
||||
|
||||
test.each([
|
||||
{basisPoints: 0, enabled: false},
|
||||
{basisPoints: 10000, enabled: true},
|
||||
])('a rollout of $basisPoints basis points targets $enabled', ({basisPoints, enabled}) => {
|
||||
const config = createConfig({enabled: true, rollout_basis_points: basisPoints});
|
||||
for (const userId of syntheticUserIds(200)) {
|
||||
expect(resolveDomainMigrationAssignment(config, userId).enabled).toBe(enabled);
|
||||
}
|
||||
});
|
||||
|
||||
test('the bucket boundary is exclusive at the low end and inclusive one point above', () => {
|
||||
const salt = DEFAULT_DOMAIN_MIGRATION_CONFIG.rollout_salt;
|
||||
const bucket = experimentBucket(TARGETED_USER_ID, salt);
|
||||
expect(
|
||||
resolveDomainMigrationAssignment(createConfig({enabled: true, rollout_basis_points: bucket}), TARGETED_USER_ID)
|
||||
.enabled,
|
||||
).toBe(false);
|
||||
expect(
|
||||
resolveDomainMigrationAssignment(
|
||||
createConfig({enabled: true, rollout_basis_points: bucket + 1}),
|
||||
TARGETED_USER_ID,
|
||||
).enabled,
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
test('raising the rollout basis points only ever adds users', () => {
|
||||
const userIds = syntheticUserIds(2000);
|
||||
const atOneThousand = targetedUserIds(createConfig({enabled: true, rollout_basis_points: 1000}), userIds);
|
||||
const atTwoThousand = targetedUserIds(createConfig({enabled: true, rollout_basis_points: 2000}), userIds);
|
||||
expect(atOneThousand.size).toBeGreaterThan(0);
|
||||
for (const userId of atOneThousand) {
|
||||
expect(atTwoThousand.has(userId)).toBe(true);
|
||||
}
|
||||
expect(atTwoThousand.size).toBeGreaterThan(atOneThousand.size);
|
||||
});
|
||||
|
||||
test('the targeted set follows the salt', () => {
|
||||
const userIds = syntheticUserIds(2000);
|
||||
const first = targetedUserIds(
|
||||
createConfig({enabled: true, rollout_basis_points: 5000, rollout_salt: 'domain-migration-v1'}),
|
||||
userIds,
|
||||
);
|
||||
const second = targetedUserIds(
|
||||
createConfig({enabled: true, rollout_basis_points: 5000, rollout_salt: 'domain-migration-v2'}),
|
||||
userIds,
|
||||
);
|
||||
expect(first).not.toEqual(second);
|
||||
});
|
||||
});
|
||||
|
||||
describe('toDomainMigrationDiscovery', () => {
|
||||
test('projects only the public fields of the config', () => {
|
||||
const config = createConfig({
|
||||
enabled: true,
|
||||
config_version: 3,
|
||||
rollout_basis_points: 500,
|
||||
rollout_salt: 'domain-migration-v2',
|
||||
anonymous_rollout_basis_points: 250,
|
||||
included_user_ids: [TARGETED_USER_ID],
|
||||
excluded_user_ids: [OTHER_USER_ID],
|
||||
standalone_forwarding: true,
|
||||
});
|
||||
expect(toDomainMigrationDiscovery(config)).toEqual({
|
||||
enabled: true,
|
||||
anonymous_rollout_basis_points: 250,
|
||||
rollout_salt: 'domain-migration-v2',
|
||||
standalone_forwarding: true,
|
||||
});
|
||||
});
|
||||
|
||||
test('reports the kill switch for the default config', () => {
|
||||
expect(toDomainMigrationDiscovery(DEFAULT_DOMAIN_MIGRATION_CONFIG)).toEqual({
|
||||
enabled: false,
|
||||
anonymous_rollout_basis_points: 0,
|
||||
rollout_salt: 'domain-migration-v1',
|
||||
standalone_forwarding: false,
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,94 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {EXPERIMENT_BUCKET_RESOLUTION, experimentBucket} from '@fluxer/schema/src/domains/experiment/ExperimentBucket';
|
||||
import {z} from 'zod';
|
||||
|
||||
const DOMAIN_MIGRATION_ROLLOUT_BASIS_POINTS_MAX = EXPERIMENT_BUCKET_RESOLUTION;
|
||||
const DOMAIN_MIGRATION_MAX_TARGETED_USERS = 1000;
|
||||
const DEFAULT_DOMAIN_MIGRATION_SALT = 'domain-migration-v1';
|
||||
|
||||
const DOMAIN_MIGRATION_SALT_PATTERN = /^[\x20-\x7e]+$/u;
|
||||
|
||||
const DomainMigrationTargetIdSchema = z.string().regex(/^\d{1,20}$/u);
|
||||
const DomainMigrationTargetedUserIdsSchema = z
|
||||
.array(DomainMigrationTargetIdSchema)
|
||||
.max(DOMAIN_MIGRATION_MAX_TARGETED_USERS);
|
||||
|
||||
const domainMigrationConfigFields = {
|
||||
enabled: z.boolean(),
|
||||
config_version: z.number().int().min(0),
|
||||
rollout_basis_points: z.number().int().min(0).max(DOMAIN_MIGRATION_ROLLOUT_BASIS_POINTS_MAX),
|
||||
rollout_salt: z.string().trim().min(1).max(64).regex(DOMAIN_MIGRATION_SALT_PATTERN),
|
||||
included_user_ids: DomainMigrationTargetedUserIdsSchema,
|
||||
excluded_user_ids: DomainMigrationTargetedUserIdsSchema,
|
||||
anonymous_rollout_basis_points: z.number().int().min(0).max(DOMAIN_MIGRATION_ROLLOUT_BASIS_POINTS_MAX),
|
||||
standalone_forwarding: z.boolean(),
|
||||
};
|
||||
|
||||
export const DomainMigrationConfigSchema = z.object({
|
||||
enabled: domainMigrationConfigFields.enabled.default(false),
|
||||
config_version: domainMigrationConfigFields.config_version.default(0),
|
||||
rollout_basis_points: domainMigrationConfigFields.rollout_basis_points.default(0),
|
||||
rollout_salt: domainMigrationConfigFields.rollout_salt.default(DEFAULT_DOMAIN_MIGRATION_SALT),
|
||||
included_user_ids: domainMigrationConfigFields.included_user_ids.default([]),
|
||||
excluded_user_ids: domainMigrationConfigFields.excluded_user_ids.default([]),
|
||||
anonymous_rollout_basis_points: domainMigrationConfigFields.anonymous_rollout_basis_points.default(0),
|
||||
standalone_forwarding: domainMigrationConfigFields.standalone_forwarding.default(false),
|
||||
});
|
||||
|
||||
export type DomainMigrationConfig = z.infer<typeof DomainMigrationConfigSchema>;
|
||||
|
||||
export const DEFAULT_DOMAIN_MIGRATION_CONFIG: DomainMigrationConfig = DomainMigrationConfigSchema.parse({});
|
||||
|
||||
export const DomainMigrationConfigUpdateRequest = z
|
||||
.object(domainMigrationConfigFields)
|
||||
.omit({config_version: true})
|
||||
.partial();
|
||||
|
||||
export type DomainMigrationConfigUpdateRequest = z.infer<typeof DomainMigrationConfigUpdateRequest>;
|
||||
|
||||
export const DomainMigrationConfigResponse = DomainMigrationConfigSchema;
|
||||
|
||||
export type DomainMigrationConfigResponse = z.infer<typeof DomainMigrationConfigResponse>;
|
||||
|
||||
export const DomainMigrationAssignmentResponse = z.object({
|
||||
enabled: domainMigrationConfigFields.enabled,
|
||||
});
|
||||
|
||||
export type DomainMigrationAssignmentResponse = z.infer<typeof DomainMigrationAssignmentResponse>;
|
||||
|
||||
export const INERT_DOMAIN_MIGRATION_ASSIGNMENT: DomainMigrationAssignmentResponse = {
|
||||
enabled: false,
|
||||
};
|
||||
|
||||
export function resolveDomainMigrationAssignment(
|
||||
config: DomainMigrationConfig,
|
||||
userId: string,
|
||||
): DomainMigrationAssignmentResponse {
|
||||
if (!config.enabled) return {...INERT_DOMAIN_MIGRATION_ASSIGNMENT};
|
||||
if (config.excluded_user_ids.includes(userId)) return {...INERT_DOMAIN_MIGRATION_ASSIGNMENT};
|
||||
if (config.included_user_ids.includes(userId)) return {enabled: true};
|
||||
return {enabled: experimentBucket(userId, config.rollout_salt) < config.rollout_basis_points};
|
||||
}
|
||||
|
||||
export const DomainMigrationDiscoveryResponse = z.object({
|
||||
enabled: domainMigrationConfigFields.enabled.describe('Whether the domain migration is switched on'),
|
||||
anonymous_rollout_basis_points: domainMigrationConfigFields.anonymous_rollout_basis_points.describe(
|
||||
'Share of logged-out devices, in basis points, that move to the new domain',
|
||||
),
|
||||
rollout_salt: domainMigrationConfigFields.rollout_salt.describe('Salt used to bucket devices and users'),
|
||||
standalone_forwarding: domainMigrationConfigFields.standalone_forwarding.describe(
|
||||
'Whether installed desktop web apps forward to the new domain after moving their session',
|
||||
),
|
||||
});
|
||||
|
||||
export type DomainMigrationDiscoveryResponse = z.infer<typeof DomainMigrationDiscoveryResponse>;
|
||||
|
||||
export function toDomainMigrationDiscovery(config: DomainMigrationConfig): DomainMigrationDiscoveryResponse {
|
||||
return {
|
||||
enabled: config.enabled,
|
||||
anonymous_rollout_basis_points: config.anonymous_rollout_basis_points,
|
||||
rollout_salt: config.rollout_salt,
|
||||
standalone_forwarding: config.standalone_forwarding,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {z} from 'zod';
|
||||
|
||||
export const ORIGIN_HANDOFF_MAX_PAYLOAD_LENGTH = 8 * 1024 * 1024;
|
||||
|
||||
const Base64UrlPattern = /^[A-Za-z0-9_-]+$/u;
|
||||
|
||||
export const OriginHandoffCreateRequest = z.object({
|
||||
nonce_hash: z
|
||||
.string()
|
||||
.regex(/^[0-9a-f]{64}$/u)
|
||||
.describe('Lowercase hex SHA-256 digest of the nonce the receiving origin holds'),
|
||||
payload: z
|
||||
.string()
|
||||
.min(1)
|
||||
.max(ORIGIN_HANDOFF_MAX_PAYLOAD_LENGTH)
|
||||
.regex(Base64UrlPattern)
|
||||
.describe('Encrypted client state encoded as base64url'),
|
||||
});
|
||||
|
||||
export type OriginHandoffCreateRequest = z.infer<typeof OriginHandoffCreateRequest>;
|
||||
|
||||
export const OriginHandoffCreateResponse = z.object({
|
||||
handoff_id: z.string().describe('Single-use identifier the receiving origin redeems'),
|
||||
});
|
||||
|
||||
export type OriginHandoffCreateResponse = z.infer<typeof OriginHandoffCreateResponse>;
|
||||
|
||||
export const OriginHandoffRedeemRequest = z.object({
|
||||
handoff_id: z
|
||||
.string()
|
||||
.regex(/^[A-Za-z0-9_-]{43}$/u)
|
||||
.describe('Identifier returned when the handoff was created'),
|
||||
nonce: z
|
||||
.string()
|
||||
.min(16)
|
||||
.max(256)
|
||||
.regex(Base64UrlPattern)
|
||||
.describe('Nonce whose SHA-256 digest was sent when the handoff was created'),
|
||||
});
|
||||
|
||||
export type OriginHandoffRedeemRequest = z.infer<typeof OriginHandoffRedeemRequest>;
|
||||
|
||||
export const OriginHandoffRedeemResponse = z.object({
|
||||
payload: z.string().describe('Encrypted client state encoded as base64url'),
|
||||
});
|
||||
|
||||
export type OriginHandoffRedeemResponse = z.infer<typeof OriginHandoffRedeemResponse>;
|
||||
@@ -1,5 +1,9 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {
|
||||
DomainMigrationAssignmentResponse,
|
||||
INERT_DOMAIN_MIGRATION_ASSIGNMENT,
|
||||
} from '@fluxer/schema/src/domains/admin/DomainMigrationSchemas';
|
||||
import {
|
||||
INERT_VOICE_NOISE_SUPPRESSION_ASSIGNMENT,
|
||||
VoiceNoiseSuppressionAssignmentResponse,
|
||||
@@ -42,6 +46,7 @@ export type ExperimentDeliveryConfigResponse = z.infer<typeof ExperimentDelivery
|
||||
|
||||
const ExperimentAssignmentsSchema = z.object({
|
||||
voice_noise_suppression: VoiceNoiseSuppressionAssignmentResponse.optional(),
|
||||
domain_migration: DomainMigrationAssignmentResponse.optional(),
|
||||
});
|
||||
|
||||
export const ExperimentAssignmentsResponse = z.object({
|
||||
@@ -63,3 +68,9 @@ export function readVoiceNoiseSuppressionAssignment(
|
||||
): VoiceNoiseSuppressionAssignmentResponse {
|
||||
return response.assignments.voice_noise_suppression ?? INERT_VOICE_NOISE_SUPPRESSION_ASSIGNMENT;
|
||||
}
|
||||
|
||||
export function readDomainMigrationAssignment(
|
||||
response: ExperimentAssignmentsResponse,
|
||||
): DomainMigrationAssignmentResponse {
|
||||
return response.assignments.domain_migration ?? INERT_DOMAIN_MIGRATION_ASSIGNMENT;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {DomainMigrationDiscoveryResponse} from '@fluxer/schema/src/domains/admin/DomainMigrationSchemas';
|
||||
import {SsoStatusResponse} from '@fluxer/schema/src/domains/auth/AuthSchemas';
|
||||
import {createNamedStringLiteralUnion} from '@fluxer/schema/src/primitives/SchemaPrimitives';
|
||||
import {z} from 'zod';
|
||||
@@ -187,6 +188,9 @@ export const WellKnownFluxerResponse = z.object({
|
||||
limits: LimitConfigResponse.describe('Limit configuration with rules and trait definitions'),
|
||||
push: InstancePushSchema,
|
||||
app_public: InstanceAppPublicSchema.describe('Public application configuration for client-side features'),
|
||||
domain_migration: DomainMigrationDiscoveryResponse.optional().describe(
|
||||
'Web domain migration switch and anonymous rollout, only acted on by official instance clients',
|
||||
),
|
||||
});
|
||||
|
||||
export type WellKnownFluxerResponse = z.infer<typeof WellKnownFluxerResponse>;
|
||||
|
||||
@@ -615,6 +615,7 @@ export const PushSubscribeRequest = z.object({
|
||||
})
|
||||
.describe('Encryption keys for the push subscription'),
|
||||
user_agent: createStringType(1, 1024).optional().describe('The user agent string identifying the client'),
|
||||
installed_app: z.boolean().optional().describe('Whether the client runs in an installed web app window'),
|
||||
});
|
||||
|
||||
export type PushSubscribeRequest = z.infer<typeof PushSubscribeRequest>;
|
||||
@@ -629,6 +630,7 @@ export const PushRotateRequest = z.object({
|
||||
})
|
||||
.describe('Encryption keys for the new push subscription'),
|
||||
user_agent: createStringType(1, 1024).optional().describe('The user agent string identifying the client'),
|
||||
installed_app: z.boolean().optional().describe('Whether the client runs in an installed web app window'),
|
||||
});
|
||||
|
||||
export type PushRotateRequest = z.infer<typeof PushRotateRequest>;
|
||||
|
||||
Reference in New Issue
Block a user