From e96dc5445f6faa5beac7c1f0b17c0fa1b4734583 Mon Sep 17 00:00:00 2001 From: "Misha M.-Kupriyanov" Date: Mon, 27 Apr 2026 15:57:46 +0200 Subject: [PATCH 1/6] IONOS(test): test(aliases): enhance alias creation tests with strict types Added strict types to the AliasesServiceTest to improve type safety. Updated test cases to ensure that account IDs are treated as strings to prevent type-related issues during alias creation. Signed-off-by: Misha M.-Kupriyanov --- tests/Unit/Service/AliasesServiceTest.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Service/AliasesServiceTest.php b/tests/Unit/Service/AliasesServiceTest.php index fa550a3e05..7bf6d32b21 100644 --- a/tests/Unit/Service/AliasesServiceTest.php +++ b/tests/Unit/Service/AliasesServiceTest.php @@ -1,5 +1,7 @@ service->create( - 300, + '300', $entity->getAccountId(), $entity->getAlias(), $entity->getName() @@ -116,7 +118,7 @@ public function testCreateForbiddenAccountId(): void { ->willThrowException(new DoesNotExistException('Account does not exist')); $this->service->create( - 300, + '300', $entity->getAccountId(), $entity->getAlias(), $entity->getName() @@ -189,6 +191,6 @@ public function testUpateSignatureInvalidAliasId(): void { $this->aliasMapper->expects(self::never()) ->method('update'); - $this->service->updateSignature($this->user, '999999', 'Kind regards
Herbert'); + $this->service->updateSignature($this->user, 999999, 'Kind regards
Herbert'); } } From bb6dfbe32f52aa0dbd79bcbb4c2412bf3c7e1872 Mon Sep 17 00:00:00 2001 From: "Misha M.-Kupriyanov" Date: Mon, 27 Apr 2026 10:43:15 +0200 Subject: [PATCH 2/6] IONOS(refactor): refactor(service): simplify constructor property declarations Refactor the AliasesService constructor to use promoted properties for AliasMapper and MailAccountMapper, improving code readability and maintainability. Also, update the AliasesServiceTest to reflect the changes in the service class, ensuring proper type hinting for mock objects. Signed-off-by: Misha M.-Kupriyanov --- lib/Service/AliasesService.php | 13 ++++--------- tests/Unit/Service/AliasesServiceTest.php | 16 +++++----------- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/lib/Service/AliasesService.php b/lib/Service/AliasesService.php index 62f4538fd6..4370578af9 100644 --- a/lib/Service/AliasesService.php +++ b/lib/Service/AliasesService.php @@ -17,15 +17,10 @@ use OCP\AppFramework\Db\DoesNotExistException; class AliasesService { - /** @var AliasMapper */ - private $aliasMapper; - - /** @var MailAccountMapper */ - private $mailAccountMapper; - - public function __construct(AliasMapper $aliasMapper, MailAccountMapper $mailAccountMapper) { - $this->aliasMapper = $aliasMapper; - $this->mailAccountMapper = $mailAccountMapper; + public function __construct( + private readonly AliasMapper $aliasMapper, + private readonly MailAccountMapper $mailAccountMapper, + ) { } /** diff --git a/tests/Unit/Service/AliasesServiceTest.php b/tests/Unit/Service/AliasesServiceTest.php index 7bf6d32b21..9ad21cb630 100644 --- a/tests/Unit/Service/AliasesServiceTest.php +++ b/tests/Unit/Service/AliasesServiceTest.php @@ -16,19 +16,13 @@ use OCA\Mail\Exception\ClientException; use OCA\Mail\Service\AliasesService; use OCP\AppFramework\Db\DoesNotExistException; +use PHPUnit\Framework\MockObject\MockObject; class AliasesServiceTest extends TestCase { - /** @var AliasesService */ - private $service; - - /** @var string */ - private $user = 'herbert'; - - /** @var AliasMapper */ - private $aliasMapper; - - /** @var MailAccountMapper */ - private $mailAccountMapper; + private AliasesService $service; + private string $user = 'herbert'; + private AliasMapper&MockObject $aliasMapper; + private MailAccountMapper&MockObject $mailAccountMapper; protected function setUp(): void { parent::setUp(); From 41219b37e008061a3288f7e119c72d151ae16e65 Mon Sep 17 00:00:00 2001 From: "Misha M.-Kupriyanov" Date: Mon, 27 Apr 2026 10:50:01 +0200 Subject: [PATCH 3/6] IONOS(refactor): refactor(test): streamline mock object creation in AliasesControllerTest Refactor the AliasesControllerTest to simplify the creation of mock objects. This change enhances readability and maintainability of the test code by using the createMock method directly, reducing boilerplate code. Signed-off-by: Misha M.-Kupriyanov --- .../Unit/Controller/AliasesControllerTest.php | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/tests/Unit/Controller/AliasesControllerTest.php b/tests/Unit/Controller/AliasesControllerTest.php index 51e36e7933..15b286fcfd 100644 --- a/tests/Unit/Controller/AliasesControllerTest.php +++ b/tests/Unit/Controller/AliasesControllerTest.php @@ -18,31 +18,23 @@ use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; +use OCP\IRequest; +use PHPUnit\Framework\MockObject\MockObject; class AliasesControllerTest extends TestCase { - private $controller; - private $appName = 'mail'; - private $request; - private $userId = 'user12345'; - private $alias; - - /** @var AliasMapper */ - private $aliasMapper; - - /** @var MailAccountMapper */ - private $mailAccountMapper; - - /** @var AliasesService */ - private $aliasService; + private AliasesController $controller; + private string $appName = 'mail'; + private IRequest&MockObject $request; + private string $userId = 'user12345'; + private Alias&MockObject $alias; + private AliasMapper&MockObject $aliasMapper; + private MailAccountMapper&MockObject $mailAccountMapper; + private AliasesService $aliasService; public function setUp(): void { parent::setUp(); - $this->request = $this->getMockBuilder('OCP\IRequest') - ->getMock(); - - $this->alias = $this->getMockBuilder(\OCA\Mail\Db\Alias::class) - ->disableOriginalConstructor() - ->getMock(); + $this->request = $this->createMock(IRequest::class); + $this->alias = $this->createMock(Alias::class); $this->aliasMapper = $this->createMock(AliasMapper::class); $this->mailAccountMapper = $this->createMock(MailAccountMapper::class); From 1117d58706e0701d1f8c24922048086de76d41c6 Mon Sep 17 00:00:00 2001 From: Matthias Sauer Date: Tue, 7 Apr 2026 13:18:56 +0200 Subject: [PATCH 4/6] IONOS(aliases): feat(aliases): add admin setting to disable alias creation Introduces an `allow_new_mail_aliases` app config flag (default: yes) that lets administrators prevent users from creating new mail aliases. - Backend: guard in AliasesService::create() throws ClientException when disabled - Admin UI: toggle switch in AdminSettings, mirroring the existing "allow new mail accounts" setting - Frontend: hides the "Add alias" button when disabled - Exposed via PageController initial state and storable via occ config:app:set Extends existing unit tests for AliasesService, AdminSettings, and PageController to cover the new setting. AI-assisted: Claude Sonnet 4.6 Co-Authored-By: Kai Henseler Signed-off-by: Matthias Sauer --- appinfo/routes.php | 5 ++++ lib/Controller/PageController.php | 5 ++++ lib/Controller/SettingsController.php | 5 ++++ lib/Service/AliasesService.php | 10 ++++++-- lib/Settings/AdminSettings.php | 6 +++++ src/components/AccountSettings.vue | 8 ++++++- src/components/AliasSettings.vue | 6 ++++- src/components/settings/AdminSettings.vue | 21 +++++++++++++++++ src/init.js | 4 ++++ src/service/SettingsService.js | 8 +++++++ .../Unit/Controller/AliasesControllerTest.php | 9 +++++++- tests/Unit/Controller/PageControllerTest.php | 7 ++++-- tests/Unit/Service/AliasesServiceTest.php | 23 ++++++++++++++++++- tests/Unit/Settings/AdminSettingsTest.php | 7 +++++- 14 files changed, 115 insertions(+), 9 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index a17b3652ca..a3a7e7ccfc 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -380,6 +380,11 @@ 'url' => '/api/settings/allownewaccounts', 'verb' => 'POST' ], + [ + 'name' => 'settings#setAllowNewMailAliases', + 'url' => '/api/settings/allownewaliases', + 'verb' => 'POST' + ], [ 'name' => 'settings#setEnabledLlmProcessing', 'url' => '/api/settings/llm', diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index 948266db00..b13ecf87a4 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -295,6 +295,11 @@ public function index(): TemplateResponse { $this->config->getAppValue('mail', 'allow_new_mail_accounts', 'yes') === 'yes' ); + $this->initialStateService->provideInitialState( + 'allow-new-aliases', + $this->config->getAppValue('mail', 'allow_new_mail_aliases', 'yes') === 'yes' + ); + $this->initialStateService->provideInitialState( 'llm_summaries_available', $this->aiIntegrationsService->isLlmProcessingEnabled() && $this->aiIntegrationsService->isLlmAvailable(SummaryTaskType::class) diff --git a/lib/Controller/SettingsController.php b/lib/Controller/SettingsController.php index a5fe4bac4b..79e30c9e5e 100644 --- a/lib/Controller/SettingsController.php +++ b/lib/Controller/SettingsController.php @@ -114,6 +114,11 @@ public function setAllowNewMailAccounts(bool $allowed) { $this->config->setAppValue('mail', 'allow_new_mail_accounts', $allowed ? 'yes' : 'no'); } + public function setAllowNewMailAliases(bool $allowed): JSONResponse { + $this->config->setAppValue('mail', 'allow_new_mail_aliases', $allowed ? 'yes' : 'no'); + return new JSONResponse([]); + } + public function setEnabledLlmProcessing(bool $enabled): JSONResponse { $this->config->setAppValue('mail', 'llm_processing', $enabled ? 'yes' : 'no'); return new JSONResponse([]); diff --git a/lib/Service/AliasesService.php b/lib/Service/AliasesService.php index 4370578af9..e0fd9d2b0e 100644 --- a/lib/Service/AliasesService.php +++ b/lib/Service/AliasesService.php @@ -15,11 +15,13 @@ use OCA\Mail\Db\MailAccountMapper; use OCA\Mail\Exception\ClientException; use OCP\AppFramework\Db\DoesNotExistException; +use OCP\IConfig; class AliasesService { public function __construct( - private readonly AliasMapper $aliasMapper, - private readonly MailAccountMapper $mailAccountMapper, + private AliasMapper $aliasMapper, + private MailAccountMapper $mailAccountMapper, + private IConfig $config, ) { } @@ -62,6 +64,10 @@ public function findByAliasAndUserId(string $aliasEmail, string $userId): Alias * @throws DoesNotExistException */ public function create(string $userId, int $accountId, string $alias, string $aliasName): Alias { + if ($this->config->getAppValue('mail', 'allow_new_mail_aliases', 'yes') === 'no') { + throw new ClientException('Creating aliases has been disabled by the administrator.'); + } + $this->mailAccountMapper->find($userId, $accountId); $aliasEntity = new Alias(); diff --git a/lib/Settings/AdminSettings.php b/lib/Settings/AdminSettings.php index cdb2aae2d1..4e3469f143 100644 --- a/lib/Settings/AdminSettings.php +++ b/lib/Settings/AdminSettings.php @@ -85,6 +85,12 @@ public function getForm() { $this->config->getAppValue('mail', 'allow_new_mail_accounts', 'yes') === 'yes' ); + $this->initialStateService->provideInitialState( + Application::APP_ID, + 'allow_new_mail_aliases', + $this->config->getAppValue('mail', 'allow_new_mail_aliases', 'yes') === 'yes' + ); + $this->initialStateService->provideInitialState( Application::APP_ID, 'layout_message_view', diff --git a/src/components/AccountSettings.vue b/src/components/AccountSettings.vue index 2175332a30..dac9764ac9 100644 --- a/src/components/AccountSettings.vue +++ b/src/components/AccountSettings.vue @@ -15,7 +15,8 @@ :name="t('mail', 'IMAP access / password')"> - @@ -176,6 +177,11 @@ export default { email() { return this.account.emailAddress }, + allowNewAliases() { + const hasAliases = this.account?.aliases?.length > 0 + const allowNewAliases = this.mainStore.getPreference('allow-new-aliases', true) + return allowNewAliases || hasAliases + }, showProviderAppPassword() { // Show the password reset section if: // 1. Account is managed by a provider (managedByProvider is set) diff --git a/src/components/AliasSettings.vue b/src/components/AliasSettings.vue index c740c2eaec..4b88ee19d6 100644 --- a/src/components/AliasSettings.vue +++ b/src/components/AliasSettings.vue @@ -28,6 +28,7 @@
  • @@ -47,7 +48,7 @@
    - @@ -114,6 +115,9 @@ export default { aliases() { return this.account.aliases }, + allowNewAliases() { + return this.mainStore.getPreference('allow-new-aliases', true) + }, accountAlias() { return { alias: this.account.emailAddress, diff --git a/src/components/settings/AdminSettings.vue b/src/components/settings/AdminSettings.vue index bfd88096fa..f3c902478e 100644 --- a/src/components/settings/AdminSettings.vue +++ b/src/components/settings/AdminSettings.vue @@ -130,6 +130,22 @@

    +
    +

    {{ t('mail', 'Allow aliases') }}

    +
    +

    + {{ t('mail', 'The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail.') }} +

    + +

    + + {{ t('mail', 'Allow users to create mail aliases') }} + +

    +
    +

    {{ t('mail', 'Enable text processing through LLMs') }}

    @@ -288,6 +304,7 @@ import { updateProvisioningSettings, provisionAll, updateAllowNewMailAccounts, + updateAllowNewMailAliases, updateLlmEnabled, updateEnabledSmartReply, setImportanceClassificationEnabledByDefault, @@ -352,6 +369,7 @@ export default { loading: false, }, allowNewMailAccounts: loadState('mail', 'allow_new_mail_accounts', true), + allowNewMailAliases: loadState('mail', 'allow_new_mail_aliases', true), isLlmSummaryConfigured: loadState('mail', 'enabled_llm_summary_backend'), isLlmEnabled: loadState('mail', 'llm_processing', true), isLlmFreePromptConfigured: loadState('mail', 'enabled_llm_free_prompt_backend'), @@ -411,6 +429,9 @@ export default { async updateAllowNewMailAccounts(checked) { await updateAllowNewMailAccounts(checked) }, + async updateAllowNewMailAliases(checked) { + await updateAllowNewMailAliases(checked) + }, async updateLlmEnabled(checked) { await updateLlmEnabled(checked) }, diff --git a/src/init.js b/src/init.js index a9a851251e..4304863e49 100644 --- a/src/init.js +++ b/src/init.js @@ -66,6 +66,10 @@ export default function initAfterAppCreation() { key: 'allow-new-accounts', value: loadState('mail', 'allow-new-accounts', true), }) + mainStore.savePreferenceMutation({ + key: 'allow-new-aliases', + value: loadState('mail', 'allow-new-aliases', true), + }) mainStore.savePreferenceMutation({ key: 'password-is-unavailable', value: loadState('mail', 'password-is-unavailable', false), diff --git a/src/service/SettingsService.js b/src/service/SettingsService.js index eafefd342b..4d2d5d0b10 100644 --- a/src/service/SettingsService.js +++ b/src/service/SettingsService.js @@ -61,6 +61,14 @@ export const updateAllowNewMailAccounts = (allowed) => { return axios.post(url, data).then((resp) => resp.data) } +export const updateAllowNewMailAliases = (allowed) => { + const url = generateUrl('/apps/mail/api/settings/allownewaliases') + const data = { + allowed, + } + return axios.post(url, data).then((resp) => resp.data) +} + export const updateLlmEnabled = async (enabled) => { const url = generateUrl('/apps/mail/api/settings/llm') const data = { diff --git a/tests/Unit/Controller/AliasesControllerTest.php b/tests/Unit/Controller/AliasesControllerTest.php index 15b286fcfd..137548b84a 100644 --- a/tests/Unit/Controller/AliasesControllerTest.php +++ b/tests/Unit/Controller/AliasesControllerTest.php @@ -18,6 +18,8 @@ use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; +use OCP\IConfig; +use OCP\IL10N; use OCP\IRequest; use PHPUnit\Framework\MockObject\MockObject; @@ -38,8 +40,13 @@ public function setUp(): void { $this->aliasMapper = $this->createMock(AliasMapper::class); $this->mailAccountMapper = $this->createMock(MailAccountMapper::class); + $config = $this->createMock(IConfig::class); + $config->method('getAppValue') + ->with('mail', 'allow_new_mail_aliases', 'yes') + ->willReturn('yes'); + $l10n = $this->createMock(IL10N::class); - $this->aliasService = new AliasesService($this->aliasMapper, $this->mailAccountMapper); + $this->aliasService = new AliasesService($this->aliasMapper, $this->mailAccountMapper, $config, $l10n); $this->controller = new AliasesController($this->appName, $this->request, $this->aliasService, $this->userId); } diff --git a/tests/Unit/Controller/PageControllerTest.php b/tests/Unit/Controller/PageControllerTest.php index 71b7d2b5e8..2801561834 100644 --- a/tests/Unit/Controller/PageControllerTest.php +++ b/tests/Unit/Controller/PageControllerTest.php @@ -285,7 +285,7 @@ public function testIndex(): void { ['version', '0.0.0', '26.0.0'], ['app.mail.attachment-size-limit', 0, 123], ]); - $this->config->expects($this->exactly(7)) + $this->config->expects($this->exactly(8)) ->method('getAppValue') ->withConsecutive( [ 'mail', 'installed_version' ], @@ -295,6 +295,7 @@ public function testIndex(): void { ['mail', 'microsoft_oauth_tenant_id' ], ['core', 'backgroundjobs_mode', 'ajax' ], ['mail', 'allow_new_mail_accounts', 'yes'], + ['mail', 'allow_new_mail_aliases', 'yes'], )->willReturnOnConsecutiveCalls( $this->returnValue('1.2.3'), $this->returnValue('threaded'), @@ -303,6 +304,7 @@ public function testIndex(): void { $this->returnValue(''), $this->returnValue('cron'), $this->returnValue('yes'), + $this->returnValue('yes'), ); $this->accountProviderService->expects($this->once()) ->method('getAvailableProvidersForUser') @@ -340,7 +342,7 @@ public function testIndex(): void { ->method('findAll') ->with($this->userId) ->willReturn([]); - $this->initialState->expects($this->exactly(24)) + $this->initialState->expects($this->exactly(25)) ->method('provideInitialState') ->withConsecutive( ['debug', true], @@ -374,6 +376,7 @@ public function testIndex(): void { ['disable-scheduled-send', false], ['disable-snooze', false], ['allow-new-accounts', true], + ['allow-new-aliases', true], ['llm_summaries_available', false], ['llm_translation_enabled', false], ['llm_freeprompt_available', false], diff --git a/tests/Unit/Service/AliasesServiceTest.php b/tests/Unit/Service/AliasesServiceTest.php index 9ad21cb630..cb2aa36e0e 100644 --- a/tests/Unit/Service/AliasesServiceTest.php +++ b/tests/Unit/Service/AliasesServiceTest.php @@ -16,6 +16,7 @@ use OCA\Mail\Exception\ClientException; use OCA\Mail\Service\AliasesService; use OCP\AppFramework\Db\DoesNotExistException; +use OCP\IConfig; use PHPUnit\Framework\MockObject\MockObject; class AliasesServiceTest extends TestCase { @@ -23,16 +24,19 @@ class AliasesServiceTest extends TestCase { private string $user = 'herbert'; private AliasMapper&MockObject $aliasMapper; private MailAccountMapper&MockObject $mailAccountMapper; + private IConfig&MockObject $config; protected function setUp(): void { parent::setUp(); $this->aliasMapper = $this->createMock(AliasMapper::class); $this->mailAccountMapper = $this->createMock(MailAccountMapper::class); + $this->config = $this->createMock(IConfig::class); $this->service = new AliasesService( $this->aliasMapper, - $this->mailAccountMapper + $this->mailAccountMapper, + $this->config, ); } @@ -119,6 +123,23 @@ public function testCreateForbiddenAccountId(): void { ); } + public function testCreateDisabledByAdmin(): void { + $this->expectException(ClientException::class); + $this->expectExceptionMessage('Creating aliases has been disabled by the administrator.'); + + $this->config->expects(self::once()) + ->method('getAppValue') + ->with('mail', 'allow_new_mail_aliases', 'yes') + ->willReturn('no'); + + $this->mailAccountMapper->expects(self::never()) + ->method('find'); + $this->aliasMapper->expects(self::never()) + ->method('insert'); + + $this->service->create('300', 200, 'jane@doe.com', 'Jane Doe'); + } + public function testDelete(): void { $entity = new Alias(); $entity->setId(101); diff --git a/tests/Unit/Settings/AdminSettingsTest.php b/tests/Unit/Settings/AdminSettingsTest.php index ccd1800f76..67cfe0ae4a 100644 --- a/tests/Unit/Settings/AdminSettingsTest.php +++ b/tests/Unit/Settings/AdminSettingsTest.php @@ -37,7 +37,7 @@ public function testGetSection() { } public function testGetForm() { - $this->serviceMock->getParameter('initialStateService')->expects($this->exactly(14)) + $this->serviceMock->getParameter('initialStateService')->expects($this->exactly(15)) ->method('provideInitialState') ->withConsecutive( [ @@ -55,6 +55,11 @@ public function testGetForm() { 'allow_new_mail_accounts', $this->anything() ], + [ + Application::APP_ID, + 'allow_new_mail_aliases', + $this->anything() + ], [ Application::APP_ID, 'layout_message_view', From 664fff3382b9b8e145e4cf19b012f8a7f3687a9c Mon Sep 17 00:00:00 2001 From: Kai Henseler Date: Thu, 16 Apr 2026 13:37:10 +0200 Subject: [PATCH 5/6] IONOS(aliases): chore(l10n): add translations Signed-off-by: Kai Henseler --- l10n/de_DE.js | 6 ++++++ l10n/de_DE.json | 6 ++++++ l10n/es.js | 6 ++++++ l10n/es.json | 6 ++++++ l10n/fr.js | 8 +++++++- l10n/fr.json | 8 +++++++- l10n/it.js | 6 ++++++ l10n/it.json | 6 ++++++ l10n/nl.js | 6 ++++++ l10n/nl.json | 6 ++++++ l10n/sv.js | 6 ++++++ l10n/sv.json | 6 ++++++ lib/Service/AliasesService.php | 4 +++- tests/Unit/Service/AliasesServiceTest.php | 10 ++++++++++ 14 files changed, 87 insertions(+), 3 deletions(-) diff --git a/l10n/de_DE.js b/l10n/de_DE.js index eae2cc719d..5217fe2115 100644 --- a/l10n/de_DE.js +++ b/l10n/de_DE.js @@ -3,6 +3,8 @@ OC.L10N.register( { "pluralForm" : "nplurals=2; plural=(n != 1);", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} Anhang\"\n- \"{count} Anhänge\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} Postfach …\"\n- \"{count} Postfächer …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} Postfach\"\n- \"{count} Postfächer\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} Nachricht\"\n- \"{total} Nachrichten\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} ungelesene von {total}\"\n- \"{unread} ungelesene von {total}\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- |-\n %n neue Nachricht\n von {from}\n- |-\n %n neue Nachrichten\n von {from}\n", @@ -86,7 +88,9 @@ OC.L10N.register( "All messages in mailbox will be deleted." : "Alle Nachrichten in der Mailbox werden gelöscht.", "Allow additional mail accounts" : "Zusätzliche E-Mail-Konten zulassen", "Allow additional Mail accounts from User Settings" : "Zusätzliche E-Mail-Konten in den Benutzereinstellungen zulassen", + "Allow aliases" : "Aliase zulassen", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Erlauben Sie der App, Daten über Ihre Interaktionen zu sammeln. Basierend auf diesen Daten passt sich die App an Ihre Vorlieben an. Die Daten werden nur lokal gespeichert.", + "Allow users to create mail aliases" : "Benutzern das Erstellen von E-Mail-Aliasen ermöglichen", "Always show images from {domain}" : "Bilder von {domain} immer anzeigen", "Always show images from {sender}" : "Bilder von {sender} immer anzeigen", "An error occurred, unable to create the tag." : "Es ist ein Fehler aufgetreten, das Schlagwort kann nicht erstellt werden.", @@ -228,6 +232,7 @@ OC.L10N.register( "Create mail filter" : "Mail-Filter erstellen", "Create task" : "Aufgabe erstellen", "Creating account..." : "Konto wird erstellt...", + "Creating aliases has been disabled by the administrator." : "Das Erstellen von Aliasen wurde vom Administrator deaktiviert.", "Custom" : "Benutzerdefiniert", "Custom date and time" : "Benutzerspezifisches Datum und Zeit", "Data collection consent" : "Zustimmung zur Datenerhebung", @@ -801,6 +806,7 @@ OC.L10N.register( "The mail app allows users to read mails on their IMAP accounts." : "Die Mail-App ermöglicht Benutzern, E-Mails von ihren IMAP-Konten zu lesen.", "The Mail app can classify incoming emails by importance using machine learning. This feature is enabled by default but can be disabled by default here. Individual users will still be able to toggle the feature for their accounts." : "Die Mail-App kann eingehende E-Mails mithilfe maschinellem Lernens nach Wichtigkeit klassifizieren. Diese Funktion ist standardmäßig aktiviert, kann hier jedoch standardmäßig deaktiviert werden. Benutzer können die Funktion für ihre Konten aktivieren und deaktivieren.", "The Mail app can process user data with the help of the configured large language model and provide assistance features like thread summaries, smart replies and event agendas." : "Die Mail-App kann mithilfe des konfigurierten großen Sprachmodells Benutzerdaten verarbeiten und Hilfsfunktionen wie Zusammenfassungen von Unterhaltungen, intelligente Antworten und Ereignisübersichten bereitstellen.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "Die Mail-App überprüft keine Aliase. Wenn diese Funktion aktiviert ist, ohne dass eine entsprechende serverseitige Unterstützung vorhanden ist, wird Ihr Mailserver ausgehende Nachrichten wahrscheinlich ablehnen, was dazu führt, dass E-Mails nicht zugestellt werden können.", "The message could not be translated" : "Die Nachricht konnte nicht übersetzt werden", "The original message will be attached as a \"message/rfc822\" attachment." : "Die Originalnachricht wird als \"message/rfc822\"-Anhang angehängt.", "The private key is only required if you intend to send signed and encrypted emails using this certificate." : "Der private Schlüssel wird nur benötigt, wenn Sie beabsichtigen, signierte und verschlüsselte E-Mails mit diesem Zertifikat zu versenden.", diff --git a/l10n/de_DE.json b/l10n/de_DE.json index 4035695648..918c7fdfa9 100644 --- a/l10n/de_DE.json +++ b/l10n/de_DE.json @@ -1,6 +1,8 @@ { "translations": { "pluralForm" : "nplurals=2; plural=(n != 1);", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} Anhang\"\n- \"{count} Anhänge\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} Postfach …\"\n- \"{count} Postfächer …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} Postfach\"\n- \"{count} Postfächer\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} Nachricht\"\n- \"{total} Nachrichten\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} ungelesene von {total}\"\n- \"{unread} ungelesene von {total}\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- |-\n %n neue Nachricht\n von {from}\n- |-\n %n neue Nachrichten\n von {from}\n", @@ -84,7 +86,9 @@ "All messages in mailbox will be deleted." : "Alle Nachrichten in der Mailbox werden gelöscht.", "Allow additional mail accounts" : "Zusätzliche E-Mail-Konten zulassen", "Allow additional Mail accounts from User Settings" : "Zusätzliche E-Mail-Konten in den Benutzereinstellungen zulassen", + "Allow aliases" : "Aliase zulassen", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Erlauben Sie der App, Daten über Ihre Interaktionen zu sammeln. Basierend auf diesen Daten passt sich die App an Ihre Vorlieben an. Die Daten werden nur lokal gespeichert.", + "Allow users to create mail aliases" : "Benutzern das Erstellen von E-Mail-Aliasen ermöglichen", "Always show images from {domain}" : "Bilder von {domain} immer anzeigen", "Always show images from {sender}" : "Bilder von {sender} immer anzeigen", "An error occurred, unable to create the tag." : "Es ist ein Fehler aufgetreten, das Schlagwort kann nicht erstellt werden.", @@ -226,6 +230,7 @@ "Create mail filter" : "Mail-Filter erstellen", "Create task" : "Aufgabe erstellen", "Creating account..." : "Konto wird erstellt...", + "Creating aliases has been disabled by the administrator." : "Das Erstellen von Aliasen wurde vom Administrator deaktiviert.", "Custom" : "Benutzerdefiniert", "Custom date and time" : "Benutzerspezifisches Datum und Zeit", "Data collection consent" : "Zustimmung zur Datenerhebung", @@ -799,6 +804,7 @@ "The mail app allows users to read mails on their IMAP accounts." : "Die Mail-App ermöglicht Benutzern, E-Mails von ihren IMAP-Konten zu lesen.", "The Mail app can classify incoming emails by importance using machine learning. This feature is enabled by default but can be disabled by default here. Individual users will still be able to toggle the feature for their accounts." : "Die Mail-App kann eingehende E-Mails mithilfe maschinellem Lernens nach Wichtigkeit klassifizieren. Diese Funktion ist standardmäßig aktiviert, kann hier jedoch standardmäßig deaktiviert werden. Benutzer können die Funktion für ihre Konten aktivieren und deaktivieren.", "The Mail app can process user data with the help of the configured large language model and provide assistance features like thread summaries, smart replies and event agendas." : "Die Mail-App kann mithilfe des konfigurierten großen Sprachmodells Benutzerdaten verarbeiten und Hilfsfunktionen wie Zusammenfassungen von Unterhaltungen, intelligente Antworten und Ereignisübersichten bereitstellen.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "Die Mail-App überprüft keine Aliase. Wenn diese Funktion aktiviert ist, ohne dass eine entsprechende serverseitige Unterstützung vorhanden ist, wird Ihr Mailserver ausgehende Nachrichten wahrscheinlich ablehnen, was dazu führt, dass E-Mails nicht zugestellt werden können.", "The message could not be translated" : "Die Nachricht konnte nicht übersetzt werden", "The original message will be attached as a \"message/rfc822\" attachment." : "Die Originalnachricht wird als \"message/rfc822\"-Anhang angehängt.", "The private key is only required if you intend to send signed and encrypted emails using this certificate." : "Der private Schlüssel wird nur benötigt, wenn Sie beabsichtigen, signierte und verschlüsselte E-Mails mit diesem Zertifikat zu versenden.", diff --git a/l10n/es.js b/l10n/es.js index 50be6361c6..5dd548e2a3 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -3,6 +3,8 @@ OC.L10N.register( { "pluralForm" : "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} adjunto\"\n- \"{count} adjuntos\"\n- \"{count} adjuntos\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} buzón …\"\n- \"{count} buzones …\"\n- \"{count} buzones …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} buzón\"\n- \"{count} buzones\"\n- \"{count} buzones\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} mensaje\"\n- \"{total} mensajes\"\n- \"{total} mensajes\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} no leído de {total}\"\n- \"{unread} no leídos de {total}\"\n- \"{unread} no leídos de {total}\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- \"%n mensaje nuevo \\nde {from}\"\n- |-\n %n mensajes nuevos\n de {from}\n- |-\n %n mensajes nuevos\n de {from}\n", @@ -86,7 +88,9 @@ OC.L10N.register( "All messages in mailbox will be deleted." : "Todos los mensajes en este buzón se eliminarán.", "Allow additional mail accounts" : "Permitir cuentas de correo adicionales", "Allow additional Mail accounts from User Settings" : "Permitir cuentas de correo adicionales desde las configuraciones de usuario", + "Allow aliases" : "Allow aliases", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Permitir a la app recolectar datos sobre sus interacciones. Basándose en estos datos, la app se adaptará mejor a sus preferencias. Estos datos sólo se almacenan localmente.", + "Allow users to create mail aliases" : "Permitir a los usuarios crear alias de correo electrónico", "Always show images from {domain}" : "Mostrar siempre las imágenes de {domain}", "Always show images from {sender}" : "Mostrar siempre las imágenes de {sender}", "An error occurred, unable to create the tag." : "Ocurrió un error, no fue posible crear la etiqueta.", @@ -227,6 +231,7 @@ OC.L10N.register( "Create mail filter" : "Crear filtro de correo", "Create task" : "Crear una tarea", "Creating account..." : "Creando cuenta...", + "Creating aliases has been disabled by the administrator." : "El administrador ha desactivado la creación de alias.", "Custom" : "Personalizado", "Custom date and time" : "Hora y fecha personalizadas", "Data collection consent" : "Consentimiento para recolección de datos", @@ -800,6 +805,7 @@ OC.L10N.register( "The mail app allows users to read mails on their IMAP accounts." : "La aplicación de correo electrónico permite a los usuarios leer mails de sus cuentas IMAP.", "The Mail app can classify incoming emails by importance using machine learning. This feature is enabled by default but can be disabled by default here. Individual users will still be able to toggle the feature for their accounts." : "La aplicación de Correo puede clasificar los correos entrantes por importancia utilizando machine learning. Esta característica está habilitada de manera predeterminada pero puede deshabilitarse aquí. Los usuarios tendrán la posibilidad de habilitarla de manera individual en sus cuentas.", "The Mail app can process user data with the help of the configured large language model and provide assistance features like thread summaries, smart replies and event agendas." : "La app de Correo puede procesar los datos del usuario con la ayuda del modelo de lenguaje largo configurado y proveer características de asistencia como sumarios de hilos, respuestas inteligentes y agendas para eventos.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "La aplicación Mail no verifica los alias. Si se activa esta opción sin que exista compatibilidad por parte del servidor, es probable que tu servidor de correo rechace los mensajes salientes, lo que provocará que los correos electrónicos no se envíen correctamente.", "The message could not be translated" : "El mensaje no pudo ser traducido", "The original message will be attached as a \"message/rfc822\" attachment." : "El mensaje original se adjuntará como un archivo adjunto \"message/rfc822\"", "The private key is only required if you intend to send signed and encrypted emails using this certificate." : "La llave privada solo se requiere si tiene pensado enviar correo electrónico firmado y cifrado utilizando la misma.", diff --git a/l10n/es.json b/l10n/es.json index d129d459f6..6612cc3c1d 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -1,6 +1,8 @@ { "translations": { "pluralForm" : "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} adjunto\"\n- \"{count} adjuntos\"\n- \"{count} adjuntos\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} buzón …\"\n- \"{count} buzones …\"\n- \"{count} buzones …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} buzón\"\n- \"{count} buzones\"\n- \"{count} buzones\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} mensaje\"\n- \"{total} mensajes\"\n- \"{total} mensajes\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} no leído de {total}\"\n- \"{unread} no leídos de {total}\"\n- \"{unread} no leídos de {total}\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- \"%n mensaje nuevo \\nde {from}\"\n- |-\n %n mensajes nuevos\n de {from}\n- |-\n %n mensajes nuevos\n de {from}\n", @@ -84,7 +86,9 @@ "All messages in mailbox will be deleted." : "Todos los mensajes en este buzón se eliminarán.", "Allow additional mail accounts" : "Permitir cuentas de correo adicionales", "Allow additional Mail accounts from User Settings" : "Permitir cuentas de correo adicionales desde las configuraciones de usuario", + "Allow aliases" : "Allow aliases", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Permitir a la app recolectar datos sobre sus interacciones. Basándose en estos datos, la app se adaptará mejor a sus preferencias. Estos datos sólo se almacenan localmente.", + "Allow users to create mail aliases" : "Permitir a los usuarios crear alias de correo electrónico", "Always show images from {domain}" : "Mostrar siempre las imágenes de {domain}", "Always show images from {sender}" : "Mostrar siempre las imágenes de {sender}", "An error occurred, unable to create the tag." : "Ocurrió un error, no fue posible crear la etiqueta.", @@ -225,6 +229,7 @@ "Create mail filter" : "Crear filtro de correo", "Create task" : "Crear una tarea", "Creating account..." : "Creando cuenta...", + "Creating aliases has been disabled by the administrator." : "El administrador ha desactivado la creación de alias.", "Custom" : "Personalizado", "Custom date and time" : "Hora y fecha personalizadas", "Data collection consent" : "Consentimiento para recolección de datos", @@ -798,6 +803,7 @@ "The mail app allows users to read mails on their IMAP accounts." : "La aplicación de correo electrónico permite a los usuarios leer mails de sus cuentas IMAP.", "The Mail app can classify incoming emails by importance using machine learning. This feature is enabled by default but can be disabled by default here. Individual users will still be able to toggle the feature for their accounts." : "La aplicación de Correo puede clasificar los correos entrantes por importancia utilizando machine learning. Esta característica está habilitada de manera predeterminada pero puede deshabilitarse aquí. Los usuarios tendrán la posibilidad de habilitarla de manera individual en sus cuentas.", "The Mail app can process user data with the help of the configured large language model and provide assistance features like thread summaries, smart replies and event agendas." : "La app de Correo puede procesar los datos del usuario con la ayuda del modelo de lenguaje largo configurado y proveer características de asistencia como sumarios de hilos, respuestas inteligentes y agendas para eventos.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "La aplicación Mail no verifica los alias. Si se activa esta opción sin que exista compatibilidad por parte del servidor, es probable que tu servidor de correo rechace los mensajes salientes, lo que provocará que los correos electrónicos no se envíen correctamente.", "The message could not be translated" : "El mensaje no pudo ser traducido", "The original message will be attached as a \"message/rfc822\" attachment." : "El mensaje original se adjuntará como un archivo adjunto \"message/rfc822\"", "The private key is only required if you intend to send signed and encrypted emails using this certificate." : "La llave privada solo se requiere si tiene pensado enviar correo electrónico firmado y cifrado utilizando la misma.", diff --git a/l10n/fr.js b/l10n/fr.js index 46be563d2b..859453103d 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -3,6 +3,8 @@ OC.L10N.register( { "pluralForm" : "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} pièce jointe\"\n- \"{count} pièces jointes\"\n- \"{count} pièces jointes\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} boîte mail …\"\n- \"{count} boîtes mail …\"\n- \"{count} boîtes mail …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} boîte mail\"\n- \"{count} boîtes mail\"\n- \"{count} boîtes mail\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} message\"\n- \"{total} messages\"\n- \"{total} messages\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} non lu sur {total}\"\n- \"{unread} non lus sur {total}\"\n- \"{unread} non lus sur {total}\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- |-\n %n nouveau message\n de {from}\n- |-\n %n nouveaux messages\n de {from}\n- |-\n %n nouveaux messages\n de {from}\n", @@ -30,7 +32,7 @@ OC.L10N.register( "{attendeeName} tentatively accepted your invitation" : "{attendeeName} a accepté provisoirement votre invitation", "{commonName} - Valid until {expiryDate}" : "{commonName} - Valide jusqu'au {expiryDate}", "_{count} mailbox_::_{count} mailboxes_" : ["{count} boîte mail","{count} boîtes mail","{count} boîtes mail"], - "_{count} mailbox …_::_{count} mailboxes …_" : ["{count} boîte mail …","{count} boîtes mail …","{count} boîtes mail …"], + "_{count} mailbox …_::_{count} mailboxes …_" : ["{count} boîte mail …","\n{count} boîtes mail …","{count} boîte mail …"], "{from}\n{subject}" : "{from}\n{subject}", "{markup-start}Draft:{markup-end} {subject}" : "{markup-start}Brouillon : {markup-end} {subject}", "{name} Assistant" : "{name} Assistant", @@ -86,7 +88,9 @@ OC.L10N.register( "All messages in mailbox will be deleted." : "Tous les messages du dossier seront supprimés.", "Allow additional mail accounts" : "Autoriser des comptes de messagerie supplémentaires", "Allow additional Mail accounts from User Settings" : "Autoriser des comptes de messagerie supplémentaires à partir des paramètres de l'utilisateur", + "Allow aliases" : "Autoriser les alias", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Autoriser l'application à collecter des données sur vos interactions. À partir de ces données, l'application s'adaptera à vos préférences. Les données seront uniquement stockées localement.", + "Allow users to create mail aliases" : "Permettre aux utilisateurs de créer des alias de messagerie", "Always show images from {domain}" : "Toujours afficher les images de {domain}", "Always show images from {sender}" : "Toujours afficher les images de {sender}", "An error occurred, unable to create the tag." : "Une erreur est survenue, impossible de créer l'étiquette.", @@ -229,6 +233,7 @@ OC.L10N.register( "Create mail filter" : "Créer un filtre d'email", "Create task" : "Créer une tâche", "Creating account..." : "Création du compte...", + "Creating aliases has been disabled by the administrator." : "L'administrateur a désactivé la création d'alias.", "Custom" : "Personnalisé", "Custom date and time" : "Date et heure personnalisées", "Data collection consent" : "Consentement à la récolte de données", @@ -803,6 +808,7 @@ OC.L10N.register( "The mail app allows users to read mails on their IMAP accounts." : "L'application de messagerie permet aux utilisateurs de lire leurs e-mails depuis leurs comptes IMAP.", "The Mail app can classify incoming emails by importance using machine learning. This feature is enabled by default but can be disabled by default here. Individual users will still be able to toggle the feature for their accounts." : "L’application Mail peut classifier les e-mails entrants par importance en utilisant l’apprentissage automatique. Cette fonctionnalité est activée par défaut mais peut être par défaut désactivée ici. Les utilisateurs peuvent individuellement activer ou désactiver la fonctionnalité pour leurs comptes.", "The Mail app can process user data with the help of the configured large language model and provide assistance features like thread summaries, smart replies and event agendas." : "L'app Mail peut traiter des données utilisateurs avec l'aide d'un grand modèle de langage configuré et fournir des fonctionnalités d'assistance comme le résumé d'un fil, les réponses intelligentes ou les agendas des événements.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "L'application Mail ne vérifie pas les alias. Si cette fonctionnalité est activée sans prise en charge côté serveur, votre serveur de messagerie risque de rejeter les messages sortants, ce qui entraînera l'échec de l'envoi des e-mails.", "The message could not be translated" : "Le message n'a pas pu être traduit", "The original message will be attached as a \"message/rfc822\" attachment." : "Le message d'origine sera joint en tant que pièce jointe \"message/rcf822\".", "The private key is only required if you intend to send signed and encrypted emails using this certificate." : "La clé privée n'est requise que si vous prévoyez d'envoyer des messages signés et chiffrés grâce à ce certificat.", diff --git a/l10n/fr.json b/l10n/fr.json index 12dc37fe11..738db35cb0 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -1,6 +1,8 @@ { "translations": { "pluralForm" : "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} pièce jointe\"\n- \"{count} pièces jointes\"\n- \"{count} pièces jointes\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} boîte mail …\"\n- \"{count} boîtes mail …\"\n- \"{count} boîtes mail …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} boîte mail\"\n- \"{count} boîtes mail\"\n- \"{count} boîtes mail\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} message\"\n- \"{total} messages\"\n- \"{total} messages\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} non lu sur {total}\"\n- \"{unread} non lus sur {total}\"\n- \"{unread} non lus sur {total}\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- |-\n %n nouveau message\n de {from}\n- |-\n %n nouveaux messages\n de {from}\n- |-\n %n nouveaux messages\n de {from}\n", @@ -28,7 +30,7 @@ "{attendeeName} tentatively accepted your invitation" : "{attendeeName} a accepté provisoirement votre invitation", "{commonName} - Valid until {expiryDate}" : "{commonName} - Valide jusqu'au {expiryDate}", "_{count} mailbox_::_{count} mailboxes_" : ["{count} boîte mail","{count} boîtes mail","{count} boîtes mail"], - "_{count} mailbox …_::_{count} mailboxes …_" : ["{count} boîte mail …","{count} boîtes mail …","{count} boîtes mail …"], + "_{count} mailbox …_::_{count} mailboxes …_" : ["{count} boîte mail …","\n{count} boîtes mail …","{count} boîte mail …"], "{from}\n{subject}" : "{from}\n{subject}", "{markup-start}Draft:{markup-end} {subject}" : "{markup-start}Brouillon : {markup-end} {subject}", "{name} Assistant" : "{name} Assistant", @@ -84,7 +86,9 @@ "All messages in mailbox will be deleted." : "Tous les messages du dossier seront supprimés.", "Allow additional mail accounts" : "Autoriser des comptes de messagerie supplémentaires", "Allow additional Mail accounts from User Settings" : "Autoriser des comptes de messagerie supplémentaires à partir des paramètres de l'utilisateur", + "Allow aliases" : "Autoriser les alias", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Autoriser l'application à collecter des données sur vos interactions. À partir de ces données, l'application s'adaptera à vos préférences. Les données seront uniquement stockées localement.", + "Allow users to create mail aliases" : "Permettre aux utilisateurs de créer des alias de messagerie", "Always show images from {domain}" : "Toujours afficher les images de {domain}", "Always show images from {sender}" : "Toujours afficher les images de {sender}", "An error occurred, unable to create the tag." : "Une erreur est survenue, impossible de créer l'étiquette.", @@ -227,6 +231,7 @@ "Create mail filter" : "Créer un filtre d'email", "Create task" : "Créer une tâche", "Creating account..." : "Création du compte...", + "Creating aliases has been disabled by the administrator." : "L'administrateur a désactivé la création d'alias.", "Custom" : "Personnalisé", "Custom date and time" : "Date et heure personnalisées", "Data collection consent" : "Consentement à la récolte de données", @@ -801,6 +806,7 @@ "The mail app allows users to read mails on their IMAP accounts." : "L'application de messagerie permet aux utilisateurs de lire leurs e-mails depuis leurs comptes IMAP.", "The Mail app can classify incoming emails by importance using machine learning. This feature is enabled by default but can be disabled by default here. Individual users will still be able to toggle the feature for their accounts." : "L’application Mail peut classifier les e-mails entrants par importance en utilisant l’apprentissage automatique. Cette fonctionnalité est activée par défaut mais peut être par défaut désactivée ici. Les utilisateurs peuvent individuellement activer ou désactiver la fonctionnalité pour leurs comptes.", "The Mail app can process user data with the help of the configured large language model and provide assistance features like thread summaries, smart replies and event agendas." : "L'app Mail peut traiter des données utilisateurs avec l'aide d'un grand modèle de langage configuré et fournir des fonctionnalités d'assistance comme le résumé d'un fil, les réponses intelligentes ou les agendas des événements.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "L'application Mail ne vérifie pas les alias. Si cette fonctionnalité est activée sans prise en charge côté serveur, votre serveur de messagerie risque de rejeter les messages sortants, ce qui entraînera l'échec de l'envoi des e-mails.", "The message could not be translated" : "Le message n'a pas pu être traduit", "The original message will be attached as a \"message/rfc822\" attachment." : "Le message d'origine sera joint en tant que pièce jointe \"message/rcf822\".", "The private key is only required if you intend to send signed and encrypted emails using this certificate." : "La clé privée n'est requise que si vous prévoyez d'envoyer des messages signés et chiffrés grâce à ce certificat.", diff --git a/l10n/it.js b/l10n/it.js index acb7b32191..16566c0ae8 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -3,6 +3,8 @@ OC.L10N.register( { "pluralForm" : "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} allegato\"\n- \"{count} allegati\"\n- \"{count} allegati\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} casella di posta …\"\n- \"{count} caselle di posta …\"\n- \"{count} caselle di posta …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} casella di posta\"\n- \"{count} caselle di posta\"\n- \"{count} caselle di posta\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} messaggio\"\n- \"{total} messaggi\"\n- \"{total} messaggi\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} non letto di {total}\"\n- \"{unread} non letti di {total}\"\n- \"{unread} non letti di {total}\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- \"%n nuovo messaggio \\nda {from}\"\n- \"%n nuovi messaggi \\nda {from}\"\n- \"%n nuovi messaggi \\nda {from}\"\n", @@ -58,7 +60,9 @@ OC.L10N.register( "All" : "Tutti", "All day" : "Tutto il giorno", "All inboxes" : "Tutte le cartelle di posta in arrivo", + "Allow aliases" : "Consenti gli alias", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Consenti all'applicazione di raccogliere dati sulle tue interazioni. Sulla base di questi dati, l'applicazione si adatterà alle tue preferenze. I dati saranno archiviati solo localmente.", + "Allow users to create mail aliases" : "Consentire agli utenti di creare alias di posta elettronica", "Always show images from {domain}" : "Mostra sempre le immagini da {domain}", "Always show images from {sender}" : "Mostra sempre le immagini da {sender}", "An error occurred, unable to create the tag." : "Si è verificato un errore, impossibile creare l'etichetta.", @@ -151,6 +155,7 @@ OC.L10N.register( "Create alias" : "Crea alias", "Create event" : "Crea evento", "Create task" : "Crea attività", + "Creating aliases has been disabled by the administrator." : "La creazione di alias è stata disabilitata dall'amministratore.", "Custom" : "Personalizzato", "Custom date and time" : "Data e ora personalizzate", "Date" : "Data", @@ -536,6 +541,7 @@ OC.L10N.register( "The LDAP aliases integration reads an attribute from the configured LDAP directory to provision email aliases." : "L'integrazione degli alias LDAP legge un attributo dalla directory LDAP configurata per eseguire il approvvigionamento degli e-mail alias.", "The link leads to %s" : "Il collegamento conduce a %s", "The mail app allows users to read mails on their IMAP accounts." : "L'applicazione di posta consente agli utenti di leggere i messaggi dei propri account IMAP.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "L'app Mail non verifica gli alias. Se questa funzione viene abilitata senza un supporto lato server, il server di posta probabilmente rifiuterà i messaggi in uscita, causando il mancato invio delle e-mail.", "The message could not be translated" : "Questo messaggio non può essere tradotto", "The original message will be attached as a \"message/rfc822\" attachment." : "Il messaggio originale verrà allegato come tipo \"message/rfc822\".", "The private key is only required if you intend to send signed and encrypted emails using this certificate." : "La chiave privata è necessaria solo se si intende inviare email firmate e cifrate utilizzando questo certificato.", diff --git a/l10n/it.json b/l10n/it.json index ac0e949a84..f9844ae909 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -1,6 +1,8 @@ { "translations": { "pluralForm" : "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} allegato\"\n- \"{count} allegati\"\n- \"{count} allegati\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} casella di posta …\"\n- \"{count} caselle di posta …\"\n- \"{count} caselle di posta …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} casella di posta\"\n- \"{count} caselle di posta\"\n- \"{count} caselle di posta\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} messaggio\"\n- \"{total} messaggi\"\n- \"{total} messaggi\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} non letto di {total}\"\n- \"{unread} non letti di {total}\"\n- \"{unread} non letti di {total}\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- \"%n nuovo messaggio \\nda {from}\"\n- \"%n nuovi messaggi \\nda {from}\"\n- \"%n nuovi messaggi \\nda {from}\"\n", @@ -56,7 +58,9 @@ "All" : "Tutti", "All day" : "Tutto il giorno", "All inboxes" : "Tutte le cartelle di posta in arrivo", + "Allow aliases" : "Consenti gli alias", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Consenti all'applicazione di raccogliere dati sulle tue interazioni. Sulla base di questi dati, l'applicazione si adatterà alle tue preferenze. I dati saranno archiviati solo localmente.", + "Allow users to create mail aliases" : "Consentire agli utenti di creare alias di posta elettronica", "Always show images from {domain}" : "Mostra sempre le immagini da {domain}", "Always show images from {sender}" : "Mostra sempre le immagini da {sender}", "An error occurred, unable to create the tag." : "Si è verificato un errore, impossibile creare l'etichetta.", @@ -149,6 +153,7 @@ "Create alias" : "Crea alias", "Create event" : "Crea evento", "Create task" : "Crea attività", + "Creating aliases has been disabled by the administrator." : "La creazione di alias è stata disabilitata dall'amministratore.", "Custom" : "Personalizzato", "Custom date and time" : "Data e ora personalizzate", "Date" : "Data", @@ -534,6 +539,7 @@ "The LDAP aliases integration reads an attribute from the configured LDAP directory to provision email aliases." : "L'integrazione degli alias LDAP legge un attributo dalla directory LDAP configurata per eseguire il approvvigionamento degli e-mail alias.", "The link leads to %s" : "Il collegamento conduce a %s", "The mail app allows users to read mails on their IMAP accounts." : "L'applicazione di posta consente agli utenti di leggere i messaggi dei propri account IMAP.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "L'app Mail non verifica gli alias. Se questa funzione viene abilitata senza un supporto lato server, il server di posta probabilmente rifiuterà i messaggi in uscita, causando il mancato invio delle e-mail.", "The message could not be translated" : "Questo messaggio non può essere tradotto", "The original message will be attached as a \"message/rfc822\" attachment." : "Il messaggio originale verrà allegato come tipo \"message/rfc822\".", "The private key is only required if you intend to send signed and encrypted emails using this certificate." : "La chiave privata è necessaria solo se si intende inviare email firmate e cifrate utilizzando questo certificato.", diff --git a/l10n/nl.js b/l10n/nl.js index 09abbb4999..f823d611e3 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -3,6 +3,8 @@ OC.L10N.register( { "pluralForm" : "nplurals=2; plural=(n != 1);", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} bijlagen\"\n- \"{count} bijlagen\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} mailbox …\"\n- \"{count} mailboxen …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} mailbox\"\n- \"{count} mailboxen\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} bericht\"\n- \"{total} berichten\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} ongelezen van de {total}\"\n- \"{unread} ongelezen van de {total}\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- \"%n nieuw bericht \\nvan {from}\"\n- \"%n nieuwe berichten \\nvan {from}\"\n", @@ -57,7 +59,9 @@ OC.L10N.register( "All" : "Alle", "All day" : "Alle dagen", "All inboxes" : "Alle postvakken", + "Allow aliases" : "Aliassen toestaan", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Laat de app gegevens verzamelen over jouw interacties. Op basis van deze gegevens zal de app zich aanpassen aan je voorkeuren. De gegevens worden alleen lokaal opgeslagen.", + "Allow users to create mail aliases" : "Gebruikers toestaan om e-mailaliassen aan te maken", "Always show images from {domain}" : "Afbeeldingen van {domain} altijd tonen", "Always show images from {sender}" : "Afbeeldingen van {sender} altijd tonen", "An error occurred, unable to create the tag." : "Er trad een fout op, tag kon niet worden gecreëerd.", @@ -128,6 +132,7 @@ OC.L10N.register( "Create alias" : "Aanmaken alias", "Create event" : "Creëer afspraak", "Create task" : "Aanmaken taak", + "Creating aliases has been disabled by the administrator." : "Creating aliases has been disabled by the administrator.", "Custom" : "Maatwerk", "Date" : "Datum", "Decline" : "Afwijzen", @@ -446,6 +451,7 @@ OC.L10N.register( "The LDAP aliases integration reads an attribute from the configured LDAP directory to provision email aliases." : "De integratie van LDAP-aliassen leest een kenmerk uit de geconfigureerde LDAP-directory om e-mailaliassen in te richten.", "The link leads to %s" : "De link verwijst naar %s", "The mail app allows users to read mails on their IMAP accounts." : "Met de mail-app kunnen gebruikers e-mails lezen op hun IMAP-accounts.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "De Mail-app controleert geen aliassen. Als deze functie is ingeschakeld zonder dat er ondersteuning op de server aanwezig is, zal uw mailserver uitgaande berichten waarschijnlijk weigeren, waardoor e-mails niet worden verzonden.", "The message could not be translated" : "Het bericht kon niet vertaald worden", "The original message will be attached as a \"message/rfc822\" attachment." : "Het originele bericht wordt bijgevoegd als een \"message/rfc822\" bijlage.", "The provisioning mechanism will prioritise specific domain configurations over the wildcard domain configuration." : "Het inrichtingsmechanisme geeft prioriteit aan specifieke domeinconfiguraties boven de jokerteken-domeinconfiguratie.", diff --git a/l10n/nl.json b/l10n/nl.json index cd9dde57c5..d59e65831e 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -1,6 +1,8 @@ { "translations": { "pluralForm" : "nplurals=2; plural=(n != 1);", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} bijlagen\"\n- \"{count} bijlagen\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} mailbox …\"\n- \"{count} mailboxen …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} mailbox\"\n- \"{count} mailboxen\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} bericht\"\n- \"{total} berichten\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} ongelezen van de {total}\"\n- \"{unread} ongelezen van de {total}\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- \"%n nieuw bericht \\nvan {from}\"\n- \"%n nieuwe berichten \\nvan {from}\"\n", @@ -55,7 +57,9 @@ "All" : "Alle", "All day" : "Alle dagen", "All inboxes" : "Alle postvakken", + "Allow aliases" : "Aliassen toestaan", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Laat de app gegevens verzamelen over jouw interacties. Op basis van deze gegevens zal de app zich aanpassen aan je voorkeuren. De gegevens worden alleen lokaal opgeslagen.", + "Allow users to create mail aliases" : "Gebruikers toestaan om e-mailaliassen aan te maken", "Always show images from {domain}" : "Afbeeldingen van {domain} altijd tonen", "Always show images from {sender}" : "Afbeeldingen van {sender} altijd tonen", "An error occurred, unable to create the tag." : "Er trad een fout op, tag kon niet worden gecreëerd.", @@ -126,6 +130,7 @@ "Create alias" : "Aanmaken alias", "Create event" : "Creëer afspraak", "Create task" : "Aanmaken taak", + "Creating aliases has been disabled by the administrator." : "Creating aliases has been disabled by the administrator.", "Custom" : "Maatwerk", "Date" : "Datum", "Decline" : "Afwijzen", @@ -444,6 +449,7 @@ "The LDAP aliases integration reads an attribute from the configured LDAP directory to provision email aliases." : "De integratie van LDAP-aliassen leest een kenmerk uit de geconfigureerde LDAP-directory om e-mailaliassen in te richten.", "The link leads to %s" : "De link verwijst naar %s", "The mail app allows users to read mails on their IMAP accounts." : "Met de mail-app kunnen gebruikers e-mails lezen op hun IMAP-accounts.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "De Mail-app controleert geen aliassen. Als deze functie is ingeschakeld zonder dat er ondersteuning op de server aanwezig is, zal uw mailserver uitgaande berichten waarschijnlijk weigeren, waardoor e-mails niet worden verzonden.", "The message could not be translated" : "Het bericht kon niet vertaald worden", "The original message will be attached as a \"message/rfc822\" attachment." : "Het originele bericht wordt bijgevoegd als een \"message/rfc822\" bijlage.", "The provisioning mechanism will prioritise specific domain configurations over the wildcard domain configuration." : "Het inrichtingsmechanisme geeft prioriteit aan specifieke domeinconfiguraties boven de jokerteken-domeinconfiguratie.", diff --git a/l10n/sv.js b/l10n/sv.js index 2fdcebcd1a..5174d4a158 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -3,6 +3,8 @@ OC.L10N.register( { "pluralForm" : "nplurals=2; plural=(n != 1);", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} bilaga\"\n- \"{count} bilagor\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} brevlåda …\"\n- \"{count} brevlådor …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} brevlåda\"\n- \"{count} brevlådor\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} meddelande\"\n- \"{total} meddelanden\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} av {total} oläst\"\n- \"{unread} av {total} oläst\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- \"%n nytt meddelande \\nfrån {from}\"\n- \"%n nya meddelanden \\nfrån {from}\"\n", @@ -40,7 +42,9 @@ OC.L10N.register( "All" : "Alla", "All day" : "Hela dagen", "All inboxes" : "Alla inkorgar", + "Allow aliases" : "Tillåt alias", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Låt appen samla in data om dina interaktioner. Baserat på denna information kommer appen att anpassas till dina preferenser. Uppgifterna lagras endast lokalt.", + "Allow users to create mail aliases" : "Låt användarna skapa e-postalias", "Always show images from {domain}" : "Visa alltid bilder från {domain}", "Always show images from {sender}" : "Visa alltid bilder från {sender}", "An error occurred, unable to create the tag." : "Ett fel uppstod, kunde inte spara taggen.", @@ -104,6 +108,7 @@ OC.L10N.register( "Create alias" : "Skapa alias", "Create event" : "Skapa evenemang", "Create task" : "Skapa uppgift", + "Creating aliases has been disabled by the administrator." : "Creating aliases has been disabled by the administrator.", "Custom" : "Anpassad", "Custom date and time" : "Anpassat datum och tid", "Date" : "Datum", @@ -388,6 +393,7 @@ OC.L10N.register( "The images have been blocked to protect your privacy." : "Bilderna har blockerats av säkerhetsskäl.", "The link leads to %s" : "Länken pekar mot %s", "The mail app allows users to read mails on their IMAP accounts." : "Mail-appen tillåter användare att läsa e-post på sina IMAP-konton.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "Appen Mail kontrollerar inte alias. Om denna funktion aktiveras utan att det finns stöd för detta på serversidan kommer din e-postserver sannolikt att avvisa utgående meddelanden, vilket leder till att e-postmeddelandena inte skickas.", "The message could not be translated" : "Meddelandet kunde inte översättas", "There are no mailboxes to display." : "Det finns inga postlådor att visa.", "There was a problem loading {tag}{name}{endtag}" : "Det uppstod ett problem vis inläsning av {tag}{name}{endtag}", diff --git a/l10n/sv.json b/l10n/sv.json index db7cce64c5..59cc41692c 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -1,6 +1,8 @@ { "translations": { "pluralForm" : "nplurals=2; plural=(n != 1);", "_{count} attachment_::_{count} attachments_" : "---\n- \"{count} bilaga\"\n- \"{count} bilagor\"\n", + "_{count} mailbox …_::_{count} mailboxes …_" : "---\n- \"{count} brevlåda …\"\n- \"{count} brevlådor …\"\n", + "_{count} mailbox_::_{count} mailboxes_" : "---\n- \"{count} brevlåda\"\n- \"{count} brevlådor\"\n", "_{total} message_::_{total} messages_" : "---\n- \"{total} meddelande\"\n- \"{total} meddelanden\"\n", "_{unread} unread of {total}_::_{unread} unread of {total}_" : "---\n- \"{unread} av {total} oläst\"\n- \"{unread} av {total} oläst\"\n", "_%n new message \nfrom {from}_::_%n new messages \nfrom {from}_" : "---\n- \"%n nytt meddelande \\nfrån {from}\"\n- \"%n nya meddelanden \\nfrån {from}\"\n", @@ -38,7 +40,9 @@ "All" : "Alla", "All day" : "Hela dagen", "All inboxes" : "Alla inkorgar", + "Allow aliases" : "Tillåt alias", "Allow the app to collect data about your interactions. Based on this data, the app will adapt to your preferences. The data will only be stored locally." : "Låt appen samla in data om dina interaktioner. Baserat på denna information kommer appen att anpassas till dina preferenser. Uppgifterna lagras endast lokalt.", + "Allow users to create mail aliases" : "Låt användarna skapa e-postalias", "Always show images from {domain}" : "Visa alltid bilder från {domain}", "Always show images from {sender}" : "Visa alltid bilder från {sender}", "An error occurred, unable to create the tag." : "Ett fel uppstod, kunde inte spara taggen.", @@ -102,6 +106,7 @@ "Create alias" : "Skapa alias", "Create event" : "Skapa evenemang", "Create task" : "Skapa uppgift", + "Creating aliases has been disabled by the administrator." : "Creating aliases has been disabled by the administrator.", "Custom" : "Anpassad", "Custom date and time" : "Anpassat datum och tid", "Date" : "Datum", @@ -386,6 +391,7 @@ "The images have been blocked to protect your privacy." : "Bilderna har blockerats av säkerhetsskäl.", "The link leads to %s" : "Länken pekar mot %s", "The mail app allows users to read mails on their IMAP accounts." : "Mail-appen tillåter användare att läsa e-post på sina IMAP-konton.", + "The Mail app does not verify aliases. If this is enabled without existing server-side support, your mail server will likely reject outgoing messages, causing emails to fail." : "Appen Mail kontrollerar inte alias. Om denna funktion aktiveras utan att det finns stöd för detta på serversidan kommer din e-postserver sannolikt att avvisa utgående meddelanden, vilket leder till att e-postmeddelandena inte skickas.", "The message could not be translated" : "Meddelandet kunde inte översättas", "There are no mailboxes to display." : "Det finns inga postlådor att visa.", "There was a problem loading {tag}{name}{endtag}" : "Det uppstod ett problem vis inläsning av {tag}{name}{endtag}", diff --git a/lib/Service/AliasesService.php b/lib/Service/AliasesService.php index e0fd9d2b0e..6692fefa00 100644 --- a/lib/Service/AliasesService.php +++ b/lib/Service/AliasesService.php @@ -16,12 +16,14 @@ use OCA\Mail\Exception\ClientException; use OCP\AppFramework\Db\DoesNotExistException; use OCP\IConfig; +use OCP\IL10N; class AliasesService { public function __construct( private AliasMapper $aliasMapper, private MailAccountMapper $mailAccountMapper, private IConfig $config, + private IL10N $l10n, ) { } @@ -65,7 +67,7 @@ public function findByAliasAndUserId(string $aliasEmail, string $userId): Alias */ public function create(string $userId, int $accountId, string $alias, string $aliasName): Alias { if ($this->config->getAppValue('mail', 'allow_new_mail_aliases', 'yes') === 'no') { - throw new ClientException('Creating aliases has been disabled by the administrator.'); + throw new ClientException($this->l10n->t('Creating aliases has been disabled by the administrator.')); } $this->mailAccountMapper->find($userId, $accountId); diff --git a/tests/Unit/Service/AliasesServiceTest.php b/tests/Unit/Service/AliasesServiceTest.php index cb2aa36e0e..6c60b78e96 100644 --- a/tests/Unit/Service/AliasesServiceTest.php +++ b/tests/Unit/Service/AliasesServiceTest.php @@ -17,6 +17,7 @@ use OCA\Mail\Service\AliasesService; use OCP\AppFramework\Db\DoesNotExistException; use OCP\IConfig; +use OCP\IL10N; use PHPUnit\Framework\MockObject\MockObject; class AliasesServiceTest extends TestCase { @@ -26,17 +27,26 @@ class AliasesServiceTest extends TestCase { private MailAccountMapper&MockObject $mailAccountMapper; private IConfig&MockObject $config; + private IL10N&MockObject $l10n; + protected function setUp(): void { parent::setUp(); $this->aliasMapper = $this->createMock(AliasMapper::class); $this->mailAccountMapper = $this->createMock(MailAccountMapper::class); $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + + $this->l10n->method('t') + ->willReturnCallback(function (string $text) { + return $text; + }); $this->service = new AliasesService( $this->aliasMapper, $this->mailAccountMapper, $this->config, + $this->l10n, ); } From 57111672555e41219977593a6059818a8c320227 Mon Sep 17 00:00:00 2001 From: "Misha M.-Kupriyanov" Date: Mon, 27 Apr 2026 12:35:24 +0200 Subject: [PATCH 6/6] IONOS(aliases): docs(admin): add instructions to disable alias creation Added documentation for administrators on how to globally disable the creation of new mail aliases. This includes command-line instructions and notes on the user interface changes when the setting is applied. When disabled, users can still view and delete existing aliases, but the option to add new ones is removed. Signed-off-by: Misha M.-Kupriyanov --- doc/admin.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/doc/admin.md b/doc/admin.md index f8d1c9ea82..e6563a9201 100644 --- a/doc/admin.md +++ b/doc/admin.md @@ -95,6 +95,22 @@ occ config:app:set mail abuse_number_of_messages_per_1h --value=30 occ config:app:set mail abuse_number_of_messages_per_1d --value=100 ``` +### Disable alias creation + +By default, users can create new mail aliases. Administrators can prevent this globally while still allowing users to view and delete their existing aliases. + +```bash +# Disable alias creation for all users +occ config:app:set mail allow_new_mail_aliases --value=no + +# Re-enable alias creation (default) +occ config:app:set mail allow_new_mail_aliases --value=yes +``` + +When disabled, the "Add alias" button is hidden in the user interface and API requests to create new aliases are rejected. Existing aliases remain visible and can be deleted. + +The setting can also be toggled from the Mail section of the Nextcloud admin settings page. + ## Google OAuth This app can allow users to connect their Google accounts with OAuth. This makes it possible to use accounts without 2FA or app password.