diff --git a/app/controllers/web/my-account/generate-alias-password.js b/app/controllers/web/my-account/generate-alias-password.js index 667b61e58e..fd3a246054 100644 --- a/app/controllers/web/my-account/generate-alias-password.js +++ b/app/controllers/web/my-account/generate-alias-password.js @@ -185,7 +185,18 @@ async function generateAliasPassword(ctx) { 0 ); + if (!ctx.api) { + ctx.flash( + 'success', + ctx.translate( + 'ALIAS_REKEY_STARTED', + `${alias.name}@${ctx.state.domain.name}` + ) + ); + } + // don't save until we're sure that sqlite operations were performed + alias.is_rekey = true; await alias.save(); // close websocket diff --git a/app/models/aliases.js b/app/models/aliases.js index 750ea4bf35..c9ea0f4a6d 100644 --- a/app/models/aliases.js +++ b/app/models/aliases.js @@ -92,6 +92,12 @@ APS.plugin(mongooseCommonPlugin, { }); const Aliases = new mongoose.Schema({ + // if a rekey operation is being performed then don't allow auth or read/write + is_rekey: { + type: Boolean, + default: false + }, + // alias specific max quota (set by admins only) max_quota: { type: Number, @@ -409,7 +415,7 @@ Aliases.pre('validate', function (next) { // it populates "id" String automatically for comparisons Aliases.plugin(mongooseCommonPlugin, { object: 'alias', - omitExtraFields: ['is_api', 'tokens', 'pgp_error_sent_at', 'aps'], + omitExtraFields: ['is_rekey', 'is_api', 'tokens', 'pgp_error_sent_at', 'aps'], defaultLocale: i18n.getLocale() }); diff --git a/app/models/domains.js b/app/models/domains.js index 978e354b64..b8464d5ab0 100644 --- a/app/models/domains.js +++ b/app/models/domains.js @@ -367,7 +367,7 @@ const Domains = new mongoose.Schema({ default: '25', validator: (value) => isPort(value) }, - alias_count: { + alias_count: { type: Number, min: 0, index: true diff --git a/config/phrases.js b/config/phrases.js index 802b362078..ad0f4bbcd4 100644 --- a/config/phrases.js +++ b/config/phrases.js @@ -85,6 +85,16 @@ module.exports = { 'You have exceeded the maximum number of failed authentication attempts. Please try again later or contact us.', ALIAS_BACKUP_LINK: 'Please click here to download the backup. This link will expire soon.', + ALIAS_REKEY_STARTED: + 'Alias password change (rekey) has been started for %s and you will be emailed upon completion.', + ALIAS_REKEY_READY: + 'Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.', + ALIAS_REKEY_READY_SUBJECT: + 'Alias password change (rekey) for %s is complete', + ALIAS_REKEY_FAILED_SUBJECT: + 'Alias password change (rekey) for %s has failed due to an error', + ALIAS_REKEY_FAILED_MESSAGE: + '

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
', ALIAS_BACKUP_READY: 'Click the button below within 4 hours to download the "%s" backup for %s.

Download Now', ALIAS_BACKUP_READY_SUBJECT: diff --git a/helpers/on-auth.js b/helpers/on-auth.js index c8ddb0e381..6701181b1f 100644 --- a/helpers/on-auth.js +++ b/helpers/on-auth.js @@ -187,7 +187,7 @@ async function onAuth(auth, session, fn) { 'user', `id ${config.userFields.isBanned} ${config.userFields.smtpLimit} email ${config.lastLocaleField} timezone` ) - .select('+tokens.hash +tokens.salt') + .select('+tokens.hash +tokens.salt +is_rekey') .lean() .exec(); @@ -203,11 +203,22 @@ async function onAuth(auth, session, fn) { // validate the `auth.password` provided // - // IMAP and POP3 servers can only validate against aliases + // IMAP/POP3/CalDAV servers can only validate against aliases if ( this.server instanceof IMAPServer || - this.server instanceof POP3Server + this.server instanceof POP3Server || + this?.constructor?.name === 'CalDAV' ) { + if (typeof alias.is_rekey === 'boolean' && alias.is_rekey === true) + throw new SMTPError( + 'Alias is undergoing a rekey operation, please try again once completed', + { + responseCode: 535, + ignoreHook: true, + imapResponse: 'AUTHENTICATIONFAILED' + } + ); + if (!Array.isArray(alias.tokens) || alias?.tokens?.length === 0) throw new SMTPError( `Alias does not have a generated password yet, go to ${ diff --git a/helpers/parse-payload.js b/helpers/parse-payload.js index 3ad5199114..76c552def1 100644 --- a/helpers/parse-payload.js +++ b/helpers/parse-payload.js @@ -1504,10 +1504,12 @@ async function parsePayload(data, ws) { const cache = await this.client.get( `reset_check:${payload.session.user.alias_id}` ); + if (cache) throw Boom.clientTimeout( i18n.translateError('RATE_LIMITED', payload.session.user.locale) ); + await this.client.set( `reset_check:${payload.session.user.alias_id}`, true, @@ -1515,120 +1517,26 @@ async function parsePayload(data, ws) { ms('30s') ); - // check if file path was <= initial db size - // (and if so then perform the same logic as in "reset") - let reset = false; - if (!stats || stats.size <= config.INITIAL_DB_SIZE) { - try { - await fs.promises.rm(storagePath, { - force: true, - recursive: true - }); - } catch (err) { - if (err.code !== 'ENOENT') { - err.isCodeBug = true; - throw err; - } - } - - // -wal - try { - await fs.promises.rm( - storagePath.replace('.sqlite', '.sqlite-wal'), - { - force: true, - recursive: true - } - ); - } catch (err) { - if (err.code !== 'ENOENT') { - err.isCodeBug = true; - throw err; - } - } - - // -shm - try { - await fs.promises.rm( - storagePath.replace('.sqlite', '.sqlite-shm'), - { - force: true, - recursive: true - } - ); - } catch (err) { - if (err.code !== 'ENOENT') { - err.isCodeBug = true; - throw err; - } - } - - reset = true; - - // close existing connection if any and purge it - if ( - this?.databaseMap && - this.databaseMap.has(payload.session.user.alias_id) - ) { - await closeDatabase( - this.databaseMap.get(payload.session.user.alias_id) - ); - this.databaseMap.delete(payload.session.user.alias_id); - } - - // TODO: this should not fix database - db = await getDatabase( - this, - // alias - { - id: payload.session.user.alias_id, - storage_location: payload.session.user.storage_location - }, - { - ...payload.session, - user: { - ...payload.session.user, - password: payload.new_password - } - } - ); - } - // - // NOTE: if we're not resetting database then assume we want to do a backup + // NOTE: if maxQueue exceeded then this will error and reject + // + // (note all of these error messages are in TimeoutError checking) // - let err; - if (!reset) { - // - // NOTE: if maxQueue exceeded then this will error and reject - // - // (note all of these error messages are in TimeoutError checking) - // - try { - // run in worker pool to offset from main thread (because of VACUUM) - await this.piscina.run(payload, { name: 'rekey' }); - } catch (_err) { - err = _err; - } - } - - // update storage - try { - await updateStorageUsed(payload.session.user.alias_id, this.client); - } catch (err) { - logger.fatal(err, { payload }); - } - - // remove write lock - // await this.client.del(`reset_check:${payload.session.user.alias_id}`); - - if (err) throw err; + // run in worker pool to offset from main thread (because of VACUUM) + // and run this in the background + // + this.piscina + .run(payload, { name: 'rekey' }) + .then() + .catch((err) => logger.fatal(err, { payload })); response = { id: payload.id, data: true }; + this.client.publish('sqlite_auth_reset', payload.session.user.alias_id); + break; } diff --git a/helpers/worker.js b/helpers/worker.js index 1547fb857d..5d82667493 100644 --- a/helpers/worker.js +++ b/helpers/worker.js @@ -134,108 +134,108 @@ async function rekey(payload) { await setupMongoose(logger); await logger.debug('rekey worker', { payload }); + let err; + let tmp; + let backup = true; - const storagePath = getPathToDatabase({ - id: payload.session.user.alias_id, - storage_location: payload.session.user.storage_location - }); + try { + const storagePath = getPathToDatabase({ + id: payload.session.user.alias_id, + storage_location: payload.session.user.storage_location + }); - // - const stats = await fs.promises.stat(storagePath); - if ( - !stats.isFile() || - stats.size === 0 || - stats.size <= config.INITIAL_DB_SIZE - ) { - const err = new TypeError('Database empty'); - err.stats = stats; - throw err; - } + // + const stats = await fs.promises.stat(storagePath); + if ( + !stats.isFile() || + stats.size === 0 + // || stats.size <= config.INITIAL_DB_SIZE + ) { + const err = new TypeError('Database empty'); + err.stats = stats; + throw err; + } - // we calculate size of db x 2 (backup + tarball) - const spaceRequired = stats.size * 2; + // we calculate size of db x 2 (backup + tarball) + const spaceRequired = stats.size * 2; - const diskSpace = await checkDiskSpace(storagePath); - if (diskSpace.free < spaceRequired) - throw new TypeError( - `Needed ${bytes(spaceRequired)} but only ${bytes( - diskSpace.free - )} was available` - ); + const diskSpace = await checkDiskSpace(storagePath); + if (diskSpace.free < spaceRequired) + throw new TypeError( + `Needed ${bytes(spaceRequired)} but only ${bytes( + diskSpace.free + )} was available` + ); - // - // ensure that we have the space required available in memory - // (prevents multiple backups from taking up all of the memory on server) - try { - await pWaitFor( - () => { - return os.freemem() > spaceRequired; - }, - { - interval: ms('30s'), - timeout: ms('5m') + // + // ensure that we have the space required available in memory + // (prevents multiple backups from taking up all of the memory on server) + try { + await pWaitFor( + () => { + return os.freemem() > spaceRequired; + }, + { + interval: ms('30s'), + timeout: ms('5m') + } + ); + } catch (err) { + if (isRetryableError(err)) { + err.message = `Backup not complete due to OOM for ${payload.session.user.username}`; + err.isCodeBug = true; } - ); - } catch (err) { - if (isRetryableError(err)) { - err.message = `Backup not complete due to OOM for ${payload.session.user.username}`; - err.isCodeBug = true; - } - err.freemem = os.freemem(); - err.spaceRequired = spaceRequired; - err.payload = payload; - throw err; - } - - // create backup - const tmp = path.join( - path.dirname(storagePath), - `${payload.session.user.alias_id}-${payload.id}-backup.sqlite` - ); - - if (isCancelled) throw new ServerShutdownError(); + err.freemem = os.freemem(); + err.spaceRequired = spaceRequired; + err.payload = payload; + throw err; + } - // - // NOTE: we don't use `backup` command and instead use `VACUUM INTO` - // because if a page is modified during backup, it has to start over - // - // - // - // also, if we used `backup` then for a temporary period - // the database would be unencrypted on disk, and instead - // we use VACUUM INTO which keeps the encryption as-is - // - // - // const results = await db.backup(tmp); - // - // so instead we use the VACUUM INTO command with the `tmp` path - // - // TODO: this should not fix database - const db = await getDatabase( - instance, - // alias - { - id: payload.session.user.alias_id, - storage_location: payload.session.user.storage_location - }, - payload.session - ); + // create backup + tmp = path.join( + path.dirname(storagePath), + `${payload.session.user.alias_id}-${payload.id}-backup.sqlite` + ); - // run a checkpoint to copy over wal to db - db.pragma('wal_checkpoint(FULL)'); + if (isCancelled) throw new ServerShutdownError(); - // create backup - db.exec(`VACUUM INTO '${tmp}'`); + // + // NOTE: we don't use `backup` command and instead use `VACUUM INTO` + // because if a page is modified during backup, it has to start over + // + // + // + // also, if we used `backup` then for a temporary period + // the database would be unencrypted on disk, and instead + // we use VACUUM INTO which keeps the encryption as-is + // + // + // const results = await db.backup(tmp); + // + // so instead we use the VACUUM INTO command with the `tmp` path + // + // TODO: this should not fix database + const db = await getDatabase( + instance, + // alias + { + id: payload.session.user.alias_id, + storage_location: payload.session.user.storage_location + }, + payload.session + ); - await closeDatabase(db); + // run a checkpoint to copy over wal to db + db.pragma('wal_checkpoint(FULL)'); - if (isCancelled) throw new ServerShutdownError(); + // create backup + db.exec(`VACUUM INTO '${tmp}'`); - let backup = true; + await closeDatabase(db); - try { + if (isCancelled) throw new ServerShutdownError(); // open the backup and encrypt it const backupDb = await getDatabase( instance, @@ -259,7 +259,6 @@ async function rekey(payload) { if (journalModeResult !== 'delete') throw new TypeError('Journal mode could not be changed'); - // TODO: we need to remove VACUUM call here somehow // backupDb.prepare('VACUUM').run(); if (isCancelled) throw new ServerShutdownError(); @@ -274,7 +273,6 @@ async function rekey(payload) { // (the next time the database is opened the journal mode will get switched to WAL) // - // TODO: we need to remove VACUUM call here somehow // NOTE: VACUUM will persist the rekey operation and write to db // if (isCancelled) throw new ServerShutdownError(); @@ -321,7 +319,7 @@ async function rekey(payload) { } // always do cleanup in case of errors - if (backup) { + if (backup && tmp) { try { await fs.promises.rm(tmp, { force: true, @@ -332,7 +330,77 @@ async function rekey(payload) { } } - if (err) throw err; + try { + await client.del(`reset_check:${payload.session.user.alias_id}`); + } catch (err) { + await logger.fatal(err); + } + + try { + // unset `is_rekey` on the user + await Aliases.findOneAndUpdate( + { + _id: new mongoose.Types.ObjectId(payload.session.user.alias_id), + domain: new mongoose.Types.ObjectId(payload.session.user.domain_id) + }, + { + $set: { + is_rekey: false + } + } + ); + } catch (err) { + await logger.fatal(err); + } + + if (err) { + await email({ + template: 'alert', + message: { + to: payload.session.user.owner_full_email, + cc: config.email.message.from, + subject: i18n.translate( + 'ALIAS_REKEY_FAILED_SUBJECT', + payload.session.user.locale, + payload.session.user.username + ) + }, + locals: { + message: i18n.translate( + 'ALIAS_REKEY_FAILED_MESSAGE', + payload.session.user.locale, + payload.session.user.username, + err.message === 'Database empty' + ? err.message + : refineAndLogError(err, payload.session).message + ), + locale: payload.session.user.locale + } + }); + + throw err; + } + + // email the user + await email({ + template: 'alert', + message: { + to: payload.session.user.owner_full_email, + subject: i18n.translate( + 'ALIAS_REKEY_READY_SUBJECT', + payload.session.user.locale, + payload.session.user.username + ) + }, + locals: { + message: i18n.translate( + 'ALIAS_REKEY_READY', + payload.session.user.locale, + payload.session.user.username + ), + locale: payload.session.user.locale + } + }); } // eslint-disable-next-line complexity @@ -863,7 +931,7 @@ async function backup(payload) { try { await client.del(`backup_check:${payload.session.user.alias_id}`); } catch (err) { - logger.fatal(err); + await logger.fatal(err); } // if an error occurred then allow cache to attempt again diff --git a/locales/ar.json b/locales/ar.json index 391a29242d..650ee0fe36 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "الحد الأقصى لحصة التخزين لهذا الاسم المستعار. اتركه فارغًا لإعادة تعيين الحد الأقصى لحصة المجال الحالية أو أدخل قيمة مثل \"1 جيجابايت\" التي سيتم تحليلها بواسطة", ". This value can only be adjusted by domain admins.": "لا يمكن تعديل هذه القيمة إلا بواسطة مسؤولي المجال.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "تم حذف التقويم المسمى %s بنجاح مع %d حدث (مرفق نسخة احتياطية في حالة وقوع هذا الحادث)", - "domains": "domains" + "domains": "المجالات", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "لقد بدأت عملية تغيير كلمة المرور الخاصة بالاسم المستعار (إعادة المفتاح) لـ %s وسيتم إرسال بريد إلكتروني إليك عند الانتهاء.", + "Alias password change (rekey) for %s is complete": "تم الانتهاء من تغيير كلمة المرور (إعادة التشفير) للاسم %s", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "تم الآن الانتهاء من تغيير كلمة مرور الاسم المستعار (إعادة التشفير). يمكنك الآن تسجيل الدخول إلى خوادم IMAP وPOP3 وCalDAV باستخدام كلمة المرور الجديدة لـ %s .", + "Alias password change (rekey) for %s has failed due to an error": "فشلت عملية تغيير كلمة المرور المستعارة (إعادة التشفير) لـ %s بسبب خطأ", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

فشلت عملية تغيير كلمة المرور المستعارة (إعادة التشفير) لـ %s وتم تنبيهنا بذلك.

يمكنك إعادة المحاولة إذا لزم الأمر، وقد نرسل إليك بريدًا إلكترونيًا قريبًا لتقديم المساعدة إذا لزم الأمر.

الخطأ الذي تم تلقيه أثناء عملية إعادة المفتاح كان:

 %s
" } \ No newline at end of file diff --git a/locales/cs.json b/locales/cs.json index 91260a5202..319e3392ec 100644 --- a/locales/cs.json +++ b/locales/cs.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Maximální kvóta úložiště pro tento alias. Ponechte prázdné, chcete-li obnovit aktuální maximální kvótu domény, nebo zadejte hodnotu, například „1 GB“, podle které bude analyzován", ". This value can only be adjusted by domain admins.": ". Tuto hodnotu mohou upravit pouze správci domény.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Kalendář s názvem %s byl úspěšně smazán s %d událostmi (v příloze je záloha pro případ, že by to byla nehoda)", - "domains": "domains" + "domains": "domény", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Změna hesla (rekey) aliasu byla zahájena pro %s a po dokončení vám bude zaslán e-mail.", + "Alias password change (rekey) for %s is complete": "Změna hesla (rekey) aliasu pro %s je dokončena", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Změna hesla aliasu (rekey) je nyní dokončena. Nyní se můžete přihlásit k serverům IMAP, POP3 a CalDAV pomocí nového hesla pro %s .", + "Alias password change (rekey) for %s has failed due to an error": "Změna hesla (rekey) aliasu pro %s selhala kvůli chybě", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Změna hesla aliasu (rekey) pro %s se nezdařila a byli jsme upozorněni.

V případě potřeby to můžete zkusit znovu a brzy vám můžeme poslat e-mail, abychom vám v případě potřeby poskytli pomoc.

Chyba přijatá během procesu opětovného klíče byla:

 %s
" } \ No newline at end of file diff --git a/locales/da.json b/locales/da.json index 35a57ab90f..837dcd1022 100644 --- a/locales/da.json +++ b/locales/da.json @@ -7323,5 +7323,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Maksimal lagringskvote for dette alias. Lad stå tomt for at nulstille til domænets nuværende maksimale kvote, eller indtast en værdi såsom \"1 GB\", der vil blive parset af", ". This value can only be adjusted by domain admins.": ". Denne værdi kan kun justeres af domæneadministratorer.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Kalenderen med navnet %s blev slettet med %d begivenheder (vedhæftet er en sikkerhedskopi, hvis dette var et uheld)", - "domains": "domains" + "domains": "domæner", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Ændring af alias-adgangskode (gennøgle) er blevet startet for %s , og du vil blive sendt via e-mail, når den er færdig.", + "Alias password change (rekey) for %s is complete": "Ændring af aliasadgangskode (gennøgle) for %s er fuldført", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Ændring af aliasadgangskode (gennøgle) er nu fuldført. Du kan nu logge ind på IMAP-, POP3- og CalDAV-servere med den nye adgangskode til %s .", + "Alias password change (rekey) for %s has failed due to an error": "Ændring af aliasadgangskode (gennøgle) for %s mislykkedes på grund af en fejl", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Ændringen af aliasadgangskoden (gennøgle) for %s mislykkedes, og vi er blevet advaret.

Du kan fortsætte med at prøve igen, hvis det er nødvendigt, og vi kan snart sende dig en e-mail for at hjælpe dig, hvis det er nødvendigt.

Fejlen modtaget under gennøgleprocessen var:

 %s
" } \ No newline at end of file diff --git a/locales/de.json b/locales/de.json index 44358d37d0..6314e4ae1a 100644 --- a/locales/de.json +++ b/locales/de.json @@ -9374,5 +9374,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Maximales Speicherkontingent für diesen Alias. Lassen Sie das Feld leer, um das aktuelle maximale Kontingent der Domäne zurückzusetzen, oder geben Sie einen Wert wie „1 GB“ ein, der von", ". This value can only be adjusted by domain admins.": ". Dieser Wert kann nur von Domänenadministratoren angepasst werden.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Der Kalender mit dem Namen %s wurde mit %d Ereignissen erfolgreich gelöscht (anbei eine Sicherungskopie für den Fall, dass dies ein Versehen war)", - "domains": "domains" + "domains": "Domänen", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Die Änderung des Alias-Passworts (Neuverschlüsselung) wurde für %s gestartet. Sie erhalten nach Abschluss eine E-Mail.", + "Alias password change (rekey) for %s is complete": "Die Änderung des Alias-Passworts (Neuverschlüsselung) für %s ist abgeschlossen", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Die Änderung des Alias-Passworts (Neuverschlüsselung) ist nun abgeschlossen. Sie können sich jetzt mit dem neuen Passwort für %s bei IMAP-, POP3- und CalDAV-Servern anmelden.", + "Alias password change (rekey) for %s has failed due to an error": "Die Änderung des Alias-Passworts (Neuverschlüsselung) für %s ist aufgrund eines Fehlers fehlgeschlagen", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Die Änderung des Alias-Passworts (Neuverschlüsselung) für %s ist fehlgeschlagen und wir wurden benachrichtigt.

Sie können es bei Bedarf erneut versuchen. Wir werden Ihnen in Kürze möglicherweise eine E-Mail mit der Bitte um Hilfe schicken.

Der während des Rekey-Prozesses aufgetretene Fehler war:

 %s
" } \ No newline at end of file diff --git a/locales/en.json b/locales/en.json index 55b8b15399..b67545fffb 100644 --- a/locales/en.json +++ b/locales/en.json @@ -6726,5 +6726,11 @@ "plan": "plan", "group": "group", "Last Login": "Last Login", - "Log in as user": "Log in as user" + "Log in as user": "Log in as user", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Alias password change (rekey) has been started for %s and you will be emailed upon completion.", + "Payment due %s.": "Payment due %s.", + "Need to enable auto-renew?": "Need to enable auto-renew?", + "Alias password change (rekey) for %s is complete": "Alias password change (rekey) for %s is complete", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.", + "You cannot enter your current password and also attempt to override at the same time.": "You cannot enter your current password and also attempt to override at the same time." } \ No newline at end of file diff --git a/locales/es.json b/locales/es.json index 2915709b95..3d116d46f4 100644 --- a/locales/es.json +++ b/locales/es.json @@ -10333,5 +10333,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Cuota máxima de almacenamiento para este alias. Déjelo en blanco para restablecer la cuota máxima actual del dominio o ingrese un valor como \"1 GB\" que será analizado por", ". This value can only be adjusted by domain admins.": "Este valor sólo puede ser ajustado por los administradores del dominio.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "El calendario llamado %s se eliminó correctamente con %d eventos (se adjunta una copia de seguridad en caso de que esto haya sido un accidente)", - "domains": "domains" + "domains": "dominios", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Se ha iniciado el cambio de contraseña de alias (reinicio de clave) para %s y se le enviará un correo electrónico una vez completado.", + "Alias password change (rekey) for %s is complete": "El cambio de contraseña de alias (reinicio de clave) para %s se ha completado", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "El cambio de contraseña de alias (nueva clave) ya está completo. Ahora puede iniciar sesión en servidores IMAP, POP3 y CalDAV con la nueva contraseña para %s .", + "Alias password change (rekey) for %s has failed due to an error": "El cambio de contraseña de alias (reinicio de clave) para %s ha fallado debido a un error", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

El cambio de contraseña de alias (rekey) para %s ha fallado y hemos sido alertados.

Puede volver a intentarlo si es necesario y es posible que le enviemos un correo electrónico pronto para brindarle ayuda si es necesario.

El error recibido durante el proceso de reclave fue:

 %s
" } \ No newline at end of file diff --git a/locales/fi.json b/locales/fi.json index 31a1d52036..bfbd1e43f9 100644 --- a/locales/fi.json +++ b/locales/fi.json @@ -10182,5 +10182,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Tämän aliaksen tallennustilan enimmäiskiintiö. Jätä tyhjäksi palauttaaksesi verkkotunnuksen nykyisen enimmäiskiintiön tai anna arvo, kuten \"1 Gt\", jonka jäsentää", ". This value can only be adjusted by domain admins.": ". Vain verkkotunnuksen järjestelmänvalvojat voivat säätää tätä arvoa.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Kalenteri nimeltä %s poistettiin onnistuneesti %d tapahtumalla (liitteenä varmuuskopio siltä varalta, että kyseessä oli onnettomuus)", - "domains": "domains" + "domains": "verkkotunnuksia", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Alias-salasanan vaihto (uudelleenavain) on aloitettu käyttäjälle %s , ja sinulle lähetetään sähköposti, kun se on valmis.", + "Alias password change (rekey) for %s is complete": "Alias-salasanan vaihto (uudelleenavain) kohteelle %s on valmis", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Alias-salasanan vaihto (uudelleenavain) on nyt valmis. Voit nyt kirjautua sisään IMAP-, POP3- ja CalDAV-palvelimiin uudella salasanalla %s .", + "Alias password change (rekey) for %s has failed due to an error": "Alias-salasanan vaihto (uudelleenavain) kohteelle %s epäonnistui virheen vuoksi", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Alias-salasanan vaihto (uudelleenavain) kohteelle %s epäonnistui ja olemme saaneet hälytyksen.

Voit yrittää tarvittaessa uudelleen, ja voimme lähettää sinulle pian sähköpostitse apua tarvittaessa.

Uudelleenavaimen aikana saatu virhe oli:

 %s
" } \ No newline at end of file diff --git a/locales/fr.json b/locales/fr.json index 8ac4e2e25a..134e2db30a 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -7860,5 +7860,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Quota de stockage maximal pour cet alias. Laissez ce champ vide pour réinitialiser le quota maximal actuel du domaine ou saisissez une valeur telle que « 1 Go » qui sera analysée par", ". This value can only be adjusted by domain admins.": "Cette valeur ne peut être ajustée que par les administrateurs de domaine.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Le calendrier nommé %s a été supprimé avec succès avec %d événements (une sauvegarde est jointe au cas où il s'agirait d'un accident)", - "domains": "domains" + "domains": "domaines", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Le changement de mot de passe d'alias (recléage) a commencé pour %s et vous recevrez un e-mail une fois terminé.", + "Alias password change (rekey) for %s is complete": "Le changement de mot de passe d'alias (renouvellement de clé) pour %s est terminé", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Le changement de mot de passe d'alias (renouvellement de clé) est désormais terminé. Vous pouvez désormais vous connecter aux serveurs IMAP, POP3 et CalDAV avec le nouveau mot de passe pour %s .", + "Alias password change (rekey) for %s has failed due to an error": "Le changement de mot de passe d'alias (renouvellement de clé) pour %s a échoué en raison d'une erreur", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Le changement de mot de passe d'alias (rekey) pour %s a échoué et nous avons été alertés.

Vous pouvez réessayer si nécessaire, et nous pourrons vous envoyer un e-mail prochainement pour vous fournir de l'aide si nécessaire.

L'erreur reçue lors du processus de changement de clé était :

 %s
" } \ No newline at end of file diff --git a/locales/he.json b/locales/he.json index 11d662c046..105102a498 100644 --- a/locales/he.json +++ b/locales/he.json @@ -8356,5 +8356,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "מכסת אחסון מקסימלית עבור הכינוי הזה. השאר ריק כדי לאפס למכסה המקסימלית הנוכחית של הדומיין או הזן ערך כגון \"1 GB\" שינתח על ידי", ". This value can only be adjusted by domain admins.": ". ערך זה יכול להיות מותאם רק על ידי מנהלי דומיין.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "לוח שנה בשם %s נמחק בהצלחה עם %d אירועים (מצורף גיבוי למקרה שזו הייתה תאונה)", - "domains": "domains" + "domains": "דומיינים", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "החלפת סיסמה כינוי (מפתח מחדש) עבור %s ותישלח אליך בדוא"ל בסיום.", + "Alias password change (rekey) for %s is complete": "שינוי סיסמת הכינוי (מפתח מחדש) עבור %s הושלם", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "שינוי סיסמת הכינוי (מפתח מחדש) הושלם כעת. כעת תוכל להיכנס לשרתי IMAP, POP3 ו-CalDAV עם הסיסמה החדשה עבור %s .", + "Alias password change (rekey) for %s has failed due to an error": "שינוי סיסמה כינוי (מפתח מחדש) עבור %s נכשל עקב שגיאה", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

שינוי הסיסמה הכינוי (מפתח מחדש) עבור %s נכשל וקיבלנו התראה.

תוכל להמשיך ולנסות שוב במידת הצורך, ואנו עשויים לשלוח לך דוא"ל בקרוב כדי לספק עזרה במידת הצורך.

השגיאה שהתקבלה במהלך תהליך המפתח מחדש הייתה:

 %s
" } \ No newline at end of file diff --git a/locales/hu.json b/locales/hu.json index 4828a3fe62..afdb42eb19 100644 --- a/locales/hu.json +++ b/locales/hu.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Maximális tárhelykvóta ehhez az aliashoz. Hagyja üresen a domain jelenlegi maximális kvótájának visszaállításához, vagy adjon meg egy értéket, például \"1 GB\", amelyet a rendszer elemezni fog", ". This value can only be adjusted by domain admins.": ". Ezt az értéket csak a domain rendszergazdái módosíthatják.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "A %s nevű naptár sikeresen törölve %d eseménnyel (mellékelve egy biztonsági másolat arra az esetre, ha baleset történt volna)", - "domains": "domains" + "domains": "domainek", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "A %s alias jelszavának megváltoztatása (újrakulcs) elindult, és a befejezés után e-mailben értesítjük.", + "Alias password change (rekey) for %s is complete": "A(z %s alias jelszava megváltoztatása (újrakulcsolás) befejeződött", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Az alias jelszó módosítása (újrakulcsolás) befejeződött. Mostantól bejelentkezhet az IMAP-, POP3- és CalDAV-kiszolgálókra a %s új jelszavával.", + "Alias password change (rekey) for %s has failed due to an error": "A(z %s alias jelszavának megváltoztatása (újrakulcsolása) hiba miatt meghiúsult", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

A(z %s alias jelszómódosítása (újrakulcs) meghiúsult, és figyelmeztetést kaptunk.

Ha szükséges, próbálkozhat újra, és hamarosan e-mailt küldhetünk Önnek, hogy szükség esetén segítséget nyújthassunk.

Az újrakulcsolási folyamat során kapott hiba a következő volt:

 %s
" } \ No newline at end of file diff --git a/locales/id.json b/locales/id.json index 2d150950e5..ae3acdfbeb 100644 --- a/locales/id.json +++ b/locales/id.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Kuota penyimpanan maksimum untuk alias ini. Kosongkan untuk mengatur ulang ke kuota maksimum domain saat ini atau masukkan nilai seperti \"1 GB\" yang akan diurai oleh", ". This value can only be adjusted by domain admins.": "Nilai ini hanya dapat disesuaikan oleh admin domain.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Kalender dengan nama %s berhasil dihapus dengan %d acara (terlampir adalah cadangan jika ini merupakan suatu kecelakaan)", - "domains": "domains" + "domains": "domain", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Perubahan kata sandi alias (rekey) telah dimulai untuk %s dan Anda akan dikirimi email setelah selesai.", + "Alias password change (rekey) for %s is complete": "Perubahan kata sandi alias (rekey) untuk %s telah selesai", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Perubahan kata sandi alias (penggantian kunci) kini telah selesai. Anda kini dapat masuk ke server IMAP, POP3, dan CalDAV dengan kata sandi baru untuk %s .", + "Alias password change (rekey) for %s has failed due to an error": "Perubahan kata sandi alias (rekey) untuk %s gagal karena kesalahan", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Perubahan kata sandi alias (rekey) untuk %s telah gagal dan kami telah diberitahu.

Anda dapat mencoba lagi jika perlu, dan kami akan segera mengirimi Anda email untuk memberikan bantuan jika perlu.

Kesalahan yang diterima selama proses penggantian kunci adalah:

 %s
" } \ No newline at end of file diff --git a/locales/it.json b/locales/it.json index 416301ff5a..7411cf9809 100644 --- a/locales/it.json +++ b/locales/it.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Quota massima di archiviazione per questo alias. Lascia vuoto per reimpostare la quota massima corrente del dominio o inserisci un valore come \"1 GB\" che verrà analizzato da", ". This value can only be adjusted by domain admins.": "Questo valore può essere modificato solo dagli amministratori di dominio.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Il calendario denominato %s è stato eliminato con successo con %d eventi (in allegato un backup nel caso in cui si sia verificato un incidente)", - "domains": "domains" + "domains": "domini", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "È stata avviata la modifica della password dell'alias (rekey) per %s Riceverai un'e-mail al termine dell'operazione.", + "Alias password change (rekey) for %s is complete": "La modifica della password dell'alias (rekey) per %s è completa", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "La modifica della password dell'alias (rekey) è ora completa. Ora puoi accedere ai server IMAP, POP3 e CalDAV con la nuova password per %s .", + "Alias password change (rekey) for %s has failed due to an error": "La modifica della password dell'alias (rekey) per %s non è riuscita a causa di un errore", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

La modifica della password dell'alias (rekey) per %s non è riuscita e siamo stati avvisati.

Se necessario, puoi riprovare e presto potremmo inviarti un'e-mail per fornirti assistenza, se necessario.

L'errore ricevuto durante il processo di reimpostazione della chiave è stato:

 %s
" } \ No newline at end of file diff --git a/locales/ja.json b/locales/ja.json index 0104dc7bcc..bfeb4bbd49 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "このエイリアスのストレージの最大クォータ。空白のままにしておくとドメインの現在の最大クォータにリセットされます。または、「1 GB」などの値を入力すると、", ". This value can only be adjusted by domain admins.": "この値はドメイン管理者のみが調整できます。", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "%sという名前のカレンダーが%d件のイベントとともに正常に削除されました (誤って削除された場合に備えてバックアップを添付しています)", - "domains": "domains" + "domains": "ドメイン", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "%sのエイリアス パスワードの変更 (キー再生成) が開始されました。完了すると電子メールが送信されます。", + "Alias password change (rekey) for %s is complete": "%sのエイリアス パスワードの変更 (キーの再生成) が完了しました", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "エイリアス パスワードの変更 (キー更新) が完了しました。これで、 %sの新しいパスワードを使用して IMAP、POP3、および CalDAV サーバーにログインできます。", + "Alias password change (rekey) for %s has failed due to an error": "エラーのため、 %sのエイリアス パスワードの変更 (キー再生成) に失敗しました", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

%sエイリアス パスワードの変更 (キー再生成) が失敗したため、警告が出されました。

必要に応じて再試行してください。また、必要に応じてサポートを提供するためにすぐにメールを送信する場合があります。

キー再生成プロセス中に受信したエラーは次のとおりです:

 %s
" } \ No newline at end of file diff --git a/locales/ko.json b/locales/ko.json index b9d7d5d24d..86cb711d5e 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "이 별칭에 대한 최대 저장 할당량입니다. 도메인의 현재 최대 할당량으로 재설정하려면 비워두거나 \"1GB\"와 같이 구문 분석될 값을 입력하세요.", ". This value can only be adjusted by domain admins.": "이 값은 도메인 관리자만 조정할 수 있습니다.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "%s 라는 이름의 달력이 %d 이벤트와 함께 성공적으로 삭제되었습니다(실수로 그런 일이 발생한 경우를 대비해 백업을 첨부했습니다)", - "domains": "domains" + "domains": "도메인", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "%s 에 대한 별칭 비밀번호 변경(재입력)이 시작되었으며 완료되면 이메일로 전송해 드리겠습니다.", + "Alias password change (rekey) for %s is complete": "%s 에 대한 별칭 비밀번호 변경(재키)이 완료되었습니다.", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "별칭 비밀번호 변경(rekey)이 이제 완료되었습니다. 이제 %s 에 대한 새 비밀번호로 IMAP, POP3 및 CalDAV 서버에 로그인할 수 있습니다.", + "Alias password change (rekey) for %s has failed due to an error": "%s 에 대한 별칭 암호 변경(재키)이 오류로 인해 실패했습니다.", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

%s 에 대한 별칭 비밀번호 변경(재키)이 실패하였으며 알림을 받았습니다.

필요하다면 다시 시도해 보실 수 있으며, 필요한 경우 곧 이메일을 보내 도움을 드리겠습니다.

재키 프로세스 중에 발생한 오류는 다음과 같습니다.

 %s
" } \ No newline at end of file diff --git a/locales/nl.json b/locales/nl.json index cb8e287d18..bc152626e5 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Opslagmaximumquotum voor deze alias. Laat leeg om te resetten naar het huidige maximumquotum van het domein of voer een waarde in zoals \"1 GB\" die wordt geparseerd door", ". This value can only be adjusted by domain admins.": "Deze waarde kan alleen door domeinbeheerders worden aangepast.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Agenda met de naam %s is succesvol verwijderd met %d gebeurtenissen (bijgevoegd is een backup voor het geval dit per ongeluk was)", - "domains": "domains" + "domains": "domeinen", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Het wijzigen van het aliaswachtwoord (nieuwe sleutel) is gestart voor %s . U ontvangt een e-mail zodra dit is voltooid.", + "Alias password change (rekey) for %s is complete": "Aliaswachtwoordwijziging (rekey) voor %s is voltooid", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Alias wachtwoordwijziging (rekey) is nu voltooid. U kunt nu inloggen op IMAP-, POP3- en CalDAV-servers met het nieuwe wachtwoord voor %s .", + "Alias password change (rekey) for %s has failed due to an error": "Aliaswachtwoordwijziging (rekey) voor %s is mislukt vanwege een fout", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Het wijzigen van het aliaswachtwoord (nieuwe sleutel) voor %s is mislukt en we zijn gewaarschuwd.

Indien nodig kunt u het opnieuw proberen. Mogelijk sturen we u binnenkort een e-mail met hulp.

De fout die werd ontvangen tijdens het opnieuw coderen was:

 %s
" } \ No newline at end of file diff --git a/locales/no.json b/locales/no.json index f5e1e48f89..d6103737be 100644 --- a/locales/no.json +++ b/locales/no.json @@ -10340,5 +10340,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Maksimal lagringskvote for dette aliaset. La stå tomt for å tilbakestille til domenets gjeldende maksimale kvote eller angi en verdi som \"1 GB\" som vil bli analysert av", ". This value can only be adjusted by domain admins.": ". Denne verdien kan bare justeres av domeneadministratorer.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Kalenderen med navnet %s ble slettet med %d hendelser (vedlagt er en sikkerhetskopi i tilfelle dette var en ulykke)", - "domains": "domains" + "domains": "domener", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Alias-passordendring (omnøkkel) er startet for %s , og du vil bli sendt på e-post når du er ferdig.", + "Alias password change (rekey) for %s is complete": "Aliaspassordendring (omnøkkel) for %s er fullført", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Endring av aliaspassord (omnøkkel) er nå fullført. Du kan nå logge på IMAP-, POP3- og CalDAV-servere med det nye passordet for %s .", + "Alias password change (rekey) for %s has failed due to an error": "Aliaspassordendring (omnøkkel) for %s mislyktes på grunn av en feil", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Aliaspassordendring (omnøkkel) for %s har mislyktes, og vi har blitt varslet.

Du kan fortsette å prøve på nytt om nødvendig, og vi kan snart sende deg en e-post for å gi deg hjelp om nødvendig.

Feilen mottatt under omnøkkelprosessen var:

 %s
" } \ No newline at end of file diff --git a/locales/pl.json b/locales/pl.json index bfc1a361e0..197aac633d 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Maksymalny limit pamięci dla tego aliasu. Pozostaw puste, aby zresetować do bieżącego maksymalnego limitu domeny lub wprowadź wartość, taką jak „1 GB”, która zostanie przeanalizowana przez", ". This value can only be adjusted by domain admins.": "Wartość tę mogą zmienić tylko administratorzy domeny.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Kalendarz o nazwie %s został pomyślnie usunięty z %d wydarzeniami (w załączeniu kopia zapasowa na wypadek gdyby to był przypadek)", - "domains": "domains" + "domains": "domeny", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Rozpoczęto zmianę hasła aliasu (ponowne wprowadzenie hasła) dla %s . Po zakończeniu operacji otrzymasz wiadomość e-mail.", + "Alias password change (rekey) for %s is complete": "Zmiana hasła aliasu (ponowne wprowadzenie) dla %s została zakończona", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Zmiana hasła aliasu (ponowne wpisanie) została ukończona. Teraz możesz zalogować się do serwerów IMAP, POP3 i CalDAV za pomocą nowego hasła dla %s .", + "Alias password change (rekey) for %s has failed due to an error": "Zmiana hasła aliasu (ponowne wprowadzenie) dla %s nie powiodła się z powodu błędu", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Zmiana hasła aliasu (ponowne wprowadzenie) dla %s nie powiodła się i zostaliśmy o tym powiadomieni.

W razie konieczności możesz spróbować ponownie. Wkrótce wyślemy do Ciebie wiadomość e-mail z prośbą o pomoc, jeśli okaże się to konieczne.

Podczas procesu ponownego wprowadzania kodu wystąpił następujący błąd:

 %s
" } \ No newline at end of file diff --git a/locales/pt.json b/locales/pt.json index 6e68e62f3e..0e09295aed 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Cota máxima de armazenamento para este alias. Deixe em branco para redefinir a cota máxima atual do domínio ou insira um valor como \"1 GB\" que será analisado por", ". This value can only be adjusted by domain admins.": ". Este valor só pode ser ajustado por administradores de domínio.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "O calendário chamado %s foi excluído com sucesso com %d eventos (em anexo está um backup caso isso tenha sido um acidente)", - "domains": "domains" + "domains": "domínios", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "A alteração da senha do alias (rekey) foi iniciada para %s e você receberá um e-mail após a conclusão.", + "Alias password change (rekey) for %s is complete": "A alteração da senha do alias (rekey) para %s foi concluída", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "A alteração da senha do alias (rekey) agora está completa. Agora você pode fazer login nos servidores IMAP, POP3 e CalDAV com a nova senha para %s .", + "Alias password change (rekey) for %s has failed due to an error": "A alteração da senha do alias (rekey) para %s falhou devido a um erro", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

A alteração da senha do alias (rekey) para %s falhou e fomos alertados.

Você pode tentar novamente, se necessário, e poderemos lhe enviar um e-mail em breve para fornecer ajuda, se necessário.

O erro recebido durante o processo de rekey foi:

 %s
" } \ No newline at end of file diff --git a/locales/ru.json b/locales/ru.json index 4f0938598c..f29f6bba0c 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Максимальная квота хранилища для этого псевдонима. Оставьте пустым, чтобы сбросить текущую максимальную квоту домена или введите значение, например \"1 ГБ\", которое будет проанализировано", ". This value can only be adjusted by domain admins.": ". Это значение может быть изменено только администраторами домена.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Календарь с именем %s был успешно удален с %d событиями (прилагается резервная копия на случай, если это произошло случайно)", - "domains": "domains" + "domains": "домены", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Изменение пароля псевдонима (перезапись) начато для %s , и вы получите уведомление по электронной почте после его завершения.", + "Alias password change (rekey) for %s is complete": "Изменение пароля псевдонима (переключение) для %s завершено", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Изменение пароля псевдонима (rekey) завершено. Теперь вы можете войти на серверы IMAP, POP3 и CalDAV с новым паролем для %s .", + "Alias password change (rekey) for %s has failed due to an error": "Изменение пароля псевдонима (перезапись) для %s не удалось из-за ошибки", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Смена пароля псевдонима (повторный ввод) для %s не удалась, и мы были оповещены.

При необходимости вы можете повторить попытку, и мы вскоре отправим вам электронное письмо с просьбой оказать помощь.

Ошибка, полученная в процессе перекодировки, была следующей:

 %s
" } \ No newline at end of file diff --git a/locales/sv.json b/locales/sv.json index e4bf2ec8be..57c5198154 100644 --- a/locales/sv.json +++ b/locales/sv.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Maximal lagringskvot för detta alias. Lämna tomt för att återställa till domänens nuvarande maximala kvot eller ange ett värde som \"1 GB\" som kommer att tolkas av", ". This value can only be adjusted by domain admins.": ". Detta värde kan endast justeras av domänadministratörer.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Kalendern med namnet %s har raderats med %d händelser (bifogad är en säkerhetskopia om detta var en olycka)", - "domains": "domains" + "domains": "domäner", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Alias lösenordsändring (omnyckel) har påbörjats för %s och du kommer att få ett e-postmeddelande när det är klart.", + "Alias password change (rekey) for %s is complete": "Ändring av aliaslösenord (omnyckel) för %s är klar", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Ändring av aliaslösenord (omnyckel) är nu klar. Du kan nu logga in på IMAP-, POP3- och CalDAV-servrar med det nya lösenordet för %s .", + "Alias password change (rekey) for %s has failed due to an error": "Ändring av aliaslösenord (omnyckel) för %s misslyckades på grund av ett fel", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Ändring av aliaslösenord (omnyckel) för %s har misslyckats och vi har blivit varnade.

Du kan fortsätta att försöka igen om det behövs, och vi kan snart skicka ett e-postmeddelande för att ge dig hjälp om det behövs.

Felet som mottogs under omnyckelprocessen var:

 %s
" } \ No newline at end of file diff --git a/locales/th.json b/locales/th.json index 5ea1e3c83b..71cc15d889 100644 --- a/locales/th.json +++ b/locales/th.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "โควตาพื้นที่เก็บข้อมูลสูงสุดสำหรับนามแฝงนี้ ปล่อยว่างไว้เพื่อรีเซ็ตเป็นโควตาสูงสุดปัจจุบันของโดเมนหรือป้อนค่าเช่น \"1 GB\" ที่จะถูกวิเคราะห์โดย", ". This value can only be adjusted by domain admins.": "ค่านี้สามารถปรับได้โดยผู้ดูแลโดเมนเท่านั้น", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "ปฏิทินชื่อ %s ถูกลบสำเร็จแล้วโดยมี %d กิจกรรม (แนบเป็นข้อมูลสำรองในกรณีที่เป็นอุบัติเหตุ)", - "domains": "domains" + "domains": "โดเมน", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "การเปลี่ยนรหัสผ่านนามแฝง (rekey) ได้เริ่มต้นขึ้นสำหรับ %s และคุณจะได้รับอีเมลเมื่อดำเนินการเสร็จเรียบร้อย", + "Alias password change (rekey) for %s is complete": "การเปลี่ยนรหัสผ่านนามแฝง (rekey) สำหรับ %s เสร็จสมบูรณ์แล้ว", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "การเปลี่ยนรหัสผ่านนามแฝง (rekey) เสร็จสมบูรณ์แล้ว คุณสามารถเข้าสู่ระบบเซิร์ฟเวอร์ IMAP, POP3 และ CalDAV ด้วยรหัสผ่านใหม่สำหรับ %s ได้", + "Alias password change (rekey) for %s has failed due to an error": "การเปลี่ยนรหัสผ่านนามแฝง (rekey) สำหรับ %s ล้มเหลวเนื่องจากข้อผิดพลาด", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

การเปลี่ยนรหัสผ่านนามแฝง (rekey) สำหรับ %s ล้มเหลว และเราได้รับการแจ้งเตือนแล้ว

คุณสามารถดำเนินการลองใหม่อีกครั้งหากจำเป็น และเราอาจส่งอีเมลถึงคุณเร็วๆ นี้เพื่อให้ความช่วยเหลือหากจำเป็น

ข้อผิดพลาดที่ได้รับระหว่างกระบวนการรีเซ็ตคีย์คือ:

 %s
" } \ No newline at end of file diff --git a/locales/tr.json b/locales/tr.json index 59c6d20e96..c1b63e5874 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Bu takma ad için depolama maksimum kotası. Alan geçerli maksimum kotasına sıfırlamak için boş bırakın veya ayrıştırılacak \"1 GB\" gibi bir değer girin", ". This value can only be adjusted by domain admins.": "Bu değer yalnızca alan adı yöneticileri tarafından ayarlanabilir.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "%s adlı takvim %d etkinlikle başarıyla silindi (bu bir kaza olması durumunda yedek ekte)", - "domains": "domains" + "domains": "etki alanları", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "%s için takma ad parolası değişikliği (yeniden anahtarlama) başlatıldı ve tamamlandığında size e-posta gönderilecektir.", + "Alias password change (rekey) for %s is complete": "%s için takma ad parolası değişikliği (yeniden anahtarlama) tamamlandı", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Takma ad parolası değişikliği (yeniden anahtarlama) artık tamamlandı. Artık %s için yeni parolayla IMAP, POP3 ve CalDAV sunucularına giriş yapabilirsiniz.", + "Alias password change (rekey) for %s has failed due to an error": "%s için takma ad parolası değişikliği (yeniden anahtarlama) bir hata nedeniyle başarısız oldu", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

%s için takma ad parolası değişikliği (yeniden anahtarlama) başarısız oldu ve uyarıldık.

Gerekirse tekrar deneyebilirsiniz ve gerekirse size yardımcı olmak için yakında e-posta gönderebiliriz.

Yeniden anahtarlama işlemi sırasında alınan hata şuydu:

 %s
" } \ No newline at end of file diff --git a/locales/uk.json b/locales/uk.json index 27ad8b7f7f..08129eac73 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -10335,5 +10335,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Максимальна квота пам’яті для цього псевдоніма. Залиште поле порожнім, щоб скинути поточну максимальну квоту домену, або введіть значення, як-от \"1 ГБ\", яке буде проаналізовано", ". This value can only be adjusted by domain admins.": ". Це значення можуть змінити лише адміністратори домену.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Календар під назвою %s було успішно видалено з %d подіями (додається резервна копія на випадок, якщо це сталося випадково)", - "domains": "domains" + "domains": "домени", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Розпочато зміну пароля псевдоніма (переключити) для %s , після завершення ви отримаєте електронний лист.", + "Alias password change (rekey) for %s is complete": "Зміна пароля псевдоніма (повторний ключ) для %s завершено", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Зміну пароля псевдоніма (повторний ключ) завершено. Тепер ви можете входити на сервери IMAP, POP3 і CalDAV за допомогою нового пароля для %s .", + "Alias password change (rekey) for %s has failed due to an error": "Не вдалося змінити пароль псевдоніма (переключити) для %s через помилку", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Не вдалося змінити пароль псевдоніма (повторний ключ) для %s і ми отримали сповіщення.

Ви можете продовжити повторну спробу, якщо це необхідно, і ми можемо незабаром надіслати вам електронний лист, щоб надати допомогу, якщо це необхідно.

Помилка, отримана під час процесу повторного введення:

 %s
" } \ No newline at end of file diff --git a/locales/vi.json b/locales/vi.json index 87f160b1a2..0a84a0113d 100644 --- a/locales/vi.json +++ b/locales/vi.json @@ -7865,5 +7865,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "Hạn ngạch lưu trữ tối đa cho bí danh này. Để trống để đặt lại hạn ngạch tối đa hiện tại của miền hoặc nhập giá trị như \"1 GB\" sẽ được phân tích cú pháp bởi", ". This value can only be adjusted by domain admins.": ". Giá trị này chỉ có thể được điều chỉnh bởi người quản trị miền.", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "Lịch có tên %s đã được xóa thành công với %d sự kiện (đính kèm bản sao lưu trong trường hợp đây là sự cố)", - "domains": "domains" + "domains": "miền", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "Việc thay đổi mật khẩu bí danh (đổi khóa) đã được bắt đầu cho %s và bạn sẽ nhận được email sau khi hoàn tất.", + "Alias password change (rekey) for %s is complete": "Đã hoàn tất việc thay đổi mật khẩu bí danh (khóa lại) cho %s", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "Việc thay đổi mật khẩu bí danh (rekey) hiện đã hoàn tất. Bây giờ bạn có thể đăng nhập vào máy chủ IMAP, POP3 và CalDAV bằng mật khẩu mới cho %s .", + "Alias password change (rekey) for %s has failed due to an error": "Thay đổi mật khẩu bí danh (khóa lại) cho %s đã không thành công do lỗi", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

Việc thay đổi mật khẩu bí danh (đổi khóa) cho %s đã không thành công và chúng tôi đã được cảnh báo.

Bạn có thể thử lại nếu cần và chúng tôi có thể sớm gửi email cho bạn để hỗ trợ nếu cần.

Lỗi nhận được trong quá trình cấp lại khóa là:

 %s
" } \ No newline at end of file diff --git a/locales/zh.json b/locales/zh.json index 0ffe46f093..e46d01a6cc 100644 --- a/locales/zh.json +++ b/locales/zh.json @@ -10028,5 +10028,10 @@ "Storage maximum quota for this alias. Leave blank to reset to domain current maximum quota or enter a value such as \"1 GB\" that will be parsed by": "此别名的最大存储配额。留空可重置为域当前的最大配额,或输入一个值(例如“1 GB”),该值将由", ". This value can only be adjusted by domain admins.": "。此值只能由域管理员调整。", "Calendar named %s was successfully deleted with %d events (attached is a backup in case this was an accident)": "名为%s的日历已成功删除,其中包含%d事件(附件为备份,以防发生意外)", - "domains": "domains" + "domains": "域", + "Alias password change (rekey) has been started for %s and you will be emailed upon completion.": "%s的别名密码更改(重新密钥)已开始,完成后您将收到电子邮件。", + "Alias password change (rekey) for %s is complete": "%s的别名密码更改(重新密钥)已完成", + "Alias password change (rekey) is now complete. You can now log in to IMAP, POP3, and CalDAV servers with the new password for %s.": "别名密码更改(重新密钥)现已完成。您现在可以使用%s的新密码登录 IMAP、POP3 和 CalDAV 服务器。", + "Alias password change (rekey) for %s has failed due to an error": "由于错误, %s的别名密码更改(重新密钥)失败", + "

The alias password change (rekey) for %s has failed and we have been alerted.

You may proceed to retry if necessary, and we may email you soon to provide help if necessary.

The error received during the rekey process was:

%s
": "

%s的别名密码更改(重新密钥)已失败,我们已收到警报。

如有必要,您可以继续重试,我们也可能会很快给您发送电子邮件以提供帮助。

重新密钥过程中收到的错误是:

 %s
" } \ No newline at end of file