diff --git a/frontend/src/locale/br/app.po b/frontend/src/locale/br/app.po
index 2005e7282..c352e248e 100644
--- a/frontend/src/locale/br/app.po
+++ b/frontend/src/locale/br/app.po
@@ -640,7 +640,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1965,7 +1965,7 @@ msgstr "Dibarzhioù"
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
#, fuzzy
msgid "Parameters updated"
msgstr "Profil hizivaet"
@@ -2707,7 +2707,7 @@ msgstr "Postel"
msgid "Week"
msgstr ""
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr "Degemer mat e-barzh Modoboa"
diff --git a/frontend/src/locale/cs/app.po b/frontend/src/locale/cs/app.po
index d65cdd36f..d42c6089b 100644
--- a/frontend/src/locale/cs/app.po
+++ b/frontend/src/locale/cs/app.po
@@ -613,7 +613,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1856,7 +1856,7 @@ msgstr ""
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr ""
@@ -2553,7 +2553,7 @@ msgstr ""
msgid "Week"
msgstr ""
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr ""
diff --git a/frontend/src/locale/de/app.po b/frontend/src/locale/de/app.po
index abaf722b9..1e359ad3f 100644
--- a/frontend/src/locale/de/app.po
+++ b/frontend/src/locale/de/app.po
@@ -642,7 +642,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1965,7 +1965,7 @@ msgstr "Optionen"
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
#, fuzzy
msgid "Parameters updated"
msgstr "Profil aktualisiert"
@@ -2710,7 +2710,7 @@ msgstr ""
msgid "Week"
msgstr "Woche"
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr "Willkommen zu Modoboa"
diff --git a/frontend/src/locale/el/app.po b/frontend/src/locale/el/app.po
index c7489bad2..dd7c64254 100644
--- a/frontend/src/locale/el/app.po
+++ b/frontend/src/locale/el/app.po
@@ -612,7 +612,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1855,7 +1855,7 @@ msgstr ""
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr ""
@@ -2552,7 +2552,7 @@ msgstr ""
msgid "Week"
msgstr ""
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr ""
diff --git a/frontend/src/locale/en/app.po b/frontend/src/locale/en/app.po
index 4502e323b..9e28873d6 100644
--- a/frontend/src/locale/en/app.po
+++ b/frontend/src/locale/en/app.po
@@ -604,7 +604,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1847,7 +1847,7 @@ msgstr ""
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr ""
@@ -2544,7 +2544,7 @@ msgstr ""
msgid "Week"
msgstr ""
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr ""
diff --git a/frontend/src/locale/es/app.po b/frontend/src/locale/es/app.po
index f4a1d553e..b964043f8 100644
--- a/frontend/src/locale/es/app.po
+++ b/frontend/src/locale/es/app.po
@@ -639,7 +639,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1960,7 +1960,7 @@ msgstr "Opciones"
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
#, fuzzy
msgid "Parameters updated"
msgstr "Perfil actualizado"
@@ -2699,7 +2699,7 @@ msgstr "Correo-e"
msgid "Week"
msgstr "Semana"
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr "Bienvenido a Modoboa"
diff --git a/frontend/src/locale/fi/app.po b/frontend/src/locale/fi/app.po
index dd9d7f7fb..731767311 100644
--- a/frontend/src/locale/fi/app.po
+++ b/frontend/src/locale/fi/app.po
@@ -661,7 +661,7 @@ msgstr "Kopioi leikepöydälle"
msgid "Copy token to clipboard"
msgstr "Kopioi turvatunnus leikepöydälle"
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -2005,7 +2005,7 @@ msgstr "Vaihtoehdot"
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr "Parametrit päivitetty"
@@ -2756,7 +2756,7 @@ msgstr "Sähköposti"
msgid "Week"
msgstr "Viikko"
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr "Tervetuloa Modoboaan"
diff --git a/frontend/src/locale/fr/app.po b/frontend/src/locale/fr/app.po
index c3220cfc6..834ecdff5 100644
--- a/frontend/src/locale/fr/app.po
+++ b/frontend/src/locale/fr/app.po
@@ -1,19 +1,20 @@
-#
+#
# Translators:
# Adrien spitfireap, 2024
# Antoine Nguyen , 2025
-#
+#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2024-08-01 12:26+0000\n"
"Last-Translator: Antoine Nguyen , 2025\n"
"Language-Team: French (https://app.transifex.com/tonio/teams/13749/fr/)\n"
+"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: fr\n"
-"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
+"1000000 == 0 ? 1 : 2;\n"
#: src/components/admin/imap_migration/ProviderCreationForm.vue:41
msgid "(the domain will be created locally)"
@@ -42,8 +43,8 @@ msgid ""
"A user with all privileges, can do anything. By default, such a user does "
"not have a mailbox so he can't access end-user features."
msgstr ""
-"Un utilisateur ayant tous les privilège, peut tout faire. Par défaut, il n'a"
-" pas de boîte mail et ne peut donc pas accéder aux fonctionnalités d'un "
+"Un utilisateur ayant tous les privilège, peut tout faire. Par défaut, il n'a "
+"pas de boîte mail et ne peut donc pas accéder aux fonctionnalités d'un "
"utilisateur final."
#: src/components/admin/identities/form_steps/AccountRoleForm.vue:83
@@ -51,8 +52,8 @@ msgid ""
"A user with no privileges but with a mailbox. He will be allowed to use all "
"end-user features: webmail, calendar, contacts, filters."
msgstr ""
-"Un utilisateur sans privilèges mais ayant une boîte mail. Il sera autorisé à"
-" utiliser toutes les fonctionnalités de l'utilisateur final : webmail, "
+"Un utilisateur sans privilèges mais ayant une boîte mail. Il sera autorisé à "
+"utiliser toutes les fonctionnalités de l'utilisateur final : webmail, "
"calendrier, contacts, filtres."
#: src/components/admin/identities/form_steps/AccountRoleForm.vue:93
@@ -273,11 +274,11 @@ msgstr "Alias supprimé"
#: src/components/admin/identities/form_steps/AccountAliasForm.vue:8
#: src/components/admin/identities/form_steps/AliasRecipientForm.vue:8
msgid ""
-"Alias(es) of this mailbox. To create a catchall alias, just enter the domain"
-" name (@domain.tld)."
+"Alias(es) of this mailbox. To create a catchall alias, just enter the domain "
+"name (@domain.tld)."
msgstr ""
-"Alias(s) de cette boîte aux lettres. Pour créer un alias fourre-tout, entrer"
-" uniquement le nom du domaine (@domain.tld)."
+"Alias(s) de cette boîte aux lettres. Pour créer un alias fourre-tout, entrer "
+"uniquement le nom du domaine (@domain.tld)."
#: src/components/admin/domains/DomainList.vue:209
#: src/components/admin/domains/DomainSummary.vue:40
@@ -306,8 +307,8 @@ msgid ""
"administrator, plus the possibility to create domains and to assign "
"resources."
msgstr ""
-"Un utilisateur intermédiaire qui a les mêmes privilèges qu'un administrateur"
-" de domaine, et la possibilité de créer des domaines et d'affecter des "
+"Un utilisateur intermédiaire qui a les mêmes privilèges qu'un administrateur "
+"de domaine, et la possibilité de créer des domaines et d'affecter des "
"ressources."
#: src/components/account/FilterForm.vue:17
@@ -498,8 +499,8 @@ msgstr "Consulter la liste suivante pour trouver des composants associés"
#: src/views/admin/identities/IdentitiesView.vue:95
msgid "Check this option if passwords contained in your file are not crypted"
msgstr ""
-"Cochez cette option si les mots de passe contenus dans votre fichier ne sont"
-" pas chiffrés"
+"Cochez cette option si les mots de passe contenus dans votre fichier ne sont "
+"pas chiffrés"
#: src/components/admin/domains/DomainAliasForm.vue:15
msgid "Choose a domain"
@@ -633,7 +634,7 @@ msgstr "Copier dans le presse-papiers"
msgid "Copy token to clipboard"
msgstr "Copier le jeton dans la presse-papiers"
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr "Impossible de sauvegarder les paramètres"
@@ -830,8 +831,8 @@ msgid ""
"DKIM key does not seem to be generated yet or has failed. Do you want to "
"requeue the job?"
msgstr ""
-"La génération de la clé DKIM ne semble pas avoir eu lieu ou a échoué. Voulez"
-" vous replanifier cette action ?"
+"La génération de la clé DKIM ne semble pas avoir eu lieu ou a échoué. Voulez "
+"vous replanifier cette action ?"
#: src/components/admin/domains/DomainCreationForm.vue:209
#: src/components/admin/domains/form_steps/DomainDNSForm.vue:22
@@ -844,8 +845,7 @@ msgid "DKIM key selector"
msgstr "Sélecteur de clé DKIM"
#: src/components/admin/domains/DNSDetail.vue:238
-msgid ""
-"DKIM keys already exist for this domain. Do you want to overwrite them?"
+msgid "DKIM keys already exist for this domain. Do you want to overwrite them?"
msgstr "Des clés DKIM existent déjà pour ce domaine. Voulez-vous les écraser?"
#: src/components/admin/domains/DomainDKIMKey.vue:5
@@ -1339,8 +1339,8 @@ msgid ""
"If you configured it recently, please wait for the first report to be "
"received and processed."
msgstr ""
-"Si vous l'avez récemment configuré, veuillez attendre que le premier rapport"
-" soit reçu et traité. "
+"Si vous l'avez récemment configuré, veuillez attendre que le premier rapport "
+"soit reçu et traité. "
#: src/layouts/admin/AdminLayout.vue:83
msgid "IMAP Migration"
@@ -1402,11 +1402,12 @@ msgstr "Information"
#: src/components/account/TotpAuthForm.vue:34
msgid ""
-"Install a soft token authenticator like FreeOTP or Google Authenticator from"
-" your application repository and use that app to scan this QR code."
+"Install a soft token authenticator like FreeOTP or Google Authenticator from "
+"your application repository and use that app to scan this QR code."
msgstr ""
"Installez un logiciel d'authentification de jeton comme FreeOTP ou google\n"
-" Authentification depuis votre magasin d'applications et utilisez\n"
+" Authentification depuis votre magasin d'applications et "
+"utilisez\n"
" cette application pour scanner ce QR code."
#: src/views/admin/InformationView.vue:92
@@ -1424,8 +1425,7 @@ msgstr "Numéro de port incorrect"
#: src/components/admin/imap_migration/form_steps/ProviderGeneralForm.vue:27
msgid "Is the IMAP connection secured using SSL/TLS or StartTLS"
msgstr ""
-"La connexion IMAP est-elle sécurisée via l'utilisation de SSL/TLS ou "
-"StartTLS"
+"La connexion IMAP est-elle sécurisée via l'utilisation de SSL/TLS ou StartTLS"
#: src/components/account/ForwardForm.vue:16
msgid "Keep local copies"
@@ -1547,8 +1547,8 @@ msgstr "Boîtes aux lettres"
msgid ""
"Make sure Update password scheme at login option is enabled"
msgstr ""
-"Assurez vous que l'option Mettre à jour la méthode de chiffrement du"
-" mot de passe à la connexion est activée"
+"Assurez vous que l'option Mettre à jour la méthode de chiffrement du "
+"mot de passe à la connexion est activée"
#: src/components/webmail/EmailList.vue:72
msgid "Mark as followed"
@@ -1906,7 +1906,7 @@ msgstr "Options"
msgid "or suggest a new language"
msgstr "ou suggérer une nouvelle langue"
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr "Paramètres mis à jour"
@@ -1983,9 +1983,9 @@ msgid ""
"Please note that you will see this message until ALL user "
"passwords have been converted using the new scheme."
msgstr ""
-"Veuillez noter que vous verrez ce message jusqu'à ce que "
-"TOUS les mots de passe de vos utilisateurs aient été "
-"convertis en utilisant la nouvelle méthode."
+"Veuillez noter que vous verrez ce message jusqu'à ce que TOUS"
+"strong> les mots de passe de vos utilisateurs aient été convertis en "
+"utilisant la nouvelle méthode."
#: src/components/admin/imap_migration/ProviderCreationForm.vue:55
#: src/components/admin/imap_migration/ProvidersList.vue:98
@@ -2063,9 +2063,9 @@ msgstr "Quota"
#: src/components/admin/identities/form_steps/AccountMailboxForm.vue:15
msgid ""
-"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a"
-" custom value or use domain's default one. Leave empty to define an "
-"unlimited value (not allowed for domain administrators)."
+"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a "
+"custom value or use domain's default one. Leave empty to define an unlimited "
+"value (not allowed for domain administrators)."
msgstr ""
"Quota pour cette boite. Peut être exprimé en Ko, Mo (défaut) ou Go. Définir "
"une valeur spécifique ou utiliser la valeur par défaut du domaine. Laisser "
@@ -2409,8 +2409,8 @@ msgid ""
"The first element of each line is mandatory and must be equal to one of the "
"previous values."
msgstr ""
-"Le premier élément de chaque ligne est obligatoire et doit être égal à l'une"
-" des valeurs précédentes."
+"Le premier élément de chaque ligne est obligatoire et doit être égal à l'une "
+"des valeurs précédentes."
#: src/components/account/RecoveryCodesResetDialog.vue:9
#: src/components/account/TotpAuthForm.vue:61
@@ -2428,9 +2428,9 @@ msgstr ""
#: src/views/admin/InformationView.vue:22
msgid ""
-"The password scheme you are using has been deprecated and will be removed in"
-" the next minor version. The procedure to upgrade to a stronger scheme is as"
-" follows:"
+"The password scheme you are using has been deprecated and will be removed in "
+"the next minor version. The procedure to upgrade to a stronger scheme is as "
+"follows:"
msgstr ""
"La méthode de chiffrement de mot de passe que vous utilisez a été rendue "
"obsolète et sera retirée dans la prochaine version mineure. La procédure de "
@@ -2454,8 +2454,8 @@ msgstr "A"
#: src/components/contacts/AddressBookInfo.vue:9
msgid ""
-"To access this address book from the outside (such as Mozilla Thunderbird or"
-" your smartphone), use the following URL:"
+"To access this address book from the outside (such as Mozilla Thunderbird or "
+"your smartphone), use the following URL:"
msgstr ""
"Pour accéder à ce carnet d'adresse depuis l'extérieur (comme Mozilla "
"Thunderbird ou votre smartphone), utilisez l'URL suivante :"
@@ -2636,7 +2636,7 @@ msgstr "Webmail"
msgid "Week"
msgstr "Semaine"
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr "Bienvenue dans Modoboa"
diff --git a/frontend/src/locale/it/app.po b/frontend/src/locale/it/app.po
index 8809110ba..9376f672f 100644
--- a/frontend/src/locale/it/app.po
+++ b/frontend/src/locale/it/app.po
@@ -640,7 +640,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1966,7 +1966,7 @@ msgstr "Opzioni"
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
#, fuzzy
msgid "Parameters updated"
msgstr "Profilo aggiornato"
@@ -2707,7 +2707,7 @@ msgstr "Email"
msgid "Week"
msgstr "Settimana"
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr "Benvenuti in Modoboa"
diff --git a/frontend/src/locale/ja/app.po b/frontend/src/locale/ja/app.po
index 85cb39570..85ab90992 100644
--- a/frontend/src/locale/ja/app.po
+++ b/frontend/src/locale/ja/app.po
@@ -611,7 +611,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1854,7 +1854,7 @@ msgstr ""
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr ""
@@ -2551,7 +2551,7 @@ msgstr ""
msgid "Week"
msgstr ""
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr ""
diff --git a/frontend/src/locale/messages.pot b/frontend/src/locale/messages.pot
index fbbf4af8a..75c43a5bc 100644
--- a/frontend/src/locale/messages.pot
+++ b/frontend/src/locale/messages.pot
@@ -585,7 +585,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1813,7 +1813,7 @@ msgstr ""
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr ""
@@ -2483,7 +2483,7 @@ msgstr ""
msgid "Week"
msgstr ""
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr ""
diff --git a/frontend/src/locale/nl/app.po b/frontend/src/locale/nl/app.po
index e1eb7a58c..b9455ae0c 100644
--- a/frontend/src/locale/nl/app.po
+++ b/frontend/src/locale/nl/app.po
@@ -612,7 +612,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1855,7 +1855,7 @@ msgstr ""
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr ""
@@ -2552,7 +2552,7 @@ msgstr ""
msgid "Week"
msgstr ""
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr ""
diff --git a/frontend/src/locale/pl/app.po b/frontend/src/locale/pl/app.po
index 864fdcb68..a10c74c11 100644
--- a/frontend/src/locale/pl/app.po
+++ b/frontend/src/locale/pl/app.po
@@ -614,7 +614,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1857,7 +1857,7 @@ msgstr ""
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr ""
@@ -2554,7 +2554,7 @@ msgstr ""
msgid "Week"
msgstr ""
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr ""
diff --git a/frontend/src/locale/pt_BR/app.po b/frontend/src/locale/pt_BR/app.po
index 98d2a971d..49613f8b3 100644
--- a/frontend/src/locale/pt_BR/app.po
+++ b/frontend/src/locale/pt_BR/app.po
@@ -635,7 +635,7 @@ msgstr "Copiar para área de transferência"
msgid "Copy token to clipboard"
msgstr "Copiar token para a área de transferência"
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr "Não é possível salvar os parâmetros"
@@ -1927,7 +1927,7 @@ msgstr "Opções"
msgid "or suggest a new language"
msgstr "ou sugira um novo idioma"
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr "Parâmetros atualizados"
@@ -2662,7 +2662,7 @@ msgstr "E-mail"
msgid "Week"
msgstr "Semana"
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr "Bem-vindo ao Modoboa"
diff --git a/frontend/src/locale/ru/app.po b/frontend/src/locale/ru/app.po
index b7b791e82..fafb41bdc 100644
--- a/frontend/src/locale/ru/app.po
+++ b/frontend/src/locale/ru/app.po
@@ -639,7 +639,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1956,7 +1956,7 @@ msgstr "Опции"
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
#, fuzzy
msgid "Parameters updated"
msgstr "Профиль обновлен"
@@ -2688,7 +2688,7 @@ msgstr ""
msgid "Week"
msgstr "Неделя"
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr "Добро пожаловать в Modoboa!"
diff --git a/frontend/src/locale/sv/app.po b/frontend/src/locale/sv/app.po
index e4eab7bf8..7bf0ef738 100644
--- a/frontend/src/locale/sv/app.po
+++ b/frontend/src/locale/sv/app.po
@@ -627,7 +627,7 @@ msgstr "Kopiera till urklipp"
msgid "Copy token to clipboard"
msgstr "Kopiera token till urklipp"
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr "Kunde inte spara parametrar"
@@ -1899,7 +1899,7 @@ msgstr "Alternativ"
msgid "or suggest a new language"
msgstr "eller föreslå ett nytt språk"
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr "Parametrar uppdaterade"
@@ -2627,7 +2627,7 @@ msgstr "Webmail"
msgid "Week"
msgstr "Vecka"
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr "Välkommen till Modoboa"
diff --git a/frontend/src/locale/tr/app.po b/frontend/src/locale/tr/app.po
index 50f9e07e5..513feb9ea 100644
--- a/frontend/src/locale/tr/app.po
+++ b/frontend/src/locale/tr/app.po
@@ -631,7 +631,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1923,7 +1923,7 @@ msgstr ""
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
#, fuzzy
msgid "Parameters updated"
msgstr "Profil güncellendi"
@@ -2649,7 +2649,7 @@ msgstr ""
msgid "Week"
msgstr ""
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr "Modoboa'ya hoş geldiniz"
diff --git a/frontend/src/locale/zh/app.po b/frontend/src/locale/zh/app.po
index 39e6f6032..2d18ea36e 100644
--- a/frontend/src/locale/zh/app.po
+++ b/frontend/src/locale/zh/app.po
@@ -611,7 +611,7 @@ msgstr ""
msgid "Copy token to clipboard"
msgstr ""
-#: src/components/tools/ParametersForm.vue:183
+#: src/components/tools/ParametersForm.vue:194
msgid "Could not save parameters"
msgstr ""
@@ -1854,7 +1854,7 @@ msgstr ""
msgid "or suggest a new language"
msgstr ""
-#: src/components/tools/ParametersForm.vue:178
+#: src/components/tools/ParametersForm.vue:189
msgid "Parameters updated"
msgstr ""
@@ -2551,7 +2551,7 @@ msgstr ""
msgid "Week"
msgstr ""
-#: src/views/DashboardView.vue:3
+#: src/views/DashboardView.vue:27
msgid "Welcome to Modoboa"
msgstr ""
diff --git a/modoboa/locale/br/LC_MESSAGES/django.po b/modoboa/locale/br/LC_MESSAGES/django.po
index 699e88092..bd649a424 100644
--- a/modoboa/locale/br/LC_MESSAGES/django.po
+++ b/modoboa/locale/br/LC_MESSAGES/django.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2020-05-06 11:16+0000\n"
"Last-Translator: Antoine Nguyen \n"
"Language-Team: Breton (http://www.transifex.com/tonio/modoboa/language/br/)\n"
@@ -23,7 +23,7 @@ msgstr ""
"> 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != "
"0 && n % 1000000 == 0) ? 3 : 4);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -31,74 +31,74 @@ msgstr ""
"Kota rannet kenetre ar boestoù-postel. Gellout a ra bezañ ezpleget e Ko, Mo "
"(diouer) pe Go c'hoazh. Un dalvoudegezh \"0\" a dalvez kota ebet."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
"Kota dre-ziouer e Mo arloet d'ar boestoù-postel. Un dalvoudegezh \"0\" a "
"dalvez kota ebet."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
msgid "domain alias with this name already exists"
msgstr "Un alias gant an anv-mañ zo anezhañ dija"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Enrolladenn MX aotreet ebet kavet evit an domani-mañ"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "N'hall ket bezañ brasoc'h evit kota an domani"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Aotreadur nac'het"
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Rekis eo leuniañ ar vaezienn"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr "Listenn domanioù meret (eilgwerzherien ha merourien zomani hepken)."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Neket aotreet evit ar rol-mañ."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Rankout a ra bezañ par ouzh boest-postell chomlec'h_klok"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Ar vaezienn-mañ a zo rekiset."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "N'eus ket eus an domani lec'hel {}"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Ul listenn resevourien"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "An implijer \"%s\" a zo anezhañ endeo"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "N'ho peus moned ebet d'an domani-mañ."
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "N'ho peus moned ebet d'ar voest-posteloù-mañ."
@@ -106,58 +106,58 @@ msgstr "N'ho peus moned ebet d'ar voest-posteloù-mañ."
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "Kavlec'h stokiñ an alc'hwezioù DKIM chomet digefluniet"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "N'hallit ket termeniñ ur c'hota divevenn"
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "An implijer \"%s\" a zo anezhañ endeo"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Rankout a ra bezañ un anterin pozitivel"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "n'heller ket kavout openssl, bezit asur emañ staliet."
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Neket bet kavet an domani."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Termeniñ da vihanañ ur rouedad / chomlec'h aotreet"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
#, fuzzy
#| msgid "A mailbox is required"
msgid "A mailbox is required to create aliases."
msgstr "Ur voest-posteloù a zo rekiset"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown"
msgid "Unknown status"
@@ -171,11 +171,11 @@ msgstr "N'ho peus moned ebet d'an domani-mañ"
msgid "You can't delete your own domain"
msgstr "N'hallit ket dilemel ho tomani deoc'h-c'hwi hoc'h-unan"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -487,12 +487,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Stumm chomlec'h IP direizh evit {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Objed a zo anezhañ dija: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d objed emporzhiet gant berzh"
@@ -653,7 +653,7 @@ msgid "Key length"
msgstr "Padelezh an alc'hwez"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Linenn direizh"
@@ -886,7 +886,7 @@ msgstr "Merour an domani"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "Aotren an implijer-mañ da vont e boestoù-post an implijerien"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "A-bep seurt"
@@ -995,7 +995,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -1009,24 +1009,24 @@ msgstr ""
msgid "Local"
msgstr "Lec'hel"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Profil implijer"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Sintaks direizh"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Niveroù ront direizh"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -1111,113 +1111,123 @@ msgstr "Hirder dre-zegouezh ger-tremen"
msgid "Length of randomly generated passwords."
msgstr "Hirder ar gerioù-tremen em-c'hanet."
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Hirder ar gerioù-tremen em-c'hanet."
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Chomlec'h ar servijer"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "Chomlec'h IP pe anv DNS ar servijer LDAP"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Porzh ar servijer"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Niverenn borzh TCP implijet gant ar servijer LDAP"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Ober gant ur gevreadenn suraet"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
"Implijit ur gevreadenn SSL/STARTTLS evit gellet tizhout ar servijer LDAP"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Kavlec'h oberiant"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Lavarout a ra hag-eñ e vez ar servijer LDAP ur C'havlec'h Oberiant"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Strolladoù merañ"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1225,47 +1235,47 @@ msgstr ""
"Izili ar strolladoù LDAP Posix a vo krouet evel bezañ merourien domani. "
"Implijit an arouezoù ';' evit gellet skejañ ar strolladoù."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Doare ar strollad"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "An doare strollad LDAP da implijout gant ho kavlec'h."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Diazez klask ar strolladoù"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "Anv dibar an diaz klask implijet evit kavout strolladoù"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Perzhioù ar ger-tremen"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Ar perzhioù implijet evit stokiñ ar gerioù-tremen implijer"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Doare dilesañ"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Dibabit an doare anavezadur da vezañ implijet"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Liammañ DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1273,29 +1283,29 @@ msgstr ""
"An anv dibar da vezañ implijet evit en em liammañ ouzh ar servijer LDAP. "
"Lezel goullo evit un liamm dizanv."
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Liammañ ur ger-tremen"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"Ar ger-tremen d'ober gantañ evit kevreañ ouzh ar servijer LDAP (gant "
"'kevreadenn DN')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Diazez enklask an implijerien"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "Anv dibar an diaz enklask implijet evit kavout implijerien"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Sil klask"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1303,11 +1313,11 @@ msgstr ""
"Ur chadenn sil diret (d.sk. '(objedKlas = person)'). Evit bezañ reizh, e "
"rank bezañ enklozet etre krommelloù."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Patrom implijer DN"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1316,166 +1326,236 @@ msgstr ""
"Ar skouer implijet evit sevel DN un implijer. Rankout a rafe enderc'hel ur "
"spas miret (d.l.e %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Taolenn-stur"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom RSS feed"
+msgid "Custom welcome message"
+msgstr "Froud RSS personel"
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Froud RSS personel"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
"Diskouez froudoù RSS personnel d'an eilgwerzherien ha merourien an domani"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Diskouez froudoù RSS personnel d'an eilgwerzherien ha merourien an domani"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Diskouez froudoù RSS personnel d'an eilgwerzherien ha merourien an domani"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Kuzhat an arc'hweladurioù objed"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
"Kuzhat an arc'hweladurioù objed d'an eilgwerzherien ha merourien an domani"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Eil chomlec'h postel"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Kemennadennoù"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Chomlec'h ar c'haser"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Chomlec'h postel implijet da gas kemmennoù."
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "API foran"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Enaouiñ ar c'hehentiñ"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Em-wiriañ ma vez ur stumm nevez hegerz"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Klask stummoù nevez"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Kas statistikoù"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Kas ar statistikoù da API foran Modoboa (kontourioù hag an astennoù "
"impliljet)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Treuzoù ar c'hontoù dioberiant"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Treuzoù ar c'hontoù dioberiant"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1483,39 +1563,39 @@ msgstr ""
"Ur gont gant un deiziad kevreañ koshoc'h evit an treuzoù-se (e devezhioù) a "
"vo kontet evel bezañ dioberiant"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Padelezh etre ar c'hemennoù gwiriañ pennañ"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Padelezh etre div gwiriadenn gemennoù pennañ (en eilennoù)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Oad enrollañ maksimom ar marilhoù"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Oad brasañ e devezhioù un enrollodenn renabl"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Elfennoù dre bajenn"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Niver a elfennoù diskouezet dre bajenn"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Adhenchañ pennañ dre-ziouer"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr "An adheñchañ dre-ziouer implijet pa n'eus arload ebet spisaet"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1525,18 +1605,42 @@ msgstr ""
"tremennadennoù eurvezh hañv/eurvezh goañv (d.l.e ar memes eurvezh lec'hel a "
"c'hoarvez div wech abalamour d'ur cheñchamant horolaj)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Lakaat `USE_TZ = Gwir e-barzh`arventennoù.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Implijer diazez"
@@ -1628,64 +1732,64 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Aotren ar moned d'ar boestoù-post"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Aotren an implijer-mañ da vont e boestoù-post an implijerien"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "Ger-tremen"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "yezh"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Yezh karetañ evit diskwel ar pajenoù"
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Niverenn bellgomz"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Eil chomlec'h postel"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
"Gallout a reer ober gant un eil chomlec'h postel evit ezhommoù adtapout"
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Hizivadur ger-tremen c'hwitet: modulenn LDAP nann-staliet"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "kont"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Dizanv"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
"N'hallit ket emporzhiañ ur gont gant ur rol pouezusoc'h evit hoc'h hini "
"deoc'h-c'hwi"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "An implijer eeun '%s' a rank kaout ur chomlec'h postel reizh"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2045,7 +2149,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -2077,24 +2181,24 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Enaouiñ ar c'hehentiñ dre API foran Modoboa "
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "n'heller ket termeniñ enkodiñ ar chadenn"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Aotreadur nac'het: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Aotreadur nac'het"
@@ -2873,11 +2977,11 @@ msgstr "Kemennadenn"
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3232,7 +3336,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
msgid "Failed to remove attachment: "
msgstr "N'heller ket adsevel lec'hiadur ar voest-posteloù (%s)"
@@ -3241,7 +3345,7 @@ msgstr "N'heller ket adsevel lec'hiadur ar voest-posteloù (%s)"
msgid "Date"
msgstr "Deiziad"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/cs/LC_MESSAGES/django.po b/modoboa/locale/cs/LC_MESSAGES/django.po
index d81d59e89..6ae78f547 100644
--- a/modoboa/locale/cs/LC_MESSAGES/django.po
+++ b/modoboa/locale/cs/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2020-05-11 18:45+0000\n"
"Last-Translator: Tydýt _, 2023\n"
"Language-Team: Czech (https://www.transifex.com/tonio/teams/13749/cs/)\n"
@@ -22,75 +22,75 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -98,56 +98,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -159,11 +159,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -428,12 +428,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -582,7 +582,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -778,7 +778,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -879,7 +879,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -891,24 +891,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -983,410 +983,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1478,61 +1570,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
#, fuzzy
#| msgid "Failed to update LDAP account: {}"
msgid "Failed to update password: LDAP module not installed"
msgstr "Nepodařilo se aktualizovat LDAP účet: {}"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1869,7 +1961,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1901,21 +1993,21 @@ msgstr "Nepodařilo se smazat LDAP účet: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "Nepodařilo se zakázat LDAP účet: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2605,11 +2697,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2911,7 +3003,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to create LDAP account: {}"
msgid "Failed to remove attachment: "
@@ -2921,7 +3013,7 @@ msgstr "Nepodařilo se vytvořit LDAT účet: {}"
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/locale/cs_CZ/LC_MESSAGES/django.po
index a3f68e817..55111dd8a 100644
--- a/modoboa/locale/cs_CZ/LC_MESSAGES/django.po
+++ b/modoboa/locale/cs_CZ/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2020-05-06 11:16+0000\n"
"Last-Translator: Antoine Nguyen \n"
"Language-Team: Czech (Czech Republic) (http://www.transifex.com/tonio/"
@@ -23,7 +23,7 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -31,72 +31,72 @@ msgstr ""
"Kvóta sdílená mezi poštovními schránkami. Lze vyjádřit v KB, MB (výchozí) "
"nebo GB. Hodnota 0 znamená žádnou kvótu."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr "Výchozí kvóta v MB pro schránky. Hodnota 0 = žádná kvóta."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
msgid "domain alias with this name already exists"
msgstr "Alias s tímto názvem již existuje"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Nebyly nalezeny žádné autorizované MX záznamy pro tuto doménu"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "Nemůže být vyšší než kvóta domény"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Přístup zamítnut."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Toto pole je vyžadováno"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr "Zobrazit spravované domény (jenom distributori a správci domén)"
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Není povoleno pro tuto roli."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Musí být rovno hodnote schránky celá_adresa"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Toto pole je vyžadováno."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Lokální doména {} neexistuje"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Seznam příjemců"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "Uživatel '%s' již existuje"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "K této doméně nemáte přístup."
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "K této schránce nemáte přístup."
@@ -104,58 +104,58 @@ msgstr "K této schránce nemáte přístup."
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "Není nastavena složka pro ukládání DKIM klíčů"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Neomezená kvóta nelze definovat."
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "Uživatel '%s' již existuje"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Musí se jednat o kladné číslo"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "openssl nenalezeno, prosím ujistěte se, že je nainstalováno."
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Složka nenalezena."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Definujte alespoň jednu autorizovanou síť / adresu"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
#, fuzzy
#| msgid "A mailbox is required"
msgid "A mailbox is required to create aliases."
msgstr "Schránka je vyžadována"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown"
msgid "Unknown status"
@@ -169,11 +169,11 @@ msgstr "Nemáte oprávnění k přístupu k této doméně"
msgid "You can't delete your own domain"
msgstr "Nemůžete smazat vlastní doménu"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -484,12 +484,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Neplatný formát IP adresy pro {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Objekt již existuje: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d objektů úspěšně importováno"
@@ -647,7 +647,7 @@ msgid "Key length"
msgstr "Délka klíče"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Neplatný řádek"
@@ -884,7 +884,7 @@ msgstr "Správce domény"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "Povolit správci přístup do uživatelských poštovních schránek"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Různé"
@@ -991,7 +991,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -1005,24 +1005,24 @@ msgstr ""
msgid "Local"
msgstr "Lokální"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Uživatelský profil"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Neplatná syntaxe"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Neplatný počet cyklů"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -1105,113 +1105,123 @@ msgstr "Délka náhodného hesla"
msgid "Length of randomly generated passwords."
msgstr "Počet znaků náhodně vygenerovaných hesel."
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Počet znaků náhodně vygenerovaných hesel."
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Adresa serveru"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "IP adresa DNS jména LDAP serveru"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Port serveru"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Port TCP, který používá LDAP server"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Použít zabezpečené připojení"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Použít SSL/STARTTLS připojení pro přístup k LDAP serveru"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
"Volba určující, jestli je nebo není LDAP server serverem Active Directory"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Správcovské skupiny"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1219,47 +1229,47 @@ msgstr ""
"Členové těchto LDAP Posix skupin budou automaticky vytvořeni jako správci "
"domény. Pro oddělení skupin použijte ';'."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Typ skupiny"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "Typ LDAP skupiny "
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Základna struktury skupin"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "Rozlišovací jméno základny struktury používané pro hledání skupin"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Atribut hesla"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Atribut používaný pro ukládání hesel uživatelů"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Metoda ověření"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Zvolte si metodu ověření, která se použije"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Spojení pomocí DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1267,29 +1277,29 @@ msgstr ""
"Rozlišovací jméno, které se použije při spojování s LDAP serverem. "
"Ponechejte prázdné pro anonymní spojení."
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Heslo spojení"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"Heslo, které se použije při spojování s LDAP serverem (při výběru DN "
"spojení)."
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Základna struktury uživatelů"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "Rozlišovací jméno základny struktury používané pro hledání uživatelů"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Vyhledávací filtr"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1297,11 +1307,11 @@ msgstr ""
"Volitelný filtr (např. '(objectClass=osoba)'). Aby byl filtr platný, je "
"nezbytné jen uzavřít do závorek."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Šablona uživatelského DN"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1310,164 +1320,234 @@ msgstr ""
"Šablona použitá pro tvorbu uživatelského rozlišovacího jména (DN). Měla by "
"obsahovat jeden zástupný řetězec (tj. %(user)s)."
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Plocha"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom message"
+msgid "Custom welcome message"
+msgstr "Vlastní zpráva"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid "A custom message that will appear at the end of documents"
+msgid "A welcome message that will be displayed instead the default one"
+msgstr "Vlastní zpráva, která se zobrazí na konci dokumentu."
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Vlastní RSS zdroj"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr "Zobrazit vlastní RSS zdroj distributorům a správcům domény"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr "Zobrazit vlastní RSS zdroj distributorům a správcům domény"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr "Zobrazit vlastní RSS zdroj distributorům a správcům domény"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Skrýt widget funkcí"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr "Skrýt widget funkcí pro distributory a správce domény"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Sekundární email"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Oznámení"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Adresy odesílatele"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Emailová adresa používaná k zasílání upozornění"
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Veřejné API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Povolit komunikaci"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Automaticky kontrolovat dostupnost nové verze"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Zkontrolovat verzi"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Příjemce"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Odoslat statistiky"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Zasílat statistické údaje na veřejné Modoboa API rozhraní (počítadla a "
"použité rozšíření)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Počet dnů pro neaktivní účet"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Počet dnů pro neaktivní účet"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1475,41 +1555,41 @@ msgstr ""
"Účet s datem posledního přihlášení starším než práh (ve dnech) bude "
"považován za neaktivní"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Interval aktualizací upozornění"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Interval mezi aktualizacemi upozornění na stránce (v sekundách)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Maximální stáří záznamu"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Maximální stáří záznamu ve dnech"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Položek na stránce"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Počet zobrazených položek na stránce"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Výchozí přesměrování aplikace"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"Výchozí přesměrování, které se použije, pokud není žádná aplikace "
"specifikována"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1518,18 +1598,42 @@ msgstr ""
"Hodnota USE_TZ je Vypnutá, toto může způsobit problémy při přechodu mezi "
"letním a zimním časem (např. stejný čas dvakrát během změny času)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Nastavte `USE_TZ = True` v settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Bežný uživatel"
@@ -1621,61 +1725,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Povolit přístup do poštovních schránek"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Povolit správci přístup do uživatelských poštovních schránek"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "heslo"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "jazyk"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Preferovaný jazyk pro zobrazení stránek"
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Telefonní číslo"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Sekundární email"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr "Alternativní e-mailová adresa, může být použita pro účely obnovy."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Nebylo možné změnit heslo: LDAP modul není instalován"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "účet"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Neznámý"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Nemůžete importvat účet s vyšším oprávněním, než máte vy sám"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "Běžný uživatel '%s' musí mít nastavenou platnou emailovou adresu"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2032,7 +2136,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr "IMAP migrace"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to IMAP server failed: {error}"
@@ -2065,24 +2169,24 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Povolit komunikaci s veřejným Modoboa API rozhraním"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "Nelze určit kódování textu."
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Přístup zamítnut: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Přístup zamítnut"
@@ -2881,13 +2985,13 @@ msgstr "Odmítnout zprávu"
msgid "Stop processing"
msgstr "Ukončit zpracování"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
#, fuzzy
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr "Spojení se serverem ManageSieve selhalo, zkontrolujte nastavení"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3239,7 +3343,7 @@ msgstr "Text podpisu"
msgid "User defined email signature"
msgstr "Emailový podpis uživatele"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to remove filter"
msgid "Failed to remove attachment: "
@@ -3249,7 +3353,7 @@ msgstr "Nebylo možné odstranit přílohu:"
msgid "Date"
msgstr "Datum"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Nebylo možné zjistit hierarchický oddělovač"
@@ -3279,6 +3383,3 @@ msgstr "Koš"
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr "Příloha je příliš velká (omezení: %s)"
-
-#~ msgid "Automatic reply timeout"
-#~ msgstr "Interval automatické odpovědi"
diff --git a/modoboa/locale/de/LC_MESSAGES/django.po b/modoboa/locale/de/LC_MESSAGES/django.po
index 45abc6893..603c591dc 100644
--- a/modoboa/locale/de/LC_MESSAGES/django.po
+++ b/modoboa/locale/de/LC_MESSAGES/django.po
@@ -44,7 +44,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2011-07-01 08:15+0000\n"
"Last-Translator: Daniel Schubert, 2024\n"
"Language-Team: German (http://app.transifex.com/tonio/modoboa/language/de/)\n"
@@ -54,7 +54,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -63,76 +63,76 @@ msgstr ""
"(Voreinstellung) oder GB angegeben werden. Der Wert 0 bedeutet keinen "
"Speicherplatz."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
"Standardkontingent in MB welches die Mailboxen erhalten. Der Wert 0 bedeutet "
"unlimitiertes Kontingent."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
#| msgid "An alias with this name already exists."
msgid "domain alias with this name already exists"
msgstr "Ein Alias mit diesem Namen existiert bereits."
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Kein autorisierter MX-Eintrag für diese Domain gefunden."
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "Kann nicht größer als Domain Kontingent sein"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Zugriff verweigert."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Dieses Feld ist erforderlich"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Liste der verwalteten Domains (nur für Reseller und Domain Administratoren)."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Nicht erlaubt für diese Rolle."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Muss mit mailbox full_address übereinstimmen"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Dieses Feld ist erforderlich"
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Lokale Domain {} existiert nicht."
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Eine Liste der Empfänger"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "Benutzer %s existiert bereits"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "Sie haben keinen Zugriff auf diese Domain."
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "Sie haben keinen Zugriff auf diese Mailbox."
@@ -140,56 +140,56 @@ msgstr "Sie haben keinen Zugriff auf diese Mailbox."
msgid "Here is your new Modoboa password: {}"
msgstr "Hier ist Ihr neues Modoboa Passwort: {}"
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "Verzeichnis für DKIM-Keys nicht konfiguriert."
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Ein unlimitiertes Kontingent ist nicht möglich."
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "Benutzer %s existiert bereits"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Muss eine positive Ganzzahl sein"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "openssl nicht gefunden, bitte sicherstellen, dass es installiert ist"
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Verzeichnis nicht gefunden."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr "Dieses Feld erlaubt nur gültige IP-Adressen (oder Netzwerke)"
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr "Bitte IMAP Migration deaktivieren bevor Sie diese Option deaktivieren."
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Mindestens ein authorisiertes Netzwerk/IP-Adresse muss definiert sein"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr "Zum Erstellen von Aliassen ist ein Postfach erforderlich."
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr "Unbekannter Status"
@@ -201,11 +201,11 @@ msgstr "Der Zugriff auf diese Domain ist Ihnen nicht gestattet"
msgid "You can't delete your own domain"
msgstr "Sie können Ihre eigene Domain nicht löschen"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr "Keine Alarm-ID gegeben"
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr "Ungültige Alarm-ID(s) erhalten"
@@ -495,12 +495,12 @@ msgstr "DNS Name ist zu lang: %s"
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Fehlerhaftes IP-Adressformat für {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Objekt existiert bereits: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d Objekte erfolgreich importiert"
@@ -654,7 +654,7 @@ msgid "Key length"
msgstr "Schlüssel-Länge"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Ungültige Zeile"
@@ -877,7 +877,7 @@ msgstr "Domain Administrator"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "Erlaubt dem Administrator auf Benutzer-Postfächer zuzugreifen"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Verschiedenes"
@@ -987,7 +987,7 @@ msgstr "2FA ist bereits aktiviert"
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr "Fehlgeschlagener Verbindungsversuch von '%s' als Benutzer '%s'"
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr "Ungültiges Passwort"
@@ -999,24 +999,24 @@ msgstr "2-Faktor-Authentifizierung ist nicht aktiviert"
msgid "Local"
msgstr "Lokal"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Benutzername"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Ungültiger Syntax"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Ungültige Zahl für Runden"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr "Dieser Code ist Falsch"
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
"Bitte benutze den folgenden Code um das Modoboa Passwort wiederherzustellen: "
@@ -1103,11 +1103,21 @@ msgstr "Zufällige Passwortlänge"
msgid "Length of randomly generated passwords."
msgstr "Länge von zufällig generierten Passwörtern"
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Länge von zufällig generierten Passwörtern"
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "Aktualisiere Passwort-Service-URL"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
@@ -1117,107 +1127,107 @@ msgstr ""
"Diese Einstellung trifft nur auf nicht lokale Benutzer zu, z.B: Benutzer die "
"nach erfolgreicher externer Authentifizierung angelegt wurden (LDAP, SMTP)."
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "Ankündigung zur Passwort-Wiederherstellung"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
"Eine temporäre Nachricht, die auf der Passwort-Wiederherstellungsseite "
"angezeigt wird."
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "Aktiviere die Passwortwiederherstellung per SMS"
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
"Aktiviere die Passwortwiederherstellung per SMS für Benutzer mit einer "
"Telefonnummer."
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "SMS Anbieter"
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr "Wähle einen Anbieter für das verschicken der Wiederherstellungs-SMS"
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr "LDAP"
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Server-Adresse"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "IP-Adresse oder Hostname des LDAP-Servers"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Server-Port"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Der TCP Port des LDAP-Servers"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "Aktiviere Ausfallsserver (Fallback)"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
"Aktiviere einen zweiten LDAP-Server, welcher verwendet wird, wenn der erste "
"nicht erreichbar ist"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "Ausfallsserver-Adresse"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "Die IP-Adresse oder den DNS-Namen des zweiten LDAP-Servers"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "Ausfallsserver-Port"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "Der TCP Port des sekundären LDAP-Servers"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Gesicherte Verbindung verwenden"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "SSL/TLS-Verbindung für Zugriff auf LDAP-Server verwenden"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Auswählen wenn der LDAP-Server ein Active Directory ist."
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Administrator-Gruppen"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1225,75 +1235,75 @@ msgstr ""
"Mitglieder dieser LDAP Posix-Gruppe werden als Domain-Administratoren "
"angelegt werden. Nutzen Sie ';', um Gruppen zu separieren."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Gruppentyp"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
"Der LDAP Gruppentyp welcher mit diesem Verzeichnis benutzt werden soll."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Gruppen Search Base"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "Der DN der Search Base mit der Gruppen gefunden werden"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Passwort-Attribut"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Das Attribut für Benutzerpasswörter"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "LDAP Authentifizierungseinstellungen"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Authentifizierungsmethode"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Wählen Sie die Authentifizierungsmethode"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Bind DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
"Der DN für einen Bind an den LDAP-Server. Nichts eingeben für anonymen Bind."
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Bind Passwort"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr "Das Passwort wenn mit dem Bind DN angemeldet wird."
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Benutzer Search Base"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "Der DN der Search Base mit der Benutzerkonten gefunden werden"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Suchfilter"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1301,11 +1311,11 @@ msgstr ""
"Ein optionaler Filter, z.B. '(objectClass=person)'. Der Filter muss "
"entsprechend der LDAP-Konvention in Klammern gesetzt werden."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Vorlage für User DN"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1314,26 +1324,26 @@ msgstr ""
"Die Vorlage für einen User DN. Sie sollte einen Platzhalter, z.B. %(user)s "
"enthalten."
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "LDAP Synchronisations Einstellungen"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "Export zu LDAP aktivieren"
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
"Automatische Synchronisation zwischen lokaler Datenbank und LDAP Verzeichnis "
"aktivieren"
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr "Remote LDAP Benutzer entfernen wenn lokaler Benutzer gelöscht wird"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
@@ -1341,11 +1351,11 @@ msgstr ""
"Remote LDAP Benutzer löschen wenn lokaler Benutzer gelöscht wird, ansonsten "
"wird der Benutzer deaktiviert."
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "Vorlage für User DN"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
@@ -1354,127 +1364,204 @@ msgstr ""
"Die Vorlage die verwendet wird um das User DN zu generieren. Es sollte "
"mindestens einen Platzhalter beinhalten (z.B. %(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "Import von LDAP aktivieren"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
"Automatische Kontensynchronisation vom LDAP Verzeichnis in die lokale "
"Datenbank aktivieren"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "Benutzernamenattribut"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr "Das LDAP-Attribut, in dem der Benutzername gefunden werden kann."
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Dovecot LDAP-Synchronisation aktivieren"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
"LDAP-Authentifizierungseinstellungen werden auf die Dovecot-Konfiguration "
"angewendet."
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Dovecot LDAP-Konfigurationsdatei"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr "Speicherort der Dovecot-Konfigurationsdatei für LDAP-Einstellungen."
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Dashboard"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom message"
+msgid "Custom welcome message"
+msgstr "Eigener Nachrichtentext"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+"Eine temporäre Nachricht, die auf der Passwort-Wiederherstellungsseite "
+"angezeigt wird."
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Benutzerdefinierter RSS Feed"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
"Zeige benutzerdefinierten RSS-Feed für Wiederverkäufer und Domain-"
"Administratoren."
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Zeige benutzerdefinierten RSS-Feed für Wiederverkäufer und Domain-"
+"Administratoren."
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Zeige benutzerdefinierten RSS-Feed für Wiederverkäufer und Domain-"
+"Administratoren."
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Verberge Funktionen Werkzeug"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
"Verberge Funktionen Werkzeug für Wiederverkäufer und Domain-Administratoren."
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Sekundäre E-Mail-Adresse"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Benachrichtigungen"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Absenderadresse"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "E-Mail Adresse für das Senden von Benachrichtigungen."
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Öffentliche API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Verbindung aktivieren"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Prüft automatisch ob eine neuere Version verfügbar ist."
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Prüfe auf neue Versionen"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "Sende eine Email wenn eine neue Version gefunden wurde"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
"Sende eine Email um die Administratoren über eine neue Version zu "
"benachrichtigen"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Empfänger"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "Empfänger für die Benachrichtigungsemail für eine neue Version"
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Sende Statistiken"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Statistiken über die Modoboa public API senden (Zähler und Nutzungs "
"Erweiterungen)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr "Verfolgung inaktiver Konten aktivieren"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
@@ -1483,11 +1570,11 @@ msgstr ""
"festzulegen, ab dem ein Konto als inaktiv gilt, wenn sich der Benutzer nicht "
"angemeldet hat."
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Schwellwert für inaktive Konten"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1495,39 +1582,39 @@ msgstr ""
"Ein Konto mit einem Datum des letzten Logins, das größer als dieser "
"Schwellenwert ist (in Tagen), wird als inaktiv betrachtet."
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Benachrichtigungs-Prüfintervall"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Intervall zwischen zwei Benachrichtigungsprüfungen (in Sekunden)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Maximales Alter für Log-Einträge"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Das maximale Alter eines Log-Eintrags (in Tagen)"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Einträge pro Seite"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Anzahl dargestellter Einträge pro Seite"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Standardumleitung"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr "Die Standardumleitung wenn kein Programm angegeben wurde"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1537,20 +1624,44 @@ msgstr ""
"zwischen Sommer- und Winterzeit führen (z.B. das Auftauchen derselben "
"lokalen Zeit zweimal aufgrund der Zeitumstellung)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Setze 'USE_TZ = True' in settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Update password scheme at login"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Aktualisiere das Passwortschema beim Anmelden"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Normaler Benutzer"
@@ -1642,63 +1753,63 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] Update(s) verfügbar"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Erlaube den Postfach-Zugriff"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Erlaubt dem Administrator auf Benutzer-Postfächer zuzugreifen"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "Passwort"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "Sprache"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Bevorzugte Anzeigesprache für Seiten."
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Telefonnummer"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Sekundäre E-Mail-Adresse"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
"Eine alternative E-Mail-Adresse welche Wiederherstellungszwecken dient."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Konnte Passwort nicht aktualisieren: LDAP-Modul nicht installiert"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "Konto"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Unbekannt"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
"Sie können kein Konto mit einer höheren Rolle als Ihrer eigenen importieren"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "Der normale Benutzer '%s' muss eine gültige E-Mail-Adresse besitzen"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2039,7 +2150,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr "IMAP-Migration"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to IMAP server failed: {error}"
@@ -2076,23 +2187,23 @@ msgstr "LDAP-Account konnte nicht gelöscht werden: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "LDAP-Account konnte nicht deaktiviert werden: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr "Die Kommunikation mit der öffentlichen API ist fehlgeschlagen: %s"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "Kodierung der Zeichenkette konnte nicht bestimmt werden"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Zugriff verweigert: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Zugriff verweigert"
@@ -2868,7 +2979,7 @@ msgstr "E-Mail ablehnen"
msgid "Stop processing"
msgstr "Stoppe Bearbeitung"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
#, fuzzy
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to MANAGESIEVE server failed, check your configuration"
@@ -2876,7 +2987,7 @@ msgstr ""
"Verbindung zu MANAGESIEVE-Server fehlgeschlagen. Überprüfen Sie Ihre "
"Konfiguration."
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3240,7 +3351,7 @@ msgstr "Signatur"
msgid "User defined email signature"
msgstr "Benutzerdefinierte E-Mail-Signatur"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to remove filter"
msgid "Failed to remove attachment: "
@@ -3250,7 +3361,7 @@ msgstr "Konnte Anhang nicht entfernen:"
msgid "Date"
msgstr "Datum"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Hierarchie-Trenner konnte nicht ermittelt werden"
diff --git a/modoboa/locale/de_DE/LC_MESSAGES/django.po b/modoboa/locale/de_DE/LC_MESSAGES/django.po
index 5032d0294..fc001d99f 100644
--- a/modoboa/locale/de_DE/LC_MESSAGES/django.po
+++ b/modoboa/locale/de_DE/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2011-07-01 08:15+0000\n"
"Last-Translator: bdaniel93, 2023\n"
"Language-Team: German (Germany) (http://www.transifex.com/tonio/modoboa/"
@@ -21,85 +21,85 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
#| msgid "Enter a valid email address."
msgid "domain alias with this name already exists"
msgstr "Geben Sie eine gültige E-Mail-Adresse ein."
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
#, fuzzy
#| msgid "Permission denied"
msgid "Permission denied."
msgstr "Zugriff verweigert"
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Dieses Feld ist erforderlich"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
#, fuzzy
#| msgid "Hide features widget for resellers and domain administrators"
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr "Funktionen-Widget für Reseller und Domain-Administratoren ausblenden"
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
#, fuzzy
#| msgid "This field is required"
msgid "This field is required."
msgstr "Dieses Feld ist erforderlich"
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "Enter a valid email address."
msgid "This alias already exists"
msgstr "Geben Sie eine gültige E-Mail-Adresse ein."
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -107,56 +107,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown tag {}"
msgid "Unknown status"
@@ -172,11 +172,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr "Sie können Ihr eigenes Konto nicht löschen"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -465,12 +465,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -640,7 +640,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Ungültige Zeile"
@@ -854,7 +854,7 @@ msgstr "Domain-Administrator"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "Gewähren Sie diesem Administrator Zugriff auf Benutzerpostfächer"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Verschiedenes"
@@ -961,7 +961,7 @@ msgstr "2FA ist bereits aktiviert"
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -975,24 +975,24 @@ msgstr "2FA ist nicht aktiviert"
msgid "Local"
msgstr "Lokal"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Benutzerprofil"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Ungültige Syntax"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Ungültige Anzahl Runden"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr "Dieser Code ist ungültig"
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
"Bitte verwenden Sie den folgenden Code, um Ihr Modoboa-Passwort "
@@ -1077,11 +1077,21 @@ msgstr "Zufällige Passwortlänge"
msgid "Length of randomly generated passwords."
msgstr "Länge der zufällig generierten Passwörter."
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Länge der zufällig generierten Passwörter."
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "URL des Kennwortdienstes aktualisieren"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
@@ -1091,109 +1101,109 @@ msgstr ""
"können. Betrifft nur nicht lokale Benutzer, die nach einer erfolgreichen "
"externen Authentifizierung (LDAP, SMTP) automatisch erstellt wurden."
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "Ankündigung zur Passwortwiederherstellung"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
"Eine temporäre Nachricht, die auf der Passwort-Wiederherstellungsseite "
"angezeigt wird."
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "Passwortwiederherstellung per SMS aktivieren"
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
"Aktiviere die Kennwortwiederherstellung per SMS für Benutzer, die eine "
"Telefonnummer angegeben haben."
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "SMS-Anbieter"
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
"Wählen Sie einen Anbieter für den Versand von SMS zur "
"Kennwortwiederherstellung"
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Serveradresse"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "IP-Adresse oder Hostname des LDAP-Servers"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Server Port"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Der TCP Port des LDAP-Servers"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "Aktiviere Ausfallserver (Fallback)"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
"Aktiviere einen zweiten LDAP-Server, welcher verwendet wird, wenn der erste "
"nicht erreichbar ist"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "Ausfallserver-Adresse"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "IP-Adresse oder Hostname des zweiten LDAP-Servers"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "Ausfallserver-Port"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "Der TCP Port des zweiten LDAP-Servers"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Verwende eine gesicherte Verbindung"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "SSL/TLS-Verbindung für Zugriff auf LDAP-Server verwenden"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Auswählen, wenn der LDAP-Server ein Active Directory ist."
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Administratorgruppen"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1201,49 +1211,49 @@ msgstr ""
"Mitglieder dieser LDAP-POSIX-Gruppen werden als Domänenadministratoren "
"erstellt. Nutze ';' um Gruppen zu trennen."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Gruppentyp"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "Der LDAP-Gruppentyp, der mit Ihrem Verzeichnis verwendet werden soll."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Suchbasis für Gruppen"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
"Der Distinguished Name der Suchbasis, die zum Suchen von Gruppen verwendet "
"wird"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Kennwortattribut"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Das Attribut, das zum Speichern von Benutzerpasswörtern verwendet wird"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "LDAP-Authentifizierungseinstellungen"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Authentifizierungsmethode"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Wählen Sie die Authentifizierungsmethode"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Bind DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1251,31 +1261,31 @@ msgstr ""
"Der Distinguished Name, der beim Binden an den LDAP-Server verwendet werden "
"soll. Für eine anonyme Bindung leer lassen"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Bind Passwort"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"Das Kennwort, das beim Binden an den LDAP-Server verwendet werden soll (mit "
"'Bind DN')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Suchbasis für Benutzer"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
"Der Distinguished Name der Suchbasis, die zum Suchen von Benutzern verwendet "
"wird"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Suchfilter"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1283,11 +1293,11 @@ msgstr ""
"Ein optionaler Filter (z.B. '(objectClass=person)'). Der Filter muss "
"entsprechend der LDAP-Konvention in Klammern gesetzt werden."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Benutzer-DN-Vorlage"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1296,26 +1306,26 @@ msgstr ""
"Die Vorlage, die verwendet wird, um den DN eines Benutzers zu erstellen. Es "
"sollte einen Platzhalter enthalten (z. B. %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "LDAP-Synchronisationseinstellungen"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "Export zu LDAP aktivieren"
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
"Automatische Synchronisierung zwischen lokaler Datenbank und LDAP-"
"Verzeichnis aktivieren"
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr "Remote-LDAP-Konto löschen, wenn lokales Konto gelöscht wird"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
@@ -1323,11 +1333,11 @@ msgstr ""
"Remote-LDAP-Konto löschen, wenn lokales Konto gelöscht wird, ansonsten wird "
"es deaktiviert."
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "Konto-DN-Vorlage"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
@@ -1336,136 +1346,211 @@ msgstr ""
"Die Vorlage, die verwendet wird, um den DN eines Kontos zu erstellen. Es "
"sollte einen Platzhalter enthalten (z. B. %(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "Import von LDAP aktivieren"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
"Kontosynchronisierung vom LDAP-Verzeichnis zur lokalen Datenbank aktivieren"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "Benutzername-Attribut"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr "Das LDAP-Attribut, in dem der Benutzername gefunden werden kann."
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Dovecot LDAP-Synchronisation aktivieren"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
"LDAP-Authentifizierungseinstellungen werden auf die Dovecot-Konfiguration "
"angewendet."
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Dovecot LDAP-Konfigurationsdatei"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
"Speicherort der Konfigurationsdatei, die Dovecot-LDAP-Einstellungen enthält."
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Dashboard"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "spam messages"
+msgid "Custom welcome message"
+msgstr "Spam E-Mails"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+"Eine temporäre Nachricht, die auf der Passwort-Wiederherstellungsseite "
+"angezeigt wird."
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Benutzerdefinierter RSS-Feed"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
"Anzeige benutzerdefinierter RSS-Feeds für Reseller und Domain-Administratoren"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Anzeige benutzerdefinierter RSS-Feeds für Reseller und Domain-Administratoren"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Anzeige benutzerdefinierter RSS-Feeds für Reseller und Domain-Administratoren"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Funktionen-Widget ausblenden"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr "Funktionen-Widget für Reseller und Domain-Administratoren ausblenden"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Sekundäre E-Mail-Adresse"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Benachrichtigungen"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Absenderadresse"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "E-Mail-Adresse, die zum Senden von Benachrichtigungen verwendet wird."
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Öffentliche API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Verbindung aktivieren"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Prüft automatisch, ob eine neuere Version verfügbar ist"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Prüfe auf neue Versionen"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "Sende eine E-Mail, wenn eine neue Version gefunden wurde"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
"Sendet eine E-Mail, um Administratoren über neue Versionen zu benachrichtigen"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Empfänger"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "Empfänger von Benachrichtigungs-E-Mails über neue Version."
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Sende Statistiken"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Sendet Statistiken an die öffentliche API von Modoboa (Zähler und verwendete "
"Erweiterungen)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Schwellwert für inaktive Konten"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Schwellwert für inaktive Konten"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1473,41 +1558,41 @@ msgstr ""
"Ein Konto mit einem letzten Login-Datum über diesem Schwellenwert (in Tagen) "
"wird als inaktiv betrachtet"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Prüfintervall für Benachrichtigungen"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Intervall zwischen zwei Benachrichtigungsprüfungen (in Sekunden)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Maximales Alter eines Log-Eintrags"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Das maximale Alter eines Protokollsatzes in Tagen"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Einträge pro Seite"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Anzahl der angezeigten Einträge pro Seite"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Standardumleitung"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"Die Standardumleitung, die verwendet wird, wenn keine Anwendung angegeben "
"wurde"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1517,20 +1602,44 @@ msgstr ""
"zwischen Sommer- und Winterzeit führen (z. B. das Auftauchen derselben "
"lokalen Zeit zweimal aufgrund der Zeitumstellung)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Setze 'USE_TZ = True' in settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Update password scheme at login"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Passwort-Schema beim Login updaten"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Normaler Benutzer"
@@ -1622,65 +1731,65 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] Update(s) verfügbar"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Postfachzugriff zulassen"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Gewähren Sie diesem Administrator Zugriff auf Benutzerpostfächer"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "Passwort"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "Sprache"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Bevorzugte Anzeigesprache für Seiten."
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Telefonnummer"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Sekundäre E-Mail-Adresse"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
"Eine alternative E-Mail-Adresse kann für die Wiederherstellung verwendet "
"werden."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr ""
"Kennwort konnte nicht aktualisiert werden: LDAP-Modul nicht installiert"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "Konto"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Unbekannt"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
"Sie können kein Konto mit einer höheren Rolle als Ihrer eigenen importieren"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "Der normale Benutzer '%s' muss eine gültige E-Mail-Adresse besitzen"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2033,7 +2142,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr "Automatische Konfiguration"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -2065,24 +2174,24 @@ msgstr "Fehler beim Löschen des LDAP-Kontos: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "Fehler beim Deaktivieren des LDAP-Kontos: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Aktivieren Sie die Kommunikation mit der öffentlichen API von Modoboa"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "Codierung der Zeichenkette konnte nicht bestimmt werden"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Zugriff verweigert: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Zugriff verweigert"
@@ -2838,11 +2947,11 @@ msgstr "Abgewiesene Nachrichten"
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -3199,7 +3308,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to create LDAP account: {}"
msgid "Failed to remove attachment: "
@@ -3209,7 +3318,7 @@ msgstr "LDAP-Konto konnte nicht erstellt werden: {}"
msgid "Date"
msgstr "Datum"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/el_GR/LC_MESSAGES/django.po b/modoboa/locale/el_GR/LC_MESSAGES/django.po
index 2e633bd5e..07540a976 100644
--- a/modoboa/locale/el_GR/LC_MESSAGES/django.po
+++ b/modoboa/locale/el_GR/LC_MESSAGES/django.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2017-10-12 19:37+0000\n"
"Last-Translator: Kostas Moumouris \n"
"Language-Team: Greek (Greece) (http://www.transifex.com/tonio/modoboa/"
@@ -20,7 +20,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -31,78 +31,78 @@ msgstr ""
"Προκαθορισμένο quota σε MB που εφαρμόζεται στα γραμματοκιβώτια. Μια τιμή 0 "
"σημαίνει ότι δεν υπάρχει quota. "
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
"Προκαθορισμένο quota σε MB που εφαρμόζεται στα γραμματοκιβώτια. Μια τιμή 0 "
"σημαίνει ότι δεν υπάρχει quota. "
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
msgid "domain alias with this name already exists"
msgstr "Υπάρχει είδη αυτό το ψευδώνυμο"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Δεν υπάρχουν ΜΧ έγραφες για αυτό το domain "
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "Δεν μπορεί να είναι μεγαλύτερο από το domain quota."
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Η άδεια απορρίφθηκε."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Αυτό το πεδίο είναι υποχρεωτικό"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Λίστα διαχειριζόμενων domains (αφορά μόνο μεταπωλητές και διαχειριστές "
"domain)"
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Δεν επιτρέπεται για αυτόν τον ρόλο."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Πρέπει να είναι ίσο με την full_address του γραμματοκιβωτίου"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Αυτό το πεδίο απαιτείτε."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Το τοπικός domain {} δεν υπάρχει"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Λίστα παραληπτών"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "Ο χρήστης '%s' υπάρχει ήδη"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "Δεν έχετε πρόσβαση σε αυτό το domain"
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -112,60 +112,60 @@ msgstr "Δεν έχετε πρόσβαση σε αυτό το domain"
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Δεν μπορείτε να ορίσετε ένα απεριόριστο quota."
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "Ο χρήστης '%s' υπάρχει ήδη"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Πρέπει να είναι θετικός ακέραιος"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
#, fuzzy
#| msgid "Domain not found."
msgid "Directory not found."
msgstr "To domain δεν βρέθηκε."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Ορίστε τουλάχιστον μια εξουσιοδοτημένη διεύθυνση / δίκτυο"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
#, fuzzy
#| msgid "A mailbox is required"
msgid "A mailbox is required to create aliases."
msgstr "Απαιτείται γραμματοκιβώτιο"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown"
msgid "Unknown status"
@@ -179,11 +179,11 @@ msgstr "Δεν έχετε πρόσβαση σε αυτό το domain"
msgid "You can't delete your own domain"
msgstr "Δεν μπορείτε να σβήσετε το δικό σας domain"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -492,12 +492,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Μη έγκυρη τιμή quota για το domain '{}'"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Το αντικείμενο υπάρχει ήδη: %s'"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d αντικείμενα εισήχθησαν με επιτυχία"
@@ -654,7 +654,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Λάθος γραμμή"
@@ -902,7 +902,7 @@ msgstr ""
"Να επιτρέπεται σε αυτόν τον διαχειριστή η πρόσβαση στα γραμματοκιβώτια "
"χρηστών"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Διάφορα"
@@ -1013,7 +1013,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -1027,24 +1027,24 @@ msgstr ""
msgid "Local"
msgstr "Τοπικός"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Προφίλ Χρήστη"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Μη έγκυρη σύνταξη"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Λάθος αριθμός επαναλήψεων "
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -1131,124 +1131,134 @@ msgstr "Μήκος τυχαίου κωδικού"
msgid "Length of randomly generated passwords."
msgstr "Μήκος των τυχαίων δημιουργημένων κωδικών"
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Μήκος των τυχαίων δημιουργημένων κωδικών"
+
+#: core/app_settings.py:114
#, fuzzy
#| msgid "Default password scheme"
msgid "Update password service URL"
msgstr "Προεπιλεγμένος αλγόριθμος κωδικοποίησης"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Διεύθυνση εξυπηρετητή"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "Η IP διεύθυνση ή το DNS όνομα του εξυπηρετητή LDAP"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Πόρτα εξυπηρετητή"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Η TCP πόρτα λειτουργίας του εξυπηρετητή LDAP"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
#, fuzzy
#| msgid "Server address"
msgid "Secondary server address"
msgstr "Διεύθυνση εξυπηρετητή"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
#, fuzzy
#| msgid "The IP address or the DNS name of the LDAP server"
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "Η IP διεύθυνση ή το DNS όνομα του εξυπηρετητή LDAP"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
#, fuzzy
#| msgid "Server port"
msgid "Secondary server port"
msgstr "Πόρτα εξυπηρετητή"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
#, fuzzy
#| msgid "The TCP port number used by the LDAP server"
msgid "The TCP port number used by the LDAP secondary server"
msgstr "Η TCP πόρτα λειτουργίας του εξυπηρετητή LDAP"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Χρήση ασφαλής σύνδεσης"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
"Χρησιμοποιήστε μια σύνδεση SSL / STARTTLS για να συνδεθήκατε στον διακομιστή "
"LDAP"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Ο εξυπηρετητής LDAP είναι Active Directory"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Groups Διαχειριστών"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1256,49 +1266,49 @@ msgstr ""
"Τα μέλη αυτών των LDAP Posix ομάδων χρηστών θα δημιουργηθούν ως διαχειριστές "
"domain. Χρησιμοποιείστε τον χαραχτήρα ';' για να ξεχωρίσετε τις ομάδες."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Τύπος ομάδας"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "Τύπος ομάδας LDAP που χρησιμοποιείται με τον κατάλογο σας."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Base αναζήτησης ομάδων χρηστών"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "Το Base DN αναζήτησης ομάδων χρηστών"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Το πεδίο του κωδικού"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Το πεδίο αποθήκευσης των κωδικών χρηστών"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
#, fuzzy
#| msgid "Authentication method"
msgid "LDAP authentication settings"
msgstr "Μέθοδος Πιστοποίησης"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Μέθοδος Πιστοποίησης"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Επιλογή μεθόδου πιστοποίησης"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Bind DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1306,28 +1316,28 @@ msgstr ""
"To distinguished name για το bind στον εξυπηρετητή LDAP. Αφήστε το κενό για "
"anonymous"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Bind κωδικός "
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"Ο κωδικός για το bind στον εξυπηρετητή LDAP (αντιστοιχεί στο 'Bind DN')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Base αναζήτησης χρηστών"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "Το Base DN αναζήτησης χρηστών"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Φίλτρο αναζήτησης"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1335,11 +1345,11 @@ msgstr ""
"Προαιρετικό φίλτρο (π.χ. '(objectClass=person)'). Για να είναι έγκυρο πρέπει "
"να περικλείεται σε παρενθέσεις."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Πρότυπο για DN χρηστών"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1348,38 +1358,38 @@ msgstr ""
"Το πρότυπο δημιουργίας DN χρηστών. Θα πρέπει να περιλαμβάνει έναν "
"placeholder (π.χ. %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
#, fuzzy
#| msgid "LDAP settings"
msgid "LDAP synchronization settings"
msgstr "Ρυθμίσεις LDAP"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
#, fuzzy
#| msgid "User DN template"
msgid "Account DN template"
msgstr "Πρότυπο για DN χρηστών"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, fuzzy, python-format
#| msgid ""
#| "The template used to construct a user's DN. It should contain one "
@@ -1391,197 +1401,293 @@ msgstr ""
"Το πρότυπο δημιουργίας DN χρηστών. Θα πρέπει να περιλαμβάνει έναν "
"placeholder (π.χ. %(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
#, fuzzy
#| msgid "Password attribute"
msgid "Username attribute"
msgstr "Το πεδίο του κωδικού"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
#, fuzzy
#| msgid "Enable communication"
msgid "Enable Dovecot LDAP sync"
msgstr "Ενεργοποίηση επικοινωνίας"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Ταμπλό Συντομεύσεων"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom message"
+msgid "Custom welcome message"
+msgstr "Προσαρμοσμένο μήνυμα"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid "A custom message that will appear at the end of documents"
+msgid "A welcome message that will be displayed instead the default one"
+msgstr "Ένα προσαρμοσμένο μήνυμα που θα εμφανιστεί στο τέλος των εγγράφων"
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Κατά παραγγελία RSS feed"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
"Προβολή κατά παραγγελία RSS feed για μεταπωλητές και διαχειριστές τομέα"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Προβολή κατά παραγγελία RSS feed για μεταπωλητές και διαχειριστές τομέα"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Προβολή κατά παραγγελία RSS feed για μεταπωλητές και διαχειριστές τομέα"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Κρύβω τις λειτουργίες από τα widget"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
"Κρύβω τις λειτουργίες από τα widget για τους μεταπωλητές και τους "
"διαχειριστές του τομέα"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Δευτερεύον email"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Υπενθύμιση "
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Διεύθυνση αποστολέα"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Email διεύθυνση που χρησιμοποιείται για την αποστολή υπενθυμίσεων "
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Δημόσιο API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Ενεργοποίηση επικοινωνίας"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Αυτόματος έλεγχος διαθέσιμων ενημερώσεων"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Έλεγχος ενημερώσεων"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Παραλήπτης"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Αποστολή στατιστικών"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Αποστολή στατιστικών στο public API του Motaboa (counters και used "
"extensions)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Όριο απενεργοποιημένων λογαριασμών "
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Όριο απενεργοποιημένων λογαριασμών "
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr "Όριο (σε ημέρες) για να απενεργοποιηθεί ένας Λογαριασμός."
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Μέγιστο διάστημα ελέγχου ειδοποιήσεων"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Διάστημα μεταξύ των δύο πρώτων ελέγχων ειδοποιήσεων (σε δευτερόλεπτα)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Μέγιστος χρόνος καταγραφής των log"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Μέγιστη διάρκεια σε ημέρες καταγραφής των log"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Εμφανίσεις ανά σελίδα"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Αριθμός εμφανίσεων ανά σελίδα"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Κύριες προκαθορισμένες αναδρομολογήσεις"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"Προκαθορισμένες αναδρομολογήσεις που χρησιμοποιούνται όταν δεν υπάρχουν "
"προκαθορισμένες εφαρμογές"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Default password scheme"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Προεπιλεγμένος αλγόριθμος κωδικοποίησης"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Απλός χρήστης"
@@ -1679,67 +1785,67 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "Υπάρχουν διαθέσιμες ενημερώσεις"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Να επιτρέπεται η πρόσβαση σε γραμματοκιβώτια"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
"Να επιτρέπεται σε αυτόν τον διαχειριστή η πρόσβαση στα γραμματοκιβώτια "
"χρηστών"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "κωδικός"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "Γλώσσα "
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Επιλογή γλώσσας για την εμφάνιση σελίδων."
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Τηλέφωνο"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Δευτερεύον email"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
"Μια εναλλακτική e-mail διεύθυνση, μπορεί να χρησιμοποιηθεί για λόγους "
"ανάκτησης."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr ""
"Σφάλμα κατά την ενημέρωση του κωδικού: το LDAP module δεν είναι εγκατεστημένο"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "λογαριασμός"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Άγνωστη"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
"Δεν μπορείτε να εισάγετε έναν λογαριασμό με ρόλο μεγαλύτερο από τον δικό σας"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "Ο απλός χρήστης '%s' πρέπει να έχει μια έγκυρη email διεύθυνση"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2093,7 +2199,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr "Μετάβαση IMAP"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to IMAP server failed: {error}"
@@ -2126,24 +2232,24 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Ενεργοποίηση επικοινωνίας με δημόσιο API του Modaboa"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Δεν επιτρέπεται η πρόσβαση: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Δεν επιτρέπεται η πρόσβαση"
@@ -2935,14 +3041,14 @@ msgstr "Απόρριψη μηνύματος"
msgid "Stop processing"
msgstr "Ακύρωση επεξεργασίας"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
#, fuzzy
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
"Η σύνδεση με τον εξυπηρετητή MANAGESIEVE απέτυχε, ελέγξτε τις ρυθμίσεις σας "
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3300,7 +3406,7 @@ msgstr "Κείμενο υπογραφής"
msgid "User defined email signature"
msgstr "Προεπιλεγμένη υπογραφή χρήστη"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to remove filter"
msgid "Failed to remove attachment: "
@@ -3310,7 +3416,7 @@ msgstr "Σφάλμα κατά την αφαίρεση του συνημμένο
msgid "Date"
msgstr "Ημερομηνία"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr " Αποτυχία κατά την ανάκτηση της οροθετημένης ιεραρχίας "
@@ -3340,6 +3446,3 @@ msgstr "Σκουπιδοτενεκές"
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr "Το συνημμένο είναι πολύ μεγάλο (όριο: %s)"
-
-#~ msgid "Automatic reply timeout"
-#~ msgstr "Χρονικό όριο λήξης αυτόματης απάντησης"
diff --git a/modoboa/locale/en/LC_MESSAGES/django.po b/modoboa/locale/en/LC_MESSAGES/django.po
index 0969f4824..fa90a7f09 100644
--- a/modoboa/locale/en/LC_MESSAGES/django.po
+++ b/modoboa/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -17,75 +17,75 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -93,56 +93,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -154,11 +154,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -423,12 +423,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -577,7 +577,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -773,7 +773,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -874,7 +874,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -886,24 +886,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -978,410 +978,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1473,59 +1565,59 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr ""
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1852,7 +1944,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1884,21 +1976,21 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2586,11 +2678,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2892,7 +2984,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr ""
@@ -2900,7 +2992,7 @@ msgstr ""
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/es/LC_MESSAGES/django.po b/modoboa/locale/es/LC_MESSAGES/django.po
index 1cef4eb81..ef13bcb13 100644
--- a/modoboa/locale/es/LC_MESSAGES/django.po
+++ b/modoboa/locale/es/LC_MESSAGES/django.po
@@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2020-05-06 11:16+0000\n"
"Last-Translator: Antoine Nguyen \n"
"Language-Team: Spanish (http://www.transifex.com/tonio/modoboa/language/"
@@ -27,7 +27,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -37,79 +37,79 @@ msgid ""
msgstr ""
"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
msgid "domain alias with this name already exists"
msgstr "Ya existe un alias con este nombre"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
#, fuzzy
#| msgid "No MX record found for this domain."
msgid "No authorized MX record found for this domain"
msgstr "No se encontró ningún registro MX para este dominio."
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "No puede superar la cuota de dominio"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Permiso denegado."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Este campo es obligatorio"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Lista de dominios administrados (sólo distribuidores y administradores de "
"dominio)."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "No estás autorizado para esta función."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Debe ser igual a la dirección completa del buzón"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Este campo es obligatorio."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "El dominio local {} no existe"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Lista de destinatarios"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "El usuario '%s' ya existe"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "No tienes acceso a este dominio"
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -119,60 +119,60 @@ msgstr "No tienes acceso a este dominio"
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "No puede definir una cuota ilimitada."
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "El usuario '%s' ya existe"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Debe ser un entero positivo"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
#, fuzzy
#| msgid "Domain not found."
msgid "Directory not found."
msgstr "Dominio no encontrado."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
#, fuzzy
#| msgid "A mailbox is required"
msgid "A mailbox is required to create aliases."
msgstr "Es obligatorio un buzón"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown"
msgid "Unknown status"
@@ -186,11 +186,11 @@ msgstr "No tienes acceso a este dominio"
msgid "You can't delete your own domain"
msgstr "No puedo eliminar su propio dominio"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -493,12 +493,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Cuota inválida para dominio '{}'"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "El objeto ya existe: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d objetos importados con éxito"
@@ -655,7 +655,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Línea inválida"
@@ -896,7 +896,7 @@ msgstr "Administrador del dominio"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "Permitir a este administrador acceso al buzon de los usuarios"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Otros"
@@ -1005,7 +1005,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -1019,24 +1019,24 @@ msgstr ""
msgid "Local"
msgstr "Local"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Perfil de usuario"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Sintaxis inválida"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Número de rondas inváldo"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -1121,112 +1121,122 @@ msgstr "Longitud de contraseña aleatoria"
msgid "Length of randomly generated passwords."
msgstr "Longitud de las contraseñas generadas aleatoriamente."
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Longitud de las contraseñas generadas aleatoriamente."
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Dirección del servidor"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "La dirección IP del servidor de nombres (DNS) del servidor LDAP"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Puerto del servidor"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Número de puerto TCP usado por el servidor LDAP"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Usa una conexión segura"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Usa una conexión SSL/STARTTLS para acceder al servidor LDAP"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Directorio Activo"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Decir si el servidor de LDAP es uno del tipo Directorio Activo"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Administrador de grupos"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1234,47 +1244,47 @@ msgstr ""
"Los miembros de esos grupos Posix LDAP serán creados como administradores de "
"dominio. Use caracteres \";\" para separar los grupos."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Tipo de grupo"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "El tipo de LDAP para usar en el directorio"
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Base para la búsqueda de grupos"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "El distinguido nombre de la búsqueda base usada para encontrar grupos"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Atributo de la contraseña"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "El atributo usado para guardar las contraseñas del usuario"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Método de autenticación"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Elegir el método de autenticación a usar"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Unir a DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1282,29 +1292,29 @@ msgstr ""
"El nombre distinguido a usar cuando nos unimos al servidor LDAP. Dejar vació "
"para una unión anónima"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Unir contraseña"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"La contraseña a usar cuando nos unimos al servidor LDAP (con 'Unir a DN')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Base para la búsqueda de usuarios"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
"El distinguido nombre de la búsqueda base usada para encontrar usuarios"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Filtro de búsqueda"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1312,11 +1322,11 @@ msgstr ""
"Una cadena de filtro opcional (p.e. '(objectClass=person)'). Para que sea "
"válido tiene que ser encerrado entre paréntesis."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Plantilla DN del usuario"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1325,168 +1335,240 @@ msgstr ""
"La plantilla usada para contriunr un DN de usuario. Debería contener una "
"cadena reemplazables (p.e. %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Panel de Control"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "spam messages"
+msgid "Custom welcome message"
+msgstr "Mensajes Basura"
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Agregación RSS personalizada"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
"Mostrar una fuente de agregación RSS personalizada a revendedores y "
"administradores de dominio"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Mostrar una fuente de agregación RSS personalizada a revendedores y "
+"administradores de dominio"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Mostrar una fuente de agregación RSS personalizada a revendedores y "
+"administradores de dominio"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Ocultar widget de características"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
"Ocultar el widget de características a revendedores y administradores de "
"dominio"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Email secundario"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Notificaciones"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Dirección del remitente"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Dirección de email usada para mandar notificaciones"
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "API pública"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Establecer comunicación"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Verificar automáticamente si hay una nueva versión disponible"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Comprobar nuevas versiones"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Destinatario"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Enviar estadísticas"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Enviar estadísticas a la API pública de Modoboa (contadores y extensiones "
"usadas)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Límite para cuentas inactivas"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Límite para cuentas inactivas"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1494,40 +1576,40 @@ msgstr ""
"Una cuenta inactiva con una fecha de inicio de sesión previa a este límite "
"(en días) se considerará como cuenta inactiva"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Intervalo de tiempo para notificaciones superiores"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Intervalo entre dos notificaciones superiores (en segundos)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Máximo tiempo de almacenamiento del log"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "El tiempo máximo de almacenamiento del log en días"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Items por página"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Número de elementos mostrado por página"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Redirección principal por defecto"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"La redirección que será usada cuando ninguna aplicación sea especificada."
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1537,18 +1619,42 @@ msgstr ""
"entre los horarios de verano e invierno (p.ej., que la misma hora exista dos "
"veces debido a cambios del reloj)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Ajuste `USE_TZ = True` en settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Usuario normal"
@@ -1640,61 +1746,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Permitir acceso al buzón"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Permitir a este administrador acceso al buzon de los usuarios"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "contraseña"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "idioma"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Idioma preferido para mostrar las páginas"
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Numero de telefono "
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Email secundario"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr "Email alternativo, puede ser usado para recuperación."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Falló al actualizar la contraseña: módulo LDAP no instalado"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "cuenta"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Desconocido"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "No puede importar una cuenta con un rol mayor que el suyo"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "El usuario normal '%s' debe tener una dirección de email válida"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2046,7 +2152,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to IMAP server failed: {error}"
@@ -2079,24 +2185,24 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Establecer comunicación con la API publica de Modoboa"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "No es posible determinar la codificación de la cadena"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Permiso denegado: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Permiso denegado"
@@ -2884,11 +2990,11 @@ msgstr "Bloquear mensaje"
msgid "Stop processing"
msgstr "Detener procesamiento"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr "La conexión al servidor MANAGESIEVE falló, verifique su configuración."
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3248,7 +3354,7 @@ msgstr "Texto de la firma"
msgid "User defined email signature"
msgstr "Firma de correo definida por el usuario"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to remove filter"
msgid "Failed to remove attachment: "
@@ -3258,7 +3364,7 @@ msgstr "Fallo al eliminar el adjunto:"
msgid "Date"
msgstr "Fecha"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Fallo al recuperar el delimitador jerárquico"
@@ -3288,6 +3394,3 @@ msgstr ""
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr "EL adjunto es demasiado grande (límite: %s)"
-
-#~ msgid "Automatic reply timeout"
-#~ msgstr "Tiempo de caducidad de respuestas automáticas"
diff --git a/modoboa/locale/es_MX/LC_MESSAGES/django.po b/modoboa/locale/es_MX/LC_MESSAGES/django.po
index a60f00f3c..78b7e4b7d 100644
--- a/modoboa/locale/es_MX/LC_MESSAGES/django.po
+++ b/modoboa/locale/es_MX/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,75 +18,75 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -94,56 +94,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -155,11 +155,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -424,12 +424,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -578,7 +578,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -774,7 +774,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -875,7 +875,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -887,24 +887,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -979,410 +979,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1474,59 +1566,59 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr ""
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1853,7 +1945,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1885,21 +1977,21 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2587,11 +2679,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2893,7 +2985,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr ""
@@ -2901,7 +2993,7 @@ msgstr ""
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/fi/LC_MESSAGES/django.po b/modoboa/locale/fi/LC_MESSAGES/django.po
index fe5cf7951..07f43b622 100644
--- a/modoboa/locale/fi/LC_MESSAGES/django.po
+++ b/modoboa/locale/fi/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2023-02-17 22:03+0200\n"
"Last-Translator: Ossi Mäntylahti \n"
"Language-Team: \n"
@@ -18,7 +18,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.2.2\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -27,76 +27,76 @@ msgstr ""
"megatavuina (MB) (oletus) tai gigatavuina (GB). Arvo 0 tarkoittaa, ettei "
"kiintiötä ole."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
"Postilaatikoihin sovellettava oletuskiintiö megatavuina. Arvo 0 tarkoittaa, "
"ettei kiintiötä ole."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
msgid "domain alias with this name already exists"
msgstr "Alias tällä nimellä on jo olemassa"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Tälle verkkotunnukselle ei löytynyt valtuutettua MX-tietuetta"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "Ei voi olla suurempi kuin verkkotunnuksen kiintiö"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Lupa evätty."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Tämä kenttä on pakollinen"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Luettelo hallinnoiduista verkkotunnuksista (vain jälleenmyyjät ja "
"verkkotunnusten ylläpitäjät)."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Ei sallittu tässä roolissa."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Täytyy olla yhtä suuri kuin postilaatikon koko osoite"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Tämä kenttä on pakollinen."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Paikallista verkkotunnusta {} ei ole olemassa"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Luettelo vastaanottajista"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "Käyttäjä '%s' on jo olemassa"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "Sinulla ei ole pääsyä tähän verkkotunnukseen."
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "Sinulla ei ole pääsyä tähän postilaatikkoon."
@@ -104,58 +104,58 @@ msgstr "Sinulla ei ole pääsyä tähän postilaatikkoon."
msgid "Here is your new Modoboa password: {}"
msgstr "Tässä on uusi Modoboa-salasanasi: {}"
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "DKIM-avainten tallennushakemistoa ei ole määritetty"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Et voi määritellä rajoittamatonta kiintiötä."
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "Käyttäjä '%s' on jo olemassa"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Täytyy olla positiivinen kokonaisluku"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "openssl ei löydy, varmista, että se on asennettu."
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Hakemistoa ei löydy."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Määritä vähintään yksi valtuutettu verkko/osoite"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
#, fuzzy
#| msgid "A mailbox is required"
msgid "A mailbox is required to create aliases."
msgstr "Tarvitaan postilaatikko"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown tag {}"
msgid "Unknown status"
@@ -169,11 +169,11 @@ msgstr "Sinulla ei ole pääsyä tähän verkkotunnukseen"
msgid "You can't delete your own domain"
msgstr "Et voi poistaa omaa verkkotunnustasi"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -472,12 +472,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Virheellinen IP-osoiteformaatti {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Kohde on jo olemassa: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d objektit tuotu onnistuneesti"
@@ -631,7 +631,7 @@ msgid "Key length"
msgstr "Avaimen pituus"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Virheellinen rivi"
@@ -862,7 +862,7 @@ msgstr "Luo verkkotunnuksen ylläpitäjä"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "Salli tämän järjestelmänvalvojan pääsy käyttäjien postilaatikoihin"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Sekalaiset"
@@ -971,7 +971,7 @@ msgstr "Kaksivaiheinen tunnistus (2FA) on jo käytössä"
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -985,24 +985,24 @@ msgstr "Kaksivaiheinen tunnistautuminen (2FA) ei ole käytössä"
msgid "Local"
msgstr "Paikallinen"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Käyttäjäprofiili"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Virheellinen syntaksi"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Virheellinen kierrosluku"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr "Tämä koodi on virheellinen"
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr "Käytä seuraavaa koodia saadaksesi takaisin Modoboa-salasanasi: {}"
@@ -1087,11 +1087,21 @@ msgstr "Satunnaisen salasanan pituus"
msgid "Length of randomly generated passwords."
msgstr "Satunnaisesti luotujen salasanojen pituus."
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Satunnaisesti luotujen salasanojen pituus."
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "Päivitä salasanapalvelun URL-osoite"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
@@ -1101,106 +1111,106 @@ msgstr ""
"Koskee vain muita kuin paikallisia käyttäjiä. Eli niitä, jotka luodaan "
"automaattisesti onnistuneen ulkoisen todennuksen jälkeen (LDAP, SMTP)."
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "Ilmoitus salasanan palautuksesta"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr "Väliaikainen viesti, joka näytetään salasanan nollaussivulla."
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "Ota salasanan palautus käyttöön tekstiviestillä"
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
"Ota käyttöön salasanan palautus tekstiviestillä käyttäjille, jotka ovat "
"täyttäneet puhelinnumeron."
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "SMS-palveluntarjoaja"
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
"Valitse palveluntarjoaja, joka lähettää salasanan palautustekstiviestin"
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Palvelimen osoite"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "LDAP-palvelimen IP-osoite tai DNS-nimi"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Palvelimen portti"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "LDAP-palvelimen käyttämän TCP-portin numero"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "Toisen palvelimen käyttöönotto (varapalvelin)"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
"Ota käyttöön toissijainen LDAP-palvelin, jota käytetään, jos ensisijainen "
"palvelin ei toimi"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "Toisen palvelimen osoite"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "Toisen LDAP-palvelimen IP-osoite tai DNS-nimi"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "Toisen palvelimen portti"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "LDAP:n toissijaisen palvelimen käyttämä TCP-portin numero"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Käytä suojattua yhteyttä"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Käytä SSL/STARTTLS-yhteyttä LDAP-palvelimen käyttämiseen"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Kerro, onko LDAP-palvelin Active Directory -palvelin"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Järjestelmänvalvojien ryhmät"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1208,47 +1218,47 @@ msgstr ""
"Näiden LDAP Posix -ryhmien jäsenet luodaan verkkotunnuksen "
"järjestelmänvalvojiksi. Käytä ';'-merkkejä ryhmien erottamiseen."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Ryhmän tyyppi"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "LDAP-ryhmän tyyppi, jota käytetään hakemiston kanssa."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Ryhmien hakupohja"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "Ryhmien etsimiseen käytettävän hakupohjan erottuva nimi"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Salasana-attribuutti"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Määrite, jota käytetään käyttäjien salasanojen tallentamiseen"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "LDAP-todennusasetukset"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Tunnistusmenetelmä"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Valitse käytettävä todennusmenetelmä"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Sido DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1256,29 +1266,29 @@ msgstr ""
"Erotusnimi, jota käytetään LDAP-palvelimeen sitoutumisessa. Jätä tyhjäksi "
"anonyymiä sidontaa varten"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Sido salasana"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"Salasana, jota käytetään LDAP-palvelimeen sitoutumisessa (komennolla 'Bind "
"DN')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Käyttäjien hakupohja"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "Käyttäjien etsimiseen käytettävän hakupohjan erisnimi"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Etsi suodatin"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1286,11 +1296,11 @@ msgstr ""
"Valinnainen suodatinmerkkijono (esim. '(objectClass=person)'). Tämän on "
"oltava suluissa."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Käyttäjän DN-malli"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1299,26 +1309,26 @@ msgstr ""
"Käyttäjän DN:n rakentamiseen käytettävä malli. Sen tulisi sisältää yksi "
"paikanvaraaja (eli %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "LDAP-synkronointiasetukset"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "Ota käyttöön vienti LDAP:iin"
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
"Ota käyttöön automaattinen synkronointi paikallisen tietokannan ja LDAP-"
"hakemiston välillä"
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr "Etäisen LDAP-tilin poistaminen, kun paikallinen tili poistetaan"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
@@ -1326,11 +1336,11 @@ msgstr ""
"Poista etä-LDAP-tili, kun paikallinen tili poistetaan. Muuten se poistetaan "
"käytöstä."
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "Tilin DN-malli"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
@@ -1339,134 +1349,207 @@ msgstr ""
"Malli, jota käytetään tilin DN:n muodostamiseen. Sen tulisi sisältää yksi "
"paikanvaraaja (eli %(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "Ota käyttöön tuonti LDAP:stä"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
"Tilien synkronoinnin käyttöönotto LDAP-hakemistosta paikalliseen tietokantaan"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "Käyttäjätunnus-määrite"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr "Sen LDAP-attribuutin nimi, josta käyttäjänimi löytyy."
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Ota Dovecot LDAP-synkronointi käyttöön"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr "LDAP-todennusasetuksia sovelletaan Dovecot-konfiguraatioon."
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Dovecot LDAP -asetustiedosto"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr "Dovecotin LDAP-asetukset sisältävän määritystiedoston sijainti."
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Työpöytä"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "spam messages"
+msgid "Custom welcome message"
+msgstr "roskapostiviestit"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr "Väliaikainen viesti, joka näytetään salasanan nollaussivulla."
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Mukautettu RSS-syöte"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
"Näytä mukautettu RSS-syöte jälleenmyyjille ja verkkotunnuksen ylläpitäjille"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Näytä mukautettu RSS-syöte jälleenmyyjille ja verkkotunnuksen ylläpitäjille"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Näytä mukautettu RSS-syöte jälleenmyyjille ja verkkotunnuksen ylläpitäjille"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Piilota ominaisuudet-widget"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
"Piilota ominaisuudet-widget jälleenmyyjiltä ja verkkotunnuksen ylläpitäjiltä"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Toissijainen sähköpostiosoite"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Ilmoitukset"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Lähettäjän osoite"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Ilmoitusten lähettämiseen käytettävä sähköpostiosoite."
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Julkinen API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Ota viestintä käyttöön"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Tarkistaa automaattisesti, onko uudempi versio saatavana"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Tarkista uudet versiot"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "Lähetä sähköpostia, kun uusia versioita löytyy"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
"Lähetä sähköpostiviesti, joka ilmoittaa ylläpitäjille uusista versioista"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Vastaanottaja"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "Uusia versioita koskevien ilmoitussähköpostiviestien vastaanottaja."
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Lähetä tilastot"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Lähetä tilastoja Modoboan julkiseen API:han (laskurit ja käytetyt "
"laajennukset)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Inaktiivisen tilin kynnysarvo"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Inaktiivisen tilin kynnysarvo"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1474,41 +1557,41 @@ msgstr ""
"Tiliä, jonka viimeisin kirjautumispäivä on suurempi kuin tämä kynnysarvo "
"(päivinä), pidetään inaktiivisena"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Ylimpien ilmoitusten tarkistusväli"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Kahden ylimmän ilmoituksen tarkistuksen välinen aika (sekunteina)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Lokitiedoston enimmäisikä"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Lokitietueen enimmäisikä päivinä"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Kohteita per sivu"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Näytettävien kohteiden määrä sivua kohti"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Oletusarvoinen ylhäältä uudelleenohjaus"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"Oletusarvoinen uudelleenohjaus, jota käytetään, kun sovellusta ei ole "
"määritetty"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1518,20 +1601,44 @@ msgstr ""
"talviajan vaihtuessa. (Sama paikallinen aika esiintyy kahdesti kellon "
"vaihtumisen vuoksi)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Aseta `USE_TZ = True` tiedostossa settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Update password scheme at login"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Päivitä salasanajärjestelmä kirjautumisen yhteydessä"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Yksinkertainen käyttäjä"
@@ -1623,62 +1730,62 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] Päivitys(kset) saatavilla"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Salli postilaatikoiden käyttöoikeus"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Salli tämän järjestelmänvalvojan pääsy käyttäjien postilaatikoihin"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "salasana"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "kieli"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Suositeltava kieli sivujen näyttämiseen."
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Puhelinnumero"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Toissijainen sähköpostiosoite"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr "Vaihtoehtoista sähköpostiosoitetta voidaan käyttää palautukseen."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Salasanan päivittäminen epäonnistui: LDAP-moduulia ei ole asennettu"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "tili"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Tuntematon"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Et voi tuoda tiliä, jonka rooli on suurempi kuin omasi"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr ""
"Yksinkertaisella käyttäjällä '%s' on oltava voimassa oleva sähköpostiosoite"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2036,7 +2143,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr "Automaattinen asetusten määrittäminen"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -2068,24 +2175,24 @@ msgstr "LDAP-tilin poistaminen epäonnistui: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "LDAP-tilin poistaminen käytöstä epäonnistui: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Ota käyttöön viestintä Modoboan julkisen API:n kanssa"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "ei pysty määrittämään merkkijonon koodausta"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Lupa evätty: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Lupa evätty"
@@ -2859,11 +2966,11 @@ msgstr "hylätyt viestit"
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3226,7 +3333,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to create LDAP account: {}"
msgid "Failed to remove attachment: "
@@ -3236,7 +3343,7 @@ msgstr "LDAP-tilin luominen epäonnistui: {}"
msgid "Date"
msgstr "Päivämäärä"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/fr/LC_MESSAGES/django.po b/modoboa/locale/fr/LC_MESSAGES/django.po
index 93e7e5f77..18fae1ff8 100644
--- a/modoboa/locale/fr/LC_MESSAGES/django.po
+++ b/modoboa/locale/fr/LC_MESSAGES/django.po
@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
-#
+#
# Translators:
# Antoine Nguyen , 2016-2017,2020,2023-2025
# Christophe CHAUVET , 2018
@@ -15,85 +15,92 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2011-07-01 08:15+0000\n"
"Last-Translator: Antoine Nguyen , 2016-2017,2020,2023-2025\n"
"Language-Team: French (http://app.transifex.com/tonio/modoboa/language/fr/)\n"
+"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: fr\n"
-"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
+"1000000 == 0 ? 1 : 2;\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
-msgstr "Quota partagé entre les boîtes aux lettres. Peut être exprimé en Ko, Mo (défaut) ou Go. Une valeur à 0 signifie pas de quota."
+msgstr ""
+"Quota partagé entre les boîtes aux lettres. Peut être exprimé en Ko, Mo "
+"(défaut) ou Go. Une valeur à 0 signifie pas de quota."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr "Quota par défaut en Mo appliqué aux boîtes aux lettres. Une valeur à 0 signifie pas de quota."
+msgstr ""
+"Quota par défaut en Mo appliqué aux boîtes aux lettres. Une valeur à 0 "
+"signifie pas de quota."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr "Un alias de domaine avec ce nom existe déjà"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Aucun enregistrement MX autorisé trouvé pour ce domaine"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "Ne peut pas être supérieur au quota du domaine"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Permission refusée."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Ce champ est requis"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
-msgstr "Liste des domaines administrés (revendeurs et administrateurs de domaine seulement)."
+msgstr ""
+"Liste des domaines administrés (revendeurs et administrateurs de domaine "
+"seulement)."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Non autorisé pour ce rôle."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Doit être égale au champ full_address dans mailbox"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Ce champ est requis."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Le domaine local {} n'existe pas"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Une liste de destinataire"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr "Cet alias existe déjà"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "Vous n'avez pas accès à ce domaine."
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "Vous n'avez pas accès à cette boîtes aux lettres."
@@ -101,56 +108,58 @@ msgstr "Vous n'avez pas accès à cette boîtes aux lettres."
msgid "Here is your new Modoboa password: {}"
msgstr "Voici votre nouveau mot de passe Modoboa :"
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "Répertoire de stockage des clés DKIM non configuré"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr "Ce champs est correct pour le type relaydomain uniquement"
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Vous ne pouvez pas définir de quota illimité"
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "L'utilisateur '%s' existe déjà"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Doit être un entier positif"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
-msgstr "impossible de trouver openssl, veuillez vous assurer vous qu'il est installé."
+msgstr ""
+"impossible de trouver openssl, veuillez vous assurer vous qu'il est installé."
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Répertoire introuvable."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr "Ce champ n'autorise que des adresses IP correctes (ou des réseaux)"
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr "Veuillez désactiver la migration IMAP avant de désactiver cette option"
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Définissez au moins un réseau / une adresse autorisé"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
-msgstr "La partie gauche d'un courriel ne peut pas faire plus de 64 caractères."
+msgstr ""
+"La partie gauche d'un courriel ne peut pas faire plus de 64 caractères."
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr "Une boîte aux lettres est requises pour créer des alias"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr "Statut inconnu"
@@ -162,11 +171,11 @@ msgstr "Vous n'avez pas accès à ce domaine"
msgid "You can't delete your own domain"
msgstr "Vous ne pouvez pas supprimer votre propre domaine"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr "Aucun ID d'alarme fourni"
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr "ID(s) incorrect(s) d'alarme(s) reçu(s)"
@@ -188,9 +197,12 @@ msgstr "MX(s) valide(s)"
#: admin/app_settings.py:37
msgid ""
-"A list of IP or network address every MX record should match. A warning will"
-" be sent if a record does not respect it."
-msgstr "Une liste d'adresses IP ou réseau que chaque enregistrement MX doit respecter. Un avertissement sera envoyé dès qu'un enregistrement ne la respecte pas."
+"A list of IP or network address every MX record should match. A warning will "
+"be sent if a record does not respect it."
+msgstr ""
+"Une liste d'adresses IP ou réseau que chaque enregistrement MX doit "
+"respecter. Un avertissement sera envoyé dès qu'un enregistrement ne la "
+"respecte pas."
#: admin/app_settings.py:47
msgid "New domains must use authorized MX(s)"
@@ -200,7 +212,9 @@ msgstr "Les nouveaux domaines doivent utiliser un ou plusieurs MX autorisés"
msgid ""
"Prevent the creation of a new domain if its MX record does not use one of "
"the defined addresses."
-msgstr "Empêcher la création d'un domaine s'il n'a pas au moins un MX utilisant une adresse autorisée."
+msgstr ""
+"Empêcher la création d'un domaine s'il n'a pas au moins un MX utilisant une "
+"adresse autorisée."
#: admin/app_settings.py:59
msgid "Enable IPV6 checks"
@@ -224,7 +238,9 @@ msgstr "Activer les tests DKIM"
#: admin/app_settings.py:80
msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
-msgstr "Vérifie que chaque domaine ayant la signature DKIM activée dispose d'un enregistrement DNS valide"
+msgstr ""
+"Vérifie que chaque domaine ayant la signature DKIM activée dispose d'un "
+"enregistrement DNS valide"
#: admin/app_settings.py:88
msgid "Enable DMARC checks"
@@ -240,7 +256,9 @@ msgstr "Activer les tests d'autoconfiguration"
#: admin/app_settings.py:99
msgid "Check if every domain has a valid records for autoconfiguration"
-msgstr "Vérifie que chaque domaine a les enregistrements nécessaires à l'autoconfiguration"
+msgstr ""
+"Vérifie que chaque domaine a les enregistrements nécessaires à "
+"l'autoconfiguration"
#: admin/app_settings.py:107
msgid "Enable DNSBL checks"
@@ -256,7 +274,9 @@ msgstr "Serveur DNS personnalisé"
#: admin/app_settings.py:118
msgid "Use a custom DNS server instead of local server configuration"
-msgstr "Utiliser un serveur DNS personnalisé à la place de la configuration par défaut du serveur"
+msgstr ""
+"Utiliser un serveur DNS personnalisé à la place de la configuration par "
+"défaut du serveur"
#: admin/app_settings.py:126
msgid "DKIM keys storage directory"
@@ -267,7 +287,10 @@ msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
-msgstr "Chemin absolu du répertoire dans lequel seront stockées les clés DKIM. Assurez vous que ce répertoire appartient à l'utilisateur root et qu'il n'est pas lisible par le monde extérieur."
+msgstr ""
+"Chemin absolu du répertoire dans lequel seront stockées les clés DKIM. "
+"Assurez vous que ce répertoire appartient à l'utilisateur root et qu'il "
+"n'est pas lisible par le monde extérieur."
#: admin/app_settings.py:137
msgid "Default DKIM key length"
@@ -285,7 +308,9 @@ msgstr "Quota de domaine par défaut"
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
-msgstr "Quota par défaut (en Mo) appliqué aux domaines fraichement créés et ne spécifiant pas de valeur. 0 signifie qu'aucun quota ne sera appliqué."
+msgstr ""
+"Quota par défaut (en Mo) appliqué aux domaines fraichement créés et ne "
+"spécifiant pas de valeur. 0 signifie qu'aucun quota ne sera appliqué."
#: admin/app_settings.py:156
msgid "Default domain sending limit"
@@ -295,7 +320,9 @@ msgstr "Limite d'envoi par défaut du domaine"
msgid ""
"Number of messages freshly created domains will be allowed to send per day. "
"Leave empty for no limit."
-msgstr "Nombre maximal de messages que les nouveaux domaines seront autorisés à envoyer par jour. Laisser vide pour n'indiquer aucune limite."
+msgstr ""
+"Nombre maximal de messages que les nouveaux domaines seront autorisés à "
+"envoyer par jour. Laisser vide pour n'indiquer aucune limite."
#: admin/app_settings.py:170 limits/app_settings.py:61
#: limits/app_settings.py:135 limits/constants.py:31 limits/constants.py:84
@@ -310,7 +337,9 @@ msgstr "Gérer les boites sur le système de fichiers"
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
-msgstr "Renommer ou supprimer les boites sur le système de fichiers quand elles sont renommées ou supprimées dans Modoboa"
+msgstr ""
+"Renommer ou supprimer les boites sur le système de fichiers quand elles sont "
+"renommées ou supprimées dans Modoboa"
#: admin/app_settings.py:186 admin/models/domain.py:36
msgid "Default mailbox quota"
@@ -320,7 +349,9 @@ msgstr "Quota par défaut pour une boîte aux lettres"
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
-msgstr "Quota par défaut (en Mo) appliqué aux nouveaux domaines quand aucune valeur n'est spécifiée. Une valeur de 0 signifie pas de quota."
+msgstr ""
+"Quota par défaut (en Mo) appliqué aux nouveaux domaines quand aucune valeur "
+"n'est spécifiée. Une valeur de 0 signifie pas de quota."
#: admin/app_settings.py:197
msgid "Default mailbox sending limit"
@@ -330,7 +361,9 @@ msgstr "Limite d'envoi par défaut d'une boîte aux lettres"
msgid ""
"Number of messages freshly created mailboxes will be allowed to send per "
"day. Leave empty for no limit."
-msgstr "Nombre maximal de messages que les nouveaux comptes seront autorisés à envoyer par jour. Laisser vide pour n'indiquer aucune limite."
+msgstr ""
+"Nombre maximal de messages que les nouveaux comptes seront autorisés à "
+"envoyer par jour. Laisser vide pour n'indiquer aucune limite."
#: admin/app_settings.py:207
msgid "Automatic account removal"
@@ -338,16 +371,19 @@ msgstr "Suppression automatique de compte"
#: admin/app_settings.py:209
msgid "When a mailbox is removed, also remove the associated account"
-msgstr "Lorsqu'une boite aux lettres est supprimée, supprimer le compte associé en même temps"
+msgstr ""
+"Lorsqu'une boite aux lettres est supprimée, supprimer le compte associé en "
+"même temps"
#: admin/app_settings.py:218
msgid "Automatic domain/mailbox creation"
msgstr "Création automatique de domaine/boite aux lettres"
#: admin/app_settings.py:221
-msgid ""
-"Create a domain and a mailbox when an account is automatically created."
-msgstr "Créer un domaine et une boite aux lettres quand un compte est créé automatiquement."
+msgid "Create a domain and a mailbox when an account is automatically created."
+msgstr ""
+"Créer un domaine et une boite aux lettres quand un compte est créé "
+"automatiquement."
#: admin/app_settings.py:230
msgid "Create an alias when a mailbox is renamed"
@@ -355,7 +391,9 @@ msgstr "Créer un alias quand une boite aux lettres est renommée"
#: admin/app_settings.py:233
msgid "Create an alias using the old address when a mailbox is renamed."
-msgstr "Créer un alias en utilisant l'ancienne adresse quand une boite aux lettres est renommée."
+msgstr ""
+"Créer un alias en utilisant l'ancienne adresse quand une boite aux lettres "
+"est renommée."
#: admin/app_settings.py:287 core/api/v2/viewsets.py:162
msgid "Administration"
@@ -432,19 +470,21 @@ msgstr "Nom DNS trop long : {}"
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Format d'adresse IP incorrect pour {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "L'objet existe déjà : %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d objets importés avec succès"
#: admin/management/commands/subcommands/_import.py:97
msgid "CSV file is not encoded in UTF-8, attempting to guess encoding"
-msgstr "Le fichier CSV n'est pas encodé en UTF-8, tentative de détermination de l'encodage"
+msgstr ""
+"Le fichier CSV n'est pas encodé en UTF-8, tentative de détermination de "
+"l'encodage"
#: admin/management/commands/subcommands/_import.py:112
#, python-format
@@ -454,13 +494,16 @@ msgstr "Lire le fichier CSV en utilisant l'encodage %(encoding)s"
#: admin/management/commands/subcommands/_import.py:123
#, python-format
msgid "Unable to decode CSV file using %(encoding)s encoding"
-msgstr "Impossible de décoder le fichier CSV en utilisant l'encodage %(encoding)s"
+msgstr ""
+"Impossible de décoder le fichier CSV en utilisant l'encodage %(encoding)s"
#: admin/management/commands/subcommands/_manage_dkim_keys.py:29
msgid ""
"DKIM path non-writable (either a permission issue or the directory does not "
"exist)"
-msgstr "Le chemin d'accès DKIM n'est pas modifiable (soit à cause d'un problème de permission, soit parce que le répertoire n'existe pas)"
+msgstr ""
+"Le chemin d'accès DKIM n'est pas modifiable (soit à cause d'un problème de "
+"permission, soit parce que le répertoire n'existe pas)"
#: admin/management/commands/subcommands/_manage_dkim_keys.py:52
msgid "Failed to generate DKIM private key"
@@ -579,14 +622,16 @@ msgstr "Activer la signature DKIM"
#: admin/models/domain.py:63
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
-msgstr "Si vous activez cette fonctionnalité, une clé DKIM sera générée pour ce domain."
+msgstr ""
+"Si vous activez cette fonctionnalité, une clé DKIM sera générée pour ce "
+"domain."
#: admin/models/domain.py:70
msgid "Key length"
msgstr "Taille de la clé"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Ligne invalide"
@@ -600,11 +645,15 @@ msgstr "{} : valeur incorrecte de quota pour ce domaine"
#: admin/models/domain.py:343
msgid "{}: invalid default mailbox quota value for domain"
-msgstr "{} : la valeur du quota par défaut des boîtes aux lettres est incorrecte pour ce domaine"
+msgstr ""
+"{} : la valeur du quota par défaut des boîtes aux lettres est incorrecte "
+"pour ce domaine"
#: admin/models/domain.py:350
msgid "{}: default mailbox quota cannot be greater than domain quota"
-msgstr "{} : le quota par défaut de la boîte aux lettres ne peut pas être supérieur au quota du domaine"
+msgstr ""
+"{} : le quota par défaut de la boîte aux lettres ne peut pas être supérieur "
+"au quota du domaine"
#: admin/models/domain_alias.py:36
msgid "The alias name"
@@ -653,19 +702,26 @@ msgstr "Domaine inexistant"
msgid ""
"Modoboa detected that domain %(domain)s is listed by the following DNSBL "
"providers:"
-msgstr "Modoboa a détecté que le domaine %(domain)s est listé par les fournisseurs de DNSBL suivants :"
+msgstr ""
+"Modoboa a détecté que le domaine %(domain)s est listé par les fournisseurs "
+"de DNSBL suivants :"
#: admin/templates/admin/notifications/domain_in_dnsbl.html:11
msgid ""
"The domain's reputation will be affected and there is a chance that emails "
"coming from it are considered as spam. You should contact those providers "
"and ask them to unlist detected IP address(es)."
-msgstr "La réputation de ce domaine sera affectée et il est probable que les emails venant de lui soient considérés comme du spam. Vous devriez contacter ces fournisseurs pour leur demander de délister la/les adresse(s) détectée(s)."
+msgstr ""
+"La réputation de ce domaine sera affectée et il est probable que les emails "
+"venant de lui soient considérés comme du spam. Vous devriez contacter ces "
+"fournisseurs pour leur demander de délister la/les adresse(s) détectée(s)."
#: admin/templates/admin/notifications/domain_invalid_mx.html:3
#, python-format
msgid "Modoboa detected that domain %(domain)s has no valid MX record:"
-msgstr "Modoboa a détecté que le domain %(domain)s n'a aucun enregistrement MX valide :"
+msgstr ""
+"Modoboa a détecté que le domain %(domain)s n'a aucun enregistrement MX "
+"valide :"
#: admin/tests/test_mx.py:155
#, python-format
@@ -707,7 +763,9 @@ msgstr "Période entre deux réponses automatiques"
#: autoreply/app_settings.py:20
msgid ""
"Number of days to wait before sending a new auto-reply to the same recipient"
-msgstr "Attendre ce nombre de jours avant l'envoi d'une nouvelle réponse automatique au même destinataire"
+msgstr ""
+"Attendre ce nombre de jours avant l'envoi d'une nouvelle réponse automatique "
+"au même destinataire"
#: autoreply/app_settings.py:27 autoreply/app_settings.py:36
msgid "Default subject"
@@ -716,14 +774,19 @@ msgstr "Sujet par défaut"
#: autoreply/app_settings.py:29
msgid ""
"Default subject used when an auto-reply message is created automatically"
-msgstr "Sujet par défaut utilisé quand un message de réponse automatique est crée automatiquement"
+msgstr ""
+"Sujet par défaut utilisé quand un message de réponse automatique est crée "
+"automatiquement"
#: autoreply/app_settings.py:38
#, python-format
msgid ""
"Default content used when an auto-reply message is created automatically. "
"The '%(name)s' macro will be replaced by the user's full name."
-msgstr "Contenu par défaut utilisé quand un message de réponse automatique est créé automatiquement. La macro %(name)s sera remplacée par le nom complet de l'utilisateur "
+msgstr ""
+"Contenu par défaut utilisé quand un message de réponse automatique est créé "
+"automatiquement. La macro %(name)s sera remplacée par le nom complet de "
+"l'utilisateur "
#: autoreply/apps.py:15
msgid "Automatic replies"
@@ -760,7 +823,9 @@ msgstr "URL du serveur"
#: calendars/app_settings.py:19
msgid ""
"The URL of your Radicale server. It will be used to construct calendar URLs."
-msgstr "L'URL de votre serveur Radicale. Elle sera utilisée pour construire les URL des calendriers."
+msgstr ""
+"L'URL de votre serveur Radicale. Elle sera utilisée pour construire les URL "
+"des calendriers."
#: calendars/app_settings.py:31
msgid "Rights management"
@@ -780,9 +845,11 @@ msgstr "Autoriser l'administration des calendriers"
#: calendars/app_settings.py:48
msgid "Allow domain administrators to manage user calendars (read and write)"
-msgstr "Autoriser les administrateurs de domaine à gérer les calendriers des utilisateurs (lecture et écriture)"
+msgstr ""
+"Autoriser les administrateurs de domaine à gérer les calendriers des "
+"utilisateurs (lecture et écriture)"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Divers"
@@ -794,7 +861,9 @@ msgstr "Taille maximale des fichiers ICS"
#: calendars/app_settings.py:68
msgid ""
"Maximum size in bytes of imported ICS files (or KB, MB, GB if specified)"
-msgstr "Taille maximale en octets des fichiers ICS importés (ou KB, MB, GB si précisé)"
+msgstr ""
+"Taille maximale en octets des fichiers ICS importés (ou KB, MB, GB si "
+"précisé)"
#: calendars/app_settings.py:89 core/api/v2/viewsets.py:172
msgid "Calendars"
@@ -820,7 +889,9 @@ msgstr "Synchroniser le carnet d'adresse en utilisant CardDAV"
msgid ""
"Choose to synchronize or not your address book using CardDAV. You will be "
"able to access your contacts from the outside."
-msgstr "Choisir de synchroniser ou non votre carnet d'adresse en utilisant CardDAV. Vous pourrez ainsi accéder à vos contacts depuis l'extérieur."
+msgstr ""
+"Choisir de synchroniser ou non votre carnet d'adresse en utilisant CardDAV. "
+"Vous pourrez ainsi accéder à vos contacts depuis l'extérieur."
#: contacts/app_settings.py:29
msgid "Synchronization frequency"
@@ -881,9 +952,11 @@ msgstr "2FA est déjà activf"
#: core/api/v1/serializers.py:87
#, python-format
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
-msgstr "Echec lors de la tentative de modification des paramètres de '%s' en tant qu'utilisateur '%s'"
+msgstr ""
+"Echec lors de la tentative de modification des paramètres de '%s' en tant "
+"qu'utilisateur '%s'"
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr "Mot de passe incorrect"
@@ -895,27 +968,28 @@ msgstr "Authentification 2 facteurs non activée"
msgid "Local"
msgstr "Locale"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Profil utilisateur"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Syntaxe invalide"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Nombre invalide de tours"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr "Ce code n'est pas valide"
-#: core/api/v2/serializers.py:473 core/views/auth.py:194
-#: core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
-msgstr "Veuillez utiliser le code suivant pour récupérer votre mot de passe Modoboa : {}"
+msgstr ""
+"Veuillez utiliser le code suivant pour récupérer votre mot de passe "
+"Modoboa : {}"
#: core/api/v2/viewsets.py:164
msgid "Administration console"
@@ -952,7 +1026,8 @@ msgstr "Méthode de chiffrement par défaut"
#: core/app_settings.py:54
msgid "Scheme used to crypt mailbox passwords"
-msgstr "Méthode utilisée pour chiffrer les mots de passe des boites aux lettres"
+msgstr ""
+"Méthode utilisée pour chiffrer les mots de passe des boites aux lettres"
#: core/app_settings.py:61
msgid "Rounds"
@@ -962,7 +1037,9 @@ msgstr "Tours"
msgid ""
"Number of rounds to use (only used by sha256crypt and sha512crypt). Must be "
"between 1000 and 999999999, inclusive."
-msgstr "Nombre de tours à utiliser (sha256crypt et sha512crypt uniquement). Doit être compris entre 1000 et 999999999 inclue."
+msgstr ""
+"Nombre de tours à utiliser (sha256crypt et sha512crypt uniquement). Doit "
+"être compris entre 1000 et 999999999 inclue."
#: core/app_settings.py:73
msgid "Update password scheme at login"
@@ -970,7 +1047,9 @@ msgstr "Mettre à jour la méthode de chiffrement du mot de passe à la connexio
#: core/app_settings.py:76
msgid "Update user password at login to use the default password scheme"
-msgstr "Mise à jour du mot de passe utilisateur lors d'une connexion pour utiliser la méthode de chiffrement par défaut"
+msgstr ""
+"Mise à jour du mot de passe utilisateur lors d'une connexion pour utiliser "
+"la méthode de chiffrement par défaut"
#: core/app_settings.py:84
msgid "Default password"
@@ -988,409 +1067,575 @@ msgstr "Taille d'un mot de passe aléatoire"
msgid "Length of randomly generated passwords."
msgstr "Taille des mots de passe générés aléatoirement."
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Taille des mots de passe générés aléatoirement."
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "URL de service de mise à jour du mot de passe"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
-msgstr "L'URL d'une page externe où les utilisateurs pourront mettre à jour leur mot de passe. Elle s'applique uniquement aux utilisateurs non locaux, c'est à dire ceux créés après une authentification externe réussie (LDAP, SMTP)."
+msgstr ""
+"L'URL d'une page externe où les utilisateurs pourront mettre à jour leur mot "
+"de passe. Elle s'applique uniquement aux utilisateurs non locaux, c'est à "
+"dire ceux créés après une authentification externe réussie (LDAP, SMTP)."
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "Annonce pour la récupération de mot de passe"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
-msgstr "Un message temporaire qui sera affiché sur la page de récupération de mot de passe"
+msgstr ""
+"Un message temporaire qui sera affiché sur la page de récupération de mot de "
+"passe"
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "Activer la récupération de mot de passe par SMS"
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
-msgstr "Activer la récupération de mot de passe par SMS pour les utilisateurs ayant renseigné un numéro de téléphone"
+msgstr ""
+"Activer la récupération de mot de passe par SMS pour les utilisateurs ayant "
+"renseigné un numéro de téléphone"
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "Fournisseur SMS"
-#: core/app_settings.py:139
-msgid "Choose a provider to send password recovery SMS"
-msgstr "Choisir un fournisseur pour envoyer les SMS de récupération de mot de passe"
-
#: core/app_settings.py:151
+msgid "Choose a provider to send password recovery SMS"
+msgstr ""
+"Choisir un fournisseur pour envoyer les SMS de récupération de mot de passe"
+
+#: core/app_settings.py:163
msgid "LDAP"
msgstr "LDAP"
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Adresse du serveur"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "L'adresse IP ou le nom DNS du serveur LDAP"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Port utilisé par le serveur"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Le port TCP utilisé par le serveur LDAP"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "Activer le serveur secondaire (secours)"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
-msgstr "Activer un serveur LDAP secondaire qui sera utilisé si le principal est en échec"
+msgstr ""
+"Activer un serveur LDAP secondaire qui sera utilisé si le principal est en "
+"échec"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "Adresse du serveur secondaire"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "L'adresse IP ou le nom DNS du serveur LDAP secondaire"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "Port du serveur secondaire"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "Le numéro du port TCP utilisé par le serveur LDAP secondaire"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Utiliser une connexion sécurisée"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Utiliser une connexion SSL/STARTTLS pour accéder au serveur LDAP"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Indiquer si le serveur LDAP est un Active Directory ou pas"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Groupes administrateurs"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
-"Members of those LDAP Posix groups will be created as domain administrators."
-" Use ';' characters to separate groups."
-msgstr "Les membres de ces groupes LDAP (Posix) seront créés en tant qu'administrateurs de domaine. Utiliser des caractères ';' pour séparer les groupes."
+"Members of those LDAP Posix groups will be created as domain administrators. "
+"Use ';' characters to separate groups."
+msgstr ""
+"Les membres de ces groupes LDAP (Posix) seront créés en tant "
+"qu'administrateurs de domaine. Utiliser des caractères ';' pour séparer les "
+"groupes."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Type de groupe"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "Le type de groupe LDAP à utiliser avec votre annuaire."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Base de recherche des groupes"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
-msgstr "Le nom distinctif de la base de recherche utilisée pour rechercher les groupes"
+msgstr ""
+"Le nom distinctif de la base de recherche utilisée pour rechercher les "
+"groupes"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Attribut 'mot de passe'"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "L'attribut utilisé pour stocker les mots de passe"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "Paramètres d'authentification LDAP"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Méthode d'authentification"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Choisir la méthode d'authentification à utiliser"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "ND de connexion"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
-msgstr "Le nom distinctif à utiliser pour les connections au serveur LDAP. Laisser vide pour une connexion anonyme"
+msgstr ""
+"Le nom distinctif à utiliser pour les connections au serveur LDAP. Laisser "
+"vide pour une connexion anonyme"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Mot de passe de connexion"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
-msgstr "Le mot de passe à utiliser pour les connections au serveur LDAP (avec 'ND de connexion')"
+msgstr ""
+"Le mot de passe à utiliser pour les connections au serveur LDAP (avec 'ND de "
+"connexion')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Base de recherche des utilisateurs"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
-msgstr "Le nom distinctif de la base de recherche utilisée pour rechercher les utilisateurs"
+msgstr ""
+"Le nom distinctif de la base de recherche utilisée pour rechercher les "
+"utilisateurs"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Filtre de recherche"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
-msgstr "Un filtre de recherche optionel (ex. '(objectClass=person)'). Pour être valide, il doit être entouré de parenthèses."
+msgstr ""
+"Un filtre de recherche optionel (ex. '(objectClass=person)'). Pour être "
+"valide, il doit être entouré de parenthèses."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Modèle de nom distinctif utilisateur"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
-msgstr "Le modèle utilisé pour construire le nom distinctif d'un utilisateur. Il doit contenir un espace réservé (ex. %(user)s)"
+msgstr ""
+"Le modèle utilisé pour construire le nom distinctif d'un utilisateur. Il "
+"doit contenir un espace réservé (ex. %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "Paramètres de synchronisation LDAP"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "Activer l'export LDAP"
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
-msgstr "Activer la synchronisation automatique entre la base de données locale et l'annuaire LDAP"
+msgstr ""
+"Activer la synchronisation automatique entre la base de données locale et "
+"l'annuaire LDAP"
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr "Supprimer un compte LDAP distant lorsqu'un compte local est supprimé"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
-msgstr "Supprimer un compte LDAP distant lorsqu'un compte local supprimé, autrement il sera désactivé."
+msgstr ""
+"Supprimer un compte LDAP distant lorsqu'un compte local supprimé, autrement "
+"il sera désactivé."
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "Modèle des DN de compte"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
-msgstr "Le modèle utilisé pour construite un DN de compte (nom unique). Il doit contenir un emplacement (c'est à dire 1%(user)s)"
+msgstr ""
+"Le modèle utilisé pour construite un DN de compte (nom unique). Il doit "
+"contenir un emplacement (c'est à dire 1%(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "Activer l'import LDAP"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
-msgstr "Activer la synchronisation des comptes entre un annuaire LDAP et la base de données locale"
+msgstr ""
+"Activer la synchronisation des comptes entre un annuaire LDAP et la base de "
+"données locale"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "Attribut nom d'utilisateur"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
-msgstr "Le nom de l'attribut LDAP dans lequel le nom d'utilisateur peut être trouvé."
+msgstr ""
+"Le nom de l'attribut LDAP dans lequel le nom d'utilisateur peut être trouvé."
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Activer la synchronisation LDAP pour Dovecot"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
-msgstr "Les paramètres d'authentification LDAP seront appliqués à la configuration de Dovecot."
+msgstr ""
+"Les paramètres d'authentification LDAP seront appliqués à la configuration "
+"de Dovecot."
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Fichier de configuration Dovecot pour LDAP"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
-msgstr "Emplacement du fichier de configuration qui contient les paramètres LDAP de Dovecot"
+msgstr ""
+"Emplacement du fichier de configuration qui contient les paramètres LDAP de "
+"Dovecot"
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Tableau de bord"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom message"
+msgid "Custom welcome message"
+msgstr "Message personnalisé"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+"Un message temporaire qui sera affiché sur la page de récupération de mot de "
+"passe"
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Flux RSS personnalisé"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
-msgstr "Afficher un flux RSS personnalisé aux revendeurs et administrateurs de domaine"
+msgstr ""
+"Afficher un flux RSS personnalisé aux revendeurs et administrateurs de "
+"domaine"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Afficher un flux RSS personnalisé aux revendeurs et administrateurs de "
+"domaine"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Afficher un flux RSS personnalisé aux revendeurs et administrateurs de "
+"domaine"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Masquer le widget des fonctionnalités"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
-msgstr "Masquer le widget des fonctionnalités pour les revendeurs et les administrateurs de domaine"
+msgstr ""
+"Masquer le widget des fonctionnalités pour les revendeurs et les "
+"administrateurs de domaine"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Email secondaire"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Notifications"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Adresse d'envoi"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Adresse utilisée pour envoyer les notifications."
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "API publique"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Activer la communication"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Vérifie automatiquement si une nouvelle version est disponible"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Vérifier les nouvelles versions"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "Envoyer un email quand de nouvelles versions sont trouvées"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
-msgstr "Envoyer un email pour notifier les administrateurs à propos des nouvelles versions"
+msgstr ""
+"Envoyer un email pour notifier les administrateurs à propos des nouvelles "
+"versions"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Destinataire"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "Destinataire des emails de notification pour les nouvelles versions"
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Envoyer des statistiques"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
-msgstr "Envoyer des statistiques à l'API publique de Modoboa (compteurs et extensions utilisées)"
+msgstr ""
+"Envoyer des statistiques à l'API publique de Modoboa (compteurs et "
+"extensions utilisées)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr "Activer le suivi des comptes inactifs"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
-"Allow the administrator to set a threshold (in days) beyond which an account"
-" is considered inactive if the user hasn't logged in"
-msgstr "Autoriser les administrateurs à définir in seuil (en jours) à partir duquel un compte est considéré comme inactif si l'utilisateur ne s'est pas connecté"
+"Allow the administrator to set a threshold (in days) beyond which an account "
+"is considered inactive if the user hasn't logged in"
+msgstr ""
+"Autoriser les administrateurs à définir in seuil (en jours) à partir duquel "
+"un compte est considéré comme inactif si l'utilisateur ne s'est pas connecté"
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Seuil des comptes inactifs"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
-"An account with a last login date greater than this threshold (in days) will"
-" be considered as inactive"
-msgstr "Un compte avec une date de dernière connexion antérieure à ce seuil sera considéré comme inactif"
+"An account with a last login date greater than this threshold (in days) will "
+"be considered as inactive"
+msgstr ""
+"Un compte avec une date de dernière connexion antérieure à ce seuil sera "
+"considéré comme inactif"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Intervalle de vérification des notifications"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Intervalle entre deux vérifications de notification (en secondes)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Age maximal d'un enregistrement du journal"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "L'age maximal en jours d'un enregistrement du journal"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Eléments par page"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Nombre d'éléments affichés par page"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Redirection par défaut"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
-msgstr "La redirection appliquée par défaut quand aucune application n'est spécifiée"
+msgstr ""
+"La redirection appliquée par défaut quand aucune application n'est spécifiée"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
-msgstr "Vous avez défini USE_TZ à False, ce qui peut entraîner des problèmes lors des transitions entre l'heure d'été et l'heure d'hiver (c.-à-d. La même heure locale se produisant deux fois en raison d'un changement d'horloge)."
+msgstr ""
+"Vous avez défini USE_TZ à False, ce qui peut entraîner des problèmes lors "
+"des transitions entre l'heure d'été et l'heure d'hiver (c.-à-d. La même "
+"heure locale se produisant deux fois en raison d'un changement d'horloge)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Mettre `USE_TZ = True` dans settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr "La méthode de chiffrement que vous utilisez est obsolète."
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
-msgstr "Mettez à jour votre méthode de chiffrement de mot de passe vers une plus sûre"
+msgstr ""
+"Mettez à jour votre méthode de chiffrement de mot de passe vers une plus sûre"
+
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
#: core/constants.py:6
msgid "Simple user"
@@ -1477,67 +1722,71 @@ msgstr "Une ou plusieurs mises à jour sont disponibles!"
#: core/handlers.py:138
#, python-format
msgid "You are still using a deprecated password scheme (%s)"
-msgstr "Vous utilisez encore une méthode de chiffrement de mot de passe obsolète (%s)"
+msgstr ""
+"Vous utilisez encore une méthode de chiffrement de mot de passe obsolète (%s)"
#: core/management/commands/communicate_with_public_api.py:42
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] Mise(s) à jour disponible(s)"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Autoriser l'accès aux boites"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Autoriser cet administrateur à accéder aux boites des utilisateurs"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "mot de passe"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "langue"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Langage préféré pour afficher les pages"
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Numéro de téléphone"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Email secondaire"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr "Une adresse e-mail alternative ou de secours."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
-msgstr "Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé"
+msgstr ""
+"Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "compte"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Inconnu"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Vous ne pouvez pas importer un compte avec un rôle supérieur au votre"
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr "L'utilisateur de base '{}' doit avoir une adresse email correcte"
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
-msgstr "les champs nom d'utilisateur et email ne doivent pas être différents pour '{}'"
+msgstr ""
+"les champs nom d'utilisateur et email ne doivent pas être différents pour "
+"'{}'"
#: core/password_validation.py:25
msgid "Password must contain at least {} digit."
@@ -1569,7 +1818,9 @@ msgstr[2] "Le mot de passe doit contenir au moins {} caractères spéciaux."
#: core/password_validation.py:70
msgid "Your password must contain a combination of different character types."
-msgstr "Votre mot de passe doit contenir une combinaison de différents types de caractère."
+msgstr ""
+"Votre mot de passe doit contenir une combinaison de différents types de "
+"caractère."
#: core/sms_backends/ovh.py:21 core/sms_backends/ovh.py:102
msgid "API endpoint"
@@ -1626,9 +1877,15 @@ msgid ""
msgid_plural ""
"\n"
" The following updates are available:\n"
-msgstr[0] "\nLa mise à jour suivante est disponible :\n"
-msgstr[1] "\nLes mises à jour suivantes sont disponibles :\n"
-msgstr[2] "\nLes mises à jour suivantes sont disponibles :\n"
+msgstr[0] ""
+"\n"
+"La mise à jour suivante est disponible :\n"
+msgstr[1] ""
+"\n"
+"Les mises à jour suivantes sont disponibles :\n"
+msgstr[2] ""
+"\n"
+"Les mises à jour suivantes sont disponibles :\n"
#: core/utils.py:43
msgid "The core part of Modoboa"
@@ -1642,12 +1899,16 @@ msgstr "Utiliseur '%s' connecté avec succès"
#: core/views/auth.py:109
#, python-format
msgid "Password scheme mismatch. Updating %s password"
-msgstr "La méthode de chiffrement du mot de passe diffère. Mise à jour du mot de passe de %s"
+msgstr ""
+"La méthode de chiffrement du mot de passe diffère. Mise à jour du mot de "
+"passe de %s"
#: core/views/auth.py:116
#, python-format
msgid "Password hash parameter missmatch. Updating %s password"
-msgstr "Le paramètre de hash du mot de passe ne correspond pas. Mise à jour %s du mot de passe"
+msgstr ""
+"Le paramètre de hash du mot de passe ne correspond pas. Mise à jour %s du "
+"mot de passe"
#: core/views/auth.py:154
msgid "User '{}' successfully logged out"
@@ -1663,7 +1924,9 @@ msgstr "Activer les recherches inversées"
#: dmarc/forms.py:23
msgid "Enable reverse DNS lookups (reports will be longer to display)"
-msgstr "Activer les recherches DNS inversées (les rapports seront plus longs à afficher)"
+msgstr ""
+"Activer les recherches DNS inversées (les rapports seront plus longs à "
+"afficher)"
#: dmarc/forms.py:42
msgid "DMARC"
@@ -1850,7 +2113,9 @@ msgstr "Filtre d'exclusion de dossier"
msgid ""
"Use a regular expression to explicitly include folders in sync. Example: "
"^Trash$|Del"
-msgstr "Utiliser une expression régulière pour explicitement inclure des dossiers à synchroniser. Exemple : ^Trash$|Del"
+msgstr ""
+"Utiliser une expression régulière pour explicitement inclure des dossiers à "
+"synchroniser. Exemple : ^Trash$|Del"
#: imap_migration/app_settings.py:74
msgid "Folder Filter Inclusions"
@@ -1859,15 +2124,18 @@ msgstr "Filtre d'inclusion de dossier"
#: imap_migration/app_settings.py:76
msgid ""
"A comma seperated list of folders to explicitly include in sync even if "
-"filtered by the Folder Filter Exclusions. Example: debian.user, "
-"debian.personal "
-msgstr "Une liste de dossiers séparés par des virgules à explicitement inclure pendant la synchronisation même s'ils sont concernés par le filtre d'exclusion. Exemple debian.user, debian.personal"
+"filtered by the Folder Filter Exclusions. Example: debian.user, debian."
+"personal "
+msgstr ""
+"Une liste de dossiers séparés par des virgules à explicitement inclure "
+"pendant la synchronisation même s'ils sont concernés par le filtre "
+"d'exclusion. Exemple debian.user, debian.personal"
#: imap_migration/apps.py:20
msgid "IMAP Migration"
msgstr "Migration IMAP"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr "La connexion au serveur IMAP a échoué : {error}"
@@ -1876,12 +2144,16 @@ msgstr "La connexion au serveur IMAP a échoué : {error}"
msgid ""
"Automatic domain/mailbox creation is disabled which means IMAP "
"authentication won't work."
-msgstr "La création automatique de domaine/compte est désactivée, ce qui veut dire que l'authentification IMAP ne fonctionnera pas."
+msgstr ""
+"La création automatique de domaine/compte est désactivée, ce qui veut dire "
+"que l'authentification IMAP ne fonctionnera pas."
#: imap_migration/checks.py:16
msgid ""
"Go to the online parameters panel (admin tab) and activate this feature."
-msgstr "Rendez vous sur le panneau de configuration des paramètres (onglet Administration) et activez cette fonctionnalité."
+msgstr ""
+"Rendez vous sur le panneau de configuration des paramètres (onglet "
+"Administration) et activez cette fonctionnalité."
#: ldapsync/lib.py:82
msgid "Failed to create LDAP account: {}"
@@ -1899,21 +2171,21 @@ msgstr "Impossible de supprimer le compte LDAP : {}"
msgid "Failed to disable LDAP account: {}"
msgstr "Impossible de désactiver le compte LDAP : {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr "Impossible de communiquer avec l'API : %s"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "Impossible de déterminer l'encodage de la chaîne de caractères"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr "Permission refusée : {}"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Permission refusée"
@@ -1950,13 +2222,17 @@ msgstr "Admins de domaine"
msgid ""
"Maximum number of allowed domain administrators for a new administrator. (0 "
"to deny any creation, -1 to allow unlimited creations)"
-msgstr "Nombre maximal d'admins de domaine pour un nouvel administrateur. (0 pour interdire toute création, -1 pour autoriser les création illimitées)"
+msgstr ""
+"Nombre maximal d'admins de domaine pour un nouvel administrateur. (0 pour "
+"interdire toute création, -1 pour autoriser les création illimitées)"
#: limits/app_settings.py:41
msgid ""
"Maximum number of allowed domains for a new administrator. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "Nombre maximal de domaines pour un nouvel administrateur. (0 pour interdire toute création, -1 pour autoriser les créations illimitées)"
+msgstr ""
+"Nombre maximal de domaines pour un nouvel administrateur. (0 pour interdire "
+"toute création, -1 pour autoriser les créations illimitées)"
#: limits/app_settings.py:49 limits/app_settings.py:123 limits/constants.py:22
#: limits/constants.py:76
@@ -1965,15 +2241,19 @@ msgstr "Alias de domaine"
#: limits/app_settings.py:52
msgid ""
-"Maximum number of allowed domain aliases for a new administrator. (0 to deny"
-" any creation, -1 to allow unlimited creations)"
-msgstr "Nombre maximal d'alias de domaine pour un nouvel administrateur. (0 pour interdire toute création, -1 pour autoriser les créations illimitées)"
+"Maximum number of allowed domain aliases for a new administrator. (0 to deny "
+"any creation, -1 to allow unlimited creations)"
+msgstr ""
+"Nombre maximal d'alias de domaine pour un nouvel administrateur. (0 pour "
+"interdire toute création, -1 pour autoriser les créations illimitées)"
#: limits/app_settings.py:64
msgid ""
"Maximum number of allowed mailboxes for a new administrator. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "Nombre maximal de boites pour un nouvel administrateur. (0 pour interdire toute création, -1 pour autoriser les créations illimitées)"
+msgstr ""
+"Nombre maximal de boites pour un nouvel administrateur. (0 pour interdire "
+"toute création, -1 pour autoriser les créations illimitées)"
#: limits/app_settings.py:73 limits/app_settings.py:146 limits/constants.py:39
#: limits/constants.py:92
@@ -1984,7 +2264,9 @@ msgstr "Alias de boite"
msgid ""
"Maximum number of allowed aliases for a new administrator. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "Nombre maximal d'alias de boite pour un nouvel administrateur. (0 pour interdire toute création, -1 pour autoriser les créations illimitées)"
+msgstr ""
+"Nombre maximal d'alias de boite pour un nouvel administrateur. (0 pour "
+"interdire toute création, -1 pour autoriser les créations illimitées)"
#: limits/app_settings.py:84 limits/constants.py:59
msgid "Quota"
@@ -1994,7 +2276,9 @@ msgstr "Quota"
msgid ""
"The quota a reseller will be allowed to share between the domains he "
"creates. (0 means no quota)"
-msgstr "Le quota qu'un revendeur sera autorisé à partager entre les domaines qu'il créé. (0 signifie pas de quota)"
+msgstr ""
+"Le quota qu'un revendeur sera autorisé à partager entre les domaines qu'il "
+"créé. (0 signifie pas de quota)"
#: limits/app_settings.py:98
msgid "Default per-domain limits"
@@ -2010,27 +2294,36 @@ msgstr "Activer ou désactiver les limites par domaine"
#: limits/app_settings.py:114
msgid ""
-"Maximum number of allowed domain administrators for a new domain. (0 to deny"
-" any creation, -1 to allow unlimited creations)"
-msgstr "Nombre maximal d'administrateurs de domaine autorisés pour un nouveau domaine (0 pour interdire toute création, -1 pour autoriser les créations illimitées)"
+"Maximum number of allowed domain administrators for a new domain. (0 to deny "
+"any creation, -1 to allow unlimited creations)"
+msgstr ""
+"Nombre maximal d'administrateurs de domaine autorisés pour un nouveau "
+"domaine (0 pour interdire toute création, -1 pour autoriser les créations "
+"illimitées)"
#: limits/app_settings.py:126
msgid ""
"Maximum number of allowed domain aliases for a new domain. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "Nombre maximal d'alias de domaine autorisés pour un nouveau domaine. (0 pour interdire toute création, -1 pour autoriser les créations illimitées)"
+msgstr ""
+"Nombre maximal d'alias de domaine autorisés pour un nouveau domaine. (0 pour "
+"interdire toute création, -1 pour autoriser les créations illimitées)"
#: limits/app_settings.py:138
msgid ""
"Maximum number of allowed mailboxes for a new domain. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "Nombre maximal de boites aux lettres autorisées pour un nouveau domaine. (0 pour interdire toute création, -1 pour autoriser les créations illimitées)"
+msgstr ""
+"Nombre maximal de boites aux lettres autorisées pour un nouveau domaine. (0 "
+"pour interdire toute création, -1 pour autoriser les créations illimitées)"
#: limits/app_settings.py:149
msgid ""
-"Maximum number of allowed aliases for a new domain. (0 to deny any creation,"
-" -1 to allow unlimited creations)"
-msgstr "Nombre maximal d'alias autorisés pour un nouveau domaine. (0 pour interdire toute création, -1 pour autoriser les créations illimitées)"
+"Maximum number of allowed aliases for a new domain. (0 to deny any creation, "
+"-1 to allow unlimited creations)"
+msgstr ""
+"Nombre maximal d'alias autorisés pour un nouveau domaine. (0 pour interdire "
+"toute création, -1 pour autoriser les créations illimitées)"
#: limits/apps.py:16
msgid "Limits"
@@ -2095,7 +2388,9 @@ msgstr "illimité"
#: maillog/api/v2/serializers.py:35
msgid "You must provide start and end dates when period is custom"
-msgstr "Vous devez fournir des dates de début et fin quand la période est personnalisée"
+msgstr ""
+"Vous devez fournir des dates de début et fin quand la période est "
+"personnalisée"
#: maillog/apps.py:20
msgid "Path to the log file"
@@ -2207,7 +2502,9 @@ msgstr "Activer les identifiants PDF"
#: pdfcredentials/app_settings.py:21
msgid "Enabled PDF credentials document generation on account creation."
-msgstr "Activer la génération d'un document PDF d'identifiants à la création d'un compte."
+msgstr ""
+"Activer la génération d'un document PDF d'identifiants à la création d'un "
+"compte."
#: pdfcredentials/app_settings.py:32
msgid "Documents storage"
@@ -2233,7 +2530,9 @@ msgstr "Supprimer les documents après le premier téléchargement"
msgid ""
"Automatically delete a document just after its first download from this "
"interface"
-msgstr "Supprimer automatiquement un document juste après son premier téléchargement depuis cette interface"
+msgstr ""
+"Supprimer automatiquement un document juste après son premier "
+"téléchargement depuis cette interface"
#: pdfcredentials/app_settings.py:68
msgid "Generate documents only at account creation"
@@ -2243,7 +2542,10 @@ msgstr "Générer les documents à la création des comptes uniquement"
msgid ""
"Generate a new document only when a new account is created. If set to no, a "
"new document will be created each time a password is updated."
-msgstr "Génère un nouveau document uniquement lors de la création d'un compte. Si défini à non, un nouveau document sera généré chaque fois qu'un mot de passe est changé."
+msgstr ""
+"Génère un nouveau document uniquement lors de la création d'un compte. Si "
+"défini à non, un nouveau document sera généré chaque fois qu'un mot de passe "
+"est changé."
#: pdfcredentials/app_settings.py:84
msgid "Customization options"
@@ -2281,7 +2583,9 @@ msgstr "Inclure les paramètres de connexion pour client mail"
msgid ""
"Include required SMTP and IMAP connection information to configure a mail "
"client, a tablet or a phone"
-msgstr "Inclure les paramètres de connexion nécessaires pour configurer un client mail, une tablette ou un téléphone"
+msgstr ""
+"Inclure les paramètres de connexion nécessaires pour configurer un client "
+"mail, une tablette ou un téléphone"
#: pdfcredentials/app_settings.py:123 pdfcredentials/documents.py:133
msgid "SMTP server address"
@@ -2342,7 +2646,11 @@ msgid ""
"Dear %s, this document contains the credentials you will need\n"
"to connect to Modoboa. Learn the content and destroy\n"
"the document as soon as possible.\n"
-msgstr "\nCher %s, ce document contient les identifiants dont vous aurez\nbesoin pour vous connecter à Modoboa. Apprenez les puis détruisez\nce document le plus rapidement possible.\n"
+msgstr ""
+"\n"
+"Cher %s, ce document contient les identifiants dont vous aurez\n"
+"besoin pour vous connecter à Modoboa. Apprenez les puis détruisez\n"
+"ce document le plus rapidement possible.\n"
#: pdfcredentials/documents.py:95
msgid "Web panel:"
@@ -2361,7 +2669,10 @@ msgid ""
"\n"
"Here you can view your emails anytime online, create filters or manage\n"
"your contacts.\n"
-msgstr "\nD'ici vous pouvez consulter vos emails en ligne n'importe quand, créer des filtres ou gérer vos contacts.\n"
+msgstr ""
+"\n"
+"D'ici vous pouvez consulter vos emails en ligne n'importe quand, créer des "
+"filtres ou gérer vos contacts.\n"
#: pdfcredentials/documents.py:126
msgid "Please change your password!"
@@ -2373,13 +2684,17 @@ msgstr "Configuration PC/Tablette/Smartphone :"
#: pdfcredentials/documents.py:153
msgid "Use those settings for your computer, tablet or phone."
-msgstr "Utilisez ces paramètres pour votre ordinateur, votre tablette ou votre téléphone."
+msgstr ""
+"Utilisez ces paramètres pour votre ordinateur, votre tablette ou votre "
+"téléphone."
#: pdfcredentials/handlers.py:35
msgid ""
"Failed to create PDF_credentials directory. Please check the permissions or "
"the path."
-msgstr "Echec lors de la création du répertoire PDF_credentials. Veuillez vérifier les permissions et le chemin d'accès."
+msgstr ""
+"Echec lors de la création du répertoire PDF_credentials. Veuillez vérifier "
+"les permissions et le chemin d'accès."
#: pdfcredentials/handlers.py:64
msgid "Download PDF credentials"
@@ -2387,18 +2702,23 @@ msgstr "Télécharger les identifiants PDF"
#: pdfcredentials/lib.py:29
msgid "Can't write to selected directory to store PDF documents"
-msgstr "Impossible d'écrire dans le répertoire sélectionné pour stocker les documents PDF"
+msgstr ""
+"Impossible d'écrire dans le répertoire sélectionné pour stocker les "
+"documents PDF"
#: pdfcredentials/lib.py:35
#, python-format
msgid "Failed to create the directory that will contain PDF documents (%s)"
-msgstr "Echec lors de la création du répertoire qui contiendra les documents PDF (%s)"
+msgstr ""
+"Echec lors de la création du répertoire qui contiendra les documents PDF (%s)"
#: pdfcredentials/lib.py:82
msgid ""
"Failed to create PDF_credentials file. Please check the permissions or the "
"path."
-msgstr "Echec lors de la création du fichier PDF_credentials. Veuillez vérifier les permissions et le chemin d'accès."
+msgstr ""
+"Echec lors de la création du fichier PDF_credentials. Veuillez vérifier les "
+"permissions et le chemin d'accès."
#: policyd/core.py:99
msgid "Daily sending limit reached"
@@ -2415,7 +2735,8 @@ msgstr "[modoboa] Limite d'envoi atteinte"
#: policyd/templates/policyd/notifications/limit_reached.html:3
#, python-format
msgid "Daily limit of the following %(ltype)s has been reached: %(name)s."
-msgstr "Limite quotidienne d'envoi du %(ltype)s suivant a été atteinte : %(name)s."
+msgstr ""
+"Limite quotidienne d'envoi du %(ltype)s suivant a été atteinte : %(name)s."
#: relaydomains/api/v1/serializers.py:24
msgid "Unsupported service"
@@ -2455,9 +2776,11 @@ msgstr "Chemin d'accès vers le fichier des clés"
#: rspamd/app_settings.py:21
msgid ""
-"Absolute path of the file which contains paths to DKIM private keys. Must be"
-" readable by _rspamd group or user."
-msgstr "Chemin absolu vers le fichier qui contient les chemins vers les clés privées DKIM. Doit être accessible en lecture par l'utilisateur ou le groupe _rspamd."
+"Absolute path of the file which contains paths to DKIM private keys. Must be "
+"readable by _rspamd group or user."
+msgstr ""
+"Chemin absolu vers le fichier qui contient les chemins vers les clés privées "
+"DKIM. Doit être accessible en lecture par l'utilisateur ou le groupe _rspamd."
#: rspamd/app_settings.py:30
msgid "Selector map path"
@@ -2467,7 +2790,9 @@ msgstr "Chemin d'accès vers le fichier des sélecteurs"
msgid ""
"Absolute path of the file which contains names of DKIM selectors. Must be "
"readable by _rspamd group or user."
-msgstr "Chemin absolu vers le fichier qui contient le nom des sélecteurs DKIM. Doit être accessible en lecture par l'utilisateur ou le groupe _rspamd."
+msgstr ""
+"Chemin absolu vers le fichier qui contient le nom des sélecteurs DKIM. Doit "
+"être accessible en lecture par l'utilisateur ou le groupe _rspamd."
#: rspamd/app_settings.py:51
msgid "Rspamd dashboard location"
@@ -2475,10 +2800,12 @@ msgstr "Emplacement du tableau de bord Rspamd"
#: rspamd/app_settings.py:53
msgid ""
-"Location of the rspamd dashboard. Can either be a relative URL (eg. "
-"'/rspamd') or a full URL (eg. 'https://rspamd.domain.tld/').Only use for "
+"Location of the rspamd dashboard. Can either be a relative URL (eg. '/"
+"rspamd') or a full URL (eg. 'https://rspamd.domain.tld/').Only use for "
"guidance on the Super-Admin dashboard."
-msgstr "Emplacement du dashboard rspamd. Peut être soit une URL relative (ie. '/rspamd') ou une URL complète (ie. 'https://rspamd.domain.tld')."
+msgstr ""
+"Emplacement du dashboard rspamd. Peut être soit une URL relative (ie. '/"
+"rspamd') ou une URL complète (ie. 'https://rspamd.domain.tld')."
#: rspamd/apps.py:18
msgid "Rspamd"
@@ -2601,11 +2928,12 @@ msgstr "Rejeter le message"
msgid "Stop processing"
msgstr "Arrêter le traitement"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
-msgstr "La connexion au serveur MANAGESIEVE a échoué, vérifiez votre configuration"
+msgstr ""
+"La connexion au serveur MANAGESIEVE a échoué, vérifiez votre configuration"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr "Pas assez d'espace sur le serveur"
@@ -2658,7 +2986,9 @@ msgstr "Mot de passe oublié ?"
msgid ""
"Your password has been set. You may go ahead and sign "
"in now."
-msgstr "Votre mot de passe a été défini. Vous pouvez continuer et vous connecter dès maintenant."
+msgstr ""
+"Votre mot de passe a été défini. Vous pouvez continuer et vous connecter dès maintenant."
#: templates/registration/password_reset_confirm.html:8
msgid "Change password"
@@ -2674,7 +3004,10 @@ msgstr "Soumettre"
msgid ""
"The password reset link was invalid, possibly because it has already been "
"used. Please request a new password reset."
-msgstr "Le lien de réinitialisation du mot de passe était invalide, probablement parce qu'il a déjà été utilisé. Merci de demander une nouvelle réinitialisation de mot de passe."
+msgstr ""
+"Le lien de réinitialisation du mot de passe était invalide, probablement "
+"parce qu'il a déjà été utilisé. Merci de demander une nouvelle "
+"réinitialisation de mot de passe."
#: templates/registration/password_reset_confirm_code.html:22
msgid "Enter the code you've just received by SMS"
@@ -2694,7 +3027,12 @@ msgid ""
"exists with the email you entered. You should receive them shortly.
"
"If you don't receive an email, please make sure you've entered your "
"primary address, and check your spam folder.
"
-msgstr "Nous vous avons envoyé par email les instructions pour définir votre mot de passe, pour peu qu'un compte avec l'email que vous avez renseigné existe. Vous devriez les recevoir rapidement.
Si vous ne recevez pas d'email, merci de vérifier que vous avez renseigné votre adresse principale et de vérifier votre dossier spam.
"
+msgstr ""
+"Nous vous avons envoyé par email les instructions pour définir votre mot "
+"de passe, pour peu qu'un compte avec l'email que vous avez renseigné existe. "
+"Vous devriez les recevoir rapidement.
Si vous ne recevez pas d'email, "
+"merci de vérifier que vous avez renseigné votre adresse principale et de "
+"vérifier votre dossier spam.
"
#: templates/registration/password_reset_email.html:4
#: templates/registration/password_reset_email_v2.html:4
@@ -2702,14 +3040,18 @@ msgstr "Nous vous avons envoyé par email les instructions pour définir votr
msgid ""
"To initiate the password reset process for your %(username)s Modoboa "
"account, click the link below:"
-msgstr "Pour initier la procédure de réinitialisation du mot de passe de votre compte Modoboa %(username)s, cliquez sur le lien ci-dessous :"
+msgstr ""
+"Pour initier la procédure de réinitialisation du mot de passe de votre "
+"compte Modoboa %(username)s, cliquez sur le lien ci-dessous :"
#: templates/registration/password_reset_email.html:10
#: templates/registration/password_reset_email_v2.html:10
msgid ""
"If clicking the link above doesn't work, please copy and paste the URL in a "
"new browser window instead."
-msgstr "Si cliquer sur lien ci-dessous ne fonctionne pas, merci de copier / coller cette URL dans une nouvelle fenêtre navigateur à la place."
+msgstr ""
+"Si cliquer sur lien ci-dessous ne fonctionne pas, merci de copier / coller "
+"cette URL dans une nouvelle fenêtre navigateur à la place."
#: templates/registration/password_reset_email.html:14
#: templates/registration/password_reset_email_v2.html:14
@@ -2738,9 +3080,12 @@ msgstr "Mot de passe jetable"
#: templates/registration/twofactor_code_verify.html:35
msgid ""
-"Enter the code from the two-factor app on your mobile device. If you've lost"
-" your device, you may enter one of your recovery codes."
-msgstr "Renseignez le code provenant de l'application double-facteur de votre téléphone mobile. Si vous avez perdu votre téléphone, vous pouvez utiliser l'un de vos codes de récupération."
+"Enter the code from the two-factor app on your mobile device. If you've lost "
+"your device, you may enter one of your recovery codes."
+msgstr ""
+"Renseignez le code provenant de l'application double-facteur de votre "
+"téléphone mobile. Si vous avez perdu votre téléphone, vous pouvez utiliser "
+"l'un de vos codes de récupération."
#: templates/registration/twofactor_code_verify.html:42
msgid "Verify code"
@@ -2777,7 +3122,8 @@ msgstr "Taille maximale d'une pièce jointe"
#: webmail/app_settings.py:19
msgid "Maximum attachment size in bytes (or KB, MB, GB if specified)"
-msgstr "Taille maximale d'une pièce jointe en octets (ou KB, MG, GB si précisé)"
+msgstr ""
+"Taille maximale d'une pièce jointe en octets (ou KB, MG, GB si précisé)"
#: webmail/app_settings.py:67
msgid "SMTP settings"
@@ -2907,7 +3253,7 @@ msgstr "Texte de signature"
msgid "User defined email signature"
msgstr "Signature email personnalisée"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr "Impossible de supprimer la pièce jointe :"
@@ -2915,7 +3261,7 @@ msgstr "Impossible de supprimer la pièce jointe :"
msgid "Date"
msgstr "Date"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Echec lors de la récupération du séparateur de hierarchie"
diff --git a/modoboa/locale/hu/LC_MESSAGES/django.po b/modoboa/locale/hu/LC_MESSAGES/django.po
index a60f00f3c..78b7e4b7d 100644
--- a/modoboa/locale/hu/LC_MESSAGES/django.po
+++ b/modoboa/locale/hu/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,75 +18,75 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -94,56 +94,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -155,11 +155,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -424,12 +424,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -578,7 +578,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -774,7 +774,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -875,7 +875,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -887,24 +887,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -979,410 +979,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1474,59 +1566,59 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr ""
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1853,7 +1945,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1885,21 +1977,21 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2587,11 +2679,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2893,7 +2985,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr ""
@@ -2901,7 +2993,7 @@ msgstr ""
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/it/LC_MESSAGES/django.po b/modoboa/locale/it/LC_MESSAGES/django.po
index 16a79e38f..71cfd05fd 100644
--- a/modoboa/locale/it/LC_MESSAGES/django.po
+++ b/modoboa/locale/it/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2018-11-01 16:31+0000\n"
"Last-Translator: marcotrevisan \n"
"Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/"
@@ -22,7 +22,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -30,77 +30,77 @@ msgstr ""
"Spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB "
"(predefinito) o GB. Il valore 0 indica nessun limite."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
"Spazio massimo predefinito in MB applicato alle caselle di posta. Un valore "
"0 indica nessun limite."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
msgid "domain alias with this name already exists"
msgstr "Un alias con questo nome esiste già"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Non è stato trovato alcun record MX autorizzato per questo dominio"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
"Non può essere maggiore dello spazio massimo definito a livello di dominio"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Permesso negato."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Questo campo è obbligatorio"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Lista dei domini amministrati (solo per rivenditori e amministratori di "
"dominio)."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Non consentito per questo ruolo."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Deve essere uguale a full_address della casella di posta"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Questo campo è obbligatorio."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Il dominio locale {} non esiste"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Una lista di destinatari"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "L'utente '%s' esiste già"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "Non hai accesso a questo dominio"
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "Non hai accesso a questa casella di posta."
@@ -108,58 +108,58 @@ msgstr "Non hai accesso a questa casella di posta."
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "Cartella di salvataggio per le chiavi DKIM non configurata."
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Non puoi definire uno spazio illimitato."
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "L'utente '%s' esiste già"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Dev'essere un intero positivo"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "openssl non trovato, assicurarsi che sia installato."
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Cartella non trovata."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Definire almeno una rete / indirizzo autorizzato"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
#, fuzzy
#| msgid "A mailbox is required"
msgid "A mailbox is required to create aliases."
msgstr "É necessaria una casella"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown"
msgid "Unknown status"
@@ -173,11 +173,11 @@ msgstr "Non hai accesso a questo dominio"
msgid "You can't delete your own domain"
msgstr "Non puoi cancellare il tuo dominio"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -491,12 +491,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Formato di indirizzo IP non valido per {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "L'oggetto esiste già: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d oggetti importati correttamente"
@@ -655,7 +655,7 @@ msgid "Key length"
msgstr "Lunghezza della chiave"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Riga non valida"
@@ -899,7 +899,7 @@ msgstr ""
"Permetti a questo amministratore di accedere alle caselle di posta degli "
"utenti"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Varie"
@@ -1012,7 +1012,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -1026,24 +1026,24 @@ msgstr ""
msgid "Local"
msgstr "Locale"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Profilo utente"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Sintassi errata"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Numero di cicli non valido"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -1131,122 +1131,132 @@ msgstr "Lunghezza della password casuale"
msgid "Length of randomly generated passwords."
msgstr "Lunghezza delle password generate casualmente"
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Lunghezza delle password generate casualmente"
+
+#: core/app_settings.py:114
#, fuzzy
#| msgid "Update password scheme"
msgid "Update password service URL"
msgstr "Aggiorna lo schema di password"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Indirizzo del server"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "L'indirizzo IP o il DNS name del server LDAP"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Porta del server"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Il numero della porta TCP utilizzata dal server LDAP"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
#, fuzzy
#| msgid "Server address"
msgid "Secondary server address"
msgstr "Indirizzo del server"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
#, fuzzy
#| msgid "The IP address or the DNS name of the LDAP server"
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "L'indirizzo IP o il DNS name del server LDAP"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
#, fuzzy
#| msgid "Server port"
msgid "Secondary server port"
msgstr "Porta del server"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
#, fuzzy
#| msgid "The TCP port number used by the LDAP server"
msgid "The TCP port number used by the LDAP secondary server"
msgstr "Il numero della porta TCP utilizzata dal server LDAP"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Usa una connessione sicura"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Usa una connessione SSL/STARTTLS per l'accesso al server LDAP"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Segnala se il server LDAP è una Active Directory"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Gruppi degli amministratori"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1255,51 +1265,51 @@ msgstr ""
"amministratori di dominio. Utilizza il carattere ';' per separare valori "
"multipli."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Tipo di gruppo"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "Il tipo di gruppo LDAP da utilizzare nella Directory"
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Base di ricerca per i gruppi"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
"DN (Nome distinto univoco) della base di ricerca utilizzato per trovare i "
"gruppi"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Attributo della password"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "L'attributo utilizzato per memorizzare le password degli utenti"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
#, fuzzy
#| msgid "Authentication method"
msgid "LDAP authentication settings"
msgstr "Metodo di autenticazione"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Metodo di autenticazione"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Scegli il metodo di autenticazione da usare"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Collega DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1307,31 +1317,31 @@ msgstr ""
"DN (Nome distinto univoco) da usare quando ci si collega al server LDAP. "
"Lasciare vuoto per un collegamento anonimo"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Password del collegamento"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"La password da utilizzare quando ci si collega al server LDAP (con 'Collega "
"DN')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Base di ricerca per gli utenti"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
"DN (Nome distinto univoco) della base di ricerca utilizzata per cercare gli "
"utenti"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Filtro ricerca"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1339,11 +1349,11 @@ msgstr ""
"Stringa di filtraggio opzionale (p.es '(objectClass=person)'). Per essere "
"valida deve essere racchiusa tra parentesi."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Modello DN dell'utente"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1352,38 +1362,38 @@ msgstr ""
"Il modello utilizzato per comporre il DN degli utenti. Deve contenere un "
"segnaposto (p.es. %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
#, fuzzy
#| msgid "LDAP settings"
msgid "LDAP synchronization settings"
msgstr "Impostazioni LDAP"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
#, fuzzy
#| msgid "User DN template"
msgid "Account DN template"
msgstr "Modello DN dell'utente"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, fuzzy, python-format
#| msgid ""
#| "The template used to construct a user's DN. It should contain one "
@@ -1395,134 +1405,204 @@ msgstr ""
"Il modello utilizzato per comporre il DN degli utenti. Deve contenere un "
"segnaposto (p.es. %(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
#, fuzzy
#| msgid "Password attribute"
msgid "Username attribute"
msgstr "Attributo della password"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
#, fuzzy
#| msgid "Enable communication"
msgid "Enable Dovecot LDAP sync"
msgstr "Abilita comunicazione"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom message"
+msgid "Custom welcome message"
+msgstr "Messaggio personalizzato"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid "A custom message that will appear at the end of documents"
+msgid "A welcome message that will be displayed instead the default one"
+msgstr "Un messaggio personalizzato comparirà alla fine dei documenti"
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "RSS feed custom"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr "Mostra RSS feed custom a rivenditori e amministratori di dominio"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr "Mostra RSS feed custom a rivenditori e amministratori di dominio"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr "Mostra RSS feed custom a rivenditori e amministratori di dominio"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Nascondi il widget delle feature"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Email alternativa"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Notifiche"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Indirizzo di invio"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Indirizzo email utilizzato per inviare le notifiche"
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "API pubblica"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Abilita comunicazione"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Controlla automaticamente se è disponibile una nuova versione"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Controlla nuove versioni"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Destinatario"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Invia statistiche"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Invia statistiche all'API pubblica di modoboa (contatori ed estensioni "
"utilizzate)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Soglia account inattivo"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Soglia account inattivo"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1530,61 +1610,85 @@ msgstr ""
"Un account con una data di ultimo accesso più vecchia di questa soglia (in "
"giorni) verrà considerato inattivo"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Intervallo notifiche"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Intervallo di tempo per la ricerca di nuove notifiche (in secondi)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Età massima dei log"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "La persistenza massima in giorni dei log"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Elementi per pagina"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Numero degli elementi visualizzati in ciascuna pagina"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Reindirizzamento principale predefinito"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"Redirezione predefinita utilizzata quando non è specificata alcuna "
"applicazione"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Imposta `USE_TZ = True` in settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Update password scheme"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Aggiorna lo schema di password"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Utente semplice"
@@ -1682,64 +1786,64 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "Sono disponibili nuovi aggiornamenti"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Consenti l'accesso alle caselle di posta"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
"Permetti a questo amministratore di accedere alle caselle di posta degli "
"utenti"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "password"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "lingua"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Lingua preferita per la visualizzazione delle pagine"
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Numero di telefono"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Email alternativa"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
"Un indirizzo email alternativo, da utilizzare per il recupero password."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Aggiornamento della password fallito: il modulo LDAP non è installato"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "account"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Sconosciuto"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Non puoi importare un account con un ruolo superiore al tuo"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "L'utente '%s' deve avere un indirizzo email valido"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2091,7 +2195,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr "Migrazione IMAP"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to IMAP server failed: {error}"
@@ -2124,24 +2228,24 @@ msgstr "Impossibile eliminare l'account LDAP: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "Impossibile disabilitare l'account LDAP: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Abilita la comunicazione con l'API pubblica di modoboa"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "impossibile determinare la codifica della stringa"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Accesso negato: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Accesso negato"
@@ -2924,14 +3028,14 @@ msgstr "Rifiuta il messaggio"
msgid "Stop processing"
msgstr "Termina l'elaborazione"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
#, fuzzy
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
"Connessione al server MANAGESIEVE fallita, controlla la tua configurazione"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3288,7 +3392,7 @@ msgstr "Testo signature"
msgid "User defined email signature"
msgstr "Signature delle e-mail personalizzato dall'utente"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to remove filter"
msgid "Failed to remove attachment: "
@@ -3298,7 +3402,7 @@ msgstr "Rimozione allegato fallita: "
msgid "Date"
msgstr "Data"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Impossibile recuperare il delimitatore delle gerarchie"
@@ -3328,6 +3432,3 @@ msgstr ""
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr "L'allegato è troppo grande (limite: %s)"
-
-#~ msgid "Automatic reply timeout"
-#~ msgstr "Tempo massimo della risposta automatica"
diff --git a/modoboa/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/locale/ja_JP/LC_MESSAGES/django.po
index 71bb12583..7de0bcbe1 100644
--- a/modoboa/locale/ja_JP/LC_MESSAGES/django.po
+++ b/modoboa/locale/ja_JP/LC_MESSAGES/django.po
@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
-#
+#
# Translators:
# cwatanab , 2016
# Ian Moone, 2014
@@ -12,85 +12,90 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2011-07-01 08:15+0000\n"
"Last-Translator: INOUE Daisuke, 2025\n"
-"Language-Team: Japanese (Japan) (http://app.transifex.com/tonio/modoboa/language/ja_JP/)\n"
+"Language-Team: Japanese (Japan) (http://app.transifex.com/tonio/modoboa/"
+"language/ja_JP/)\n"
+"Language: ja_JP\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: ja_JP\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
-msgstr "すべてのメールボックス全体の容量制限。KB、MB(デフォルト)または GB で指定します。値を 0 にすると容量制限しないことを意味します。"
+msgstr ""
+"すべてのメールボックス全体の容量制限。KB、MB(デフォルト)または GB で指定し"
+"ます。値を 0 にすると容量制限しないことを意味します。"
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr "メールボックスの容量制限のデフォルト値を MB で指定します。値を 0 にすると容量制限しません。"
+msgstr ""
+"メールボックスの容量制限のデフォルト値を MB で指定します。値を 0 にすると容量"
+"制限しません。"
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr "この名前のドメインエイリアスがすでに存在します"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "このドメインの承認済み MX レコードが見つかりません"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "ドメインの容量制限より大きくすることはできません"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "権限がありません。"
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "このフィールドは必須です"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr "管理下ドメイン一覧 ( リセラーとドメイン管理者のみ )"
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "このロールは許可されていません。"
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "メールボックスの full_address と同じにしてください"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "このフィールドは必須です。"
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "ローカルドメイン {} は、存在しません"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "受信者一覧"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr "このエイリアスはすでに存在します"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "このドメインにはアクセスできません。"
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "このメールボックスにアクセスできません。"
@@ -98,56 +103,56 @@ msgstr "このメールボックスにアクセスできません。"
msgid "Here is your new Modoboa password: {}"
msgstr "Modoboa の新しいパスワード : {}"
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "DKIM キー保存ディレクトリーを設定してください"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr "この項目はリレードメインの設定の際に有効です"
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "容量制限を無制限に設定できません。"
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "ユーザー「%s」はすでに存在します"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "正の整数を入力してください"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "openssl が見つかりません。インストールを確認してください。"
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "ディレクトリーが見つかりません。"
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr "有効な IP アドレス ( またはネットワーク ) を入力してください"
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr "この設定を無効にする前に、IMAP 移行を無効にしてください。"
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "認証済みのネットワークかアドレスを少なくとも 1 つ以上定義してください"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr "メールアドレスの左部分を 64 文字以下にしてください。"
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr "エイリアスを作成するにはメールボックスが必要です。"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr "不明な状態"
@@ -159,11 +164,11 @@ msgstr "このドメインにはアクセスできません"
msgid "You can't delete your own domain"
msgstr "自分自身のドメインは削除できません"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr "アラート ID が指定されていません"
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr "無効なアラート ID を受信"
@@ -185,9 +190,11 @@ msgstr "有効な MX"
#: admin/app_settings.py:37
msgid ""
-"A list of IP or network address every MX record should match. A warning will"
-" be sent if a record does not respect it."
-msgstr "各 MX レコードにマッチすることを期待する IP またはネットワークアドレスのリスト。レコードが期待通りでない場合は、警告を送信します。"
+"A list of IP or network address every MX record should match. A warning will "
+"be sent if a record does not respect it."
+msgstr ""
+"各 MX レコードにマッチすることを期待する IP またはネットワークアドレスのリス"
+"ト。レコードが期待通りでない場合は、警告を送信します。"
#: admin/app_settings.py:47
msgid "New domains must use authorized MX(s)"
@@ -197,7 +204,9 @@ msgstr "新しいドメインには承認済みの MX 利用を強制"
msgid ""
"Prevent the creation of a new domain if its MX record does not use one of "
"the defined addresses."
-msgstr "MX レコードが定義したアドレスのいずれかを使用していない場合、新しいドメインの作成を防止します。"
+msgstr ""
+"MX レコードが定義したアドレスのいずれかを使用していない場合、新しいドメインの"
+"作成を防止します。"
#: admin/app_settings.py:59
msgid "Enable IPV6 checks"
@@ -221,7 +230,9 @@ msgstr "DKIM チェック有効"
#: admin/app_settings.py:80
msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
-msgstr "各 DKIM 署名のあるすべてのドメインに有効な DNS レコードがあるかをチェックします"
+msgstr ""
+"各 DKIM 署名のあるすべてのドメインに有効な DNS レコードがあるかをチェックしま"
+"す"
#: admin/app_settings.py:88
msgid "Enable DMARC checks"
@@ -253,7 +264,9 @@ msgstr "カスタム DNS サーバー"
#: admin/app_settings.py:118
msgid "Use a custom DNS server instead of local server configuration"
-msgstr "ローカルサーバーで設定された DNS サーバーではなく、カスタム DNS サーバーを利用します"
+msgstr ""
+"ローカルサーバーで設定された DNS サーバーではなく、カスタム DNS サーバーを利"
+"用します"
#: admin/app_settings.py:126
msgid "DKIM keys storage directory"
@@ -264,7 +277,9 @@ msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
-msgstr "DKIM プライベートキーを保存するディレクトリーの絶対パス。このディレクトリーが root ユーザー所有で、外の世界からは読めないことを確認してください。"
+msgstr ""
+"DKIM プライベートキーを保存するディレクトリーの絶対パス。このディレクトリー"
+"が root ユーザー所有で、外の世界からは読めないことを確認してください。"
#: admin/app_settings.py:137
msgid "Default DKIM key length"
@@ -282,7 +297,9 @@ msgstr "ドメイン容量制限のデフォルト"
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
-msgstr "特に値をせずに新たにドメインを作成する際の容量制限のデフォルト値 ( MB ) 。値を 0 にすると容量制限しません。"
+msgstr ""
+"特に値をせずに新たにドメインを作成する際の容量制限のデフォルト値 ( MB ) 。値"
+"を 0 にすると容量制限しません。"
#: admin/app_settings.py:156
msgid "Default domain sending limit"
@@ -292,7 +309,9 @@ msgstr "ドメイン送信通数制限のデフォルト"
msgid ""
"Number of messages freshly created domains will be allowed to send per day. "
"Leave empty for no limit."
-msgstr "新たにドメインを作成する際、1 日間に送信可能なメッセージ数。空にすると制限しません。"
+msgstr ""
+"新たにドメインを作成する際、1 日間に送信可能なメッセージ数。空にすると制限し"
+"ません。"
#: admin/app_settings.py:170 limits/app_settings.py:61
#: limits/app_settings.py:135 limits/constants.py:31 limits/constants.py:84
@@ -307,7 +326,9 @@ msgstr "ファイルシステムのメールボックスも操作"
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
-msgstr "Modoboa でメールボックスを変名・削除すると、ファイルシステム上も変名・削除する"
+msgstr ""
+"Modoboa でメールボックスを変名・削除すると、ファイルシステム上も変名・削除す"
+"る"
#: admin/app_settings.py:186 admin/models/domain.py:36
msgid "Default mailbox quota"
@@ -317,7 +338,9 @@ msgstr "メールボックス容量制限のデフォルト"
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
-msgstr "特に値をせずに新たにドメインを作成する際の、メールボックスの容量制限のデフォルト値 ( MB ) 。値を 0 にすると容量制限しません。"
+msgstr ""
+"特に値をせずに新たにドメインを作成する際の、メールボックスの容量制限のデフォ"
+"ルト値 ( MB ) 。値を 0 にすると容量制限しません。"
#: admin/app_settings.py:197
msgid "Default mailbox sending limit"
@@ -327,7 +350,9 @@ msgstr "メールボックス送信通数制限のデフォルト"
msgid ""
"Number of messages freshly created mailboxes will be allowed to send per "
"day. Leave empty for no limit."
-msgstr "新たにメールボックスを作成する際に設定する、1 日に送信できるメッセージ数。空にすると制限しません。"
+msgstr ""
+"新たにメールボックスを作成する際に設定する、1 日に送信できるメッセージ数。空"
+"にすると制限しません。"
#: admin/app_settings.py:207
msgid "Automatic account removal"
@@ -342,8 +367,7 @@ msgid "Automatic domain/mailbox creation"
msgstr "自動ドメイン・メールボックス作成"
#: admin/app_settings.py:221
-msgid ""
-"Create a domain and a mailbox when an account is automatically created."
+msgid "Create a domain and a mailbox when an account is automatically created."
msgstr "アカウントを作成するとドメインとメールボックスも自動で作成します。"
#: admin/app_settings.py:230
@@ -352,7 +376,8 @@ msgstr "メールボックスの変名でエイリアスを作成"
#: admin/app_settings.py:233
msgid "Create an alias using the old address when a mailbox is renamed."
-msgstr "メールボックスの名前を変更する際、古いアドレスをエイリアスとして作成します。"
+msgstr ""
+"メールボックスの名前を変更する際、古いアドレスをエイリアスとして作成します。"
#: admin/app_settings.py:287 core/api/v2/viewsets.py:162
msgid "Administration"
@@ -418,7 +443,8 @@ msgstr "稼働しているサーバーが見つかりません"
#: admin/lib.py:232 admin/tests/test_mx.py:160
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
-msgstr "DNS 名前解決でタイムアウトが発生し、今のところ %s の問い合わせはできません"
+msgstr ""
+"DNS 名前解決でタイムアウトが発生し、今のところ %s の問い合わせはできません"
#: admin/lib.py:236
msgid "DNS name is too long: {}"
@@ -429,19 +455,20 @@ msgstr "DNS 名が長すぎます : {}"
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "{domain} の IP アドレス書式が無効です : {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "オブジェクトはすでに存在します : %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d 個のオブジェクトをインポートしました"
#: admin/management/commands/subcommands/_import.py:97
msgid "CSV file is not encoded in UTF-8, attempting to guess encoding"
-msgstr "CSV ファイルが UTF-8 でエンコードされていません。エンコードの推測を試みます"
+msgstr ""
+"CSV ファイルが UTF-8 でエンコードされていません。エンコードの推測を試みます"
#: admin/management/commands/subcommands/_import.py:112
#, python-format
@@ -457,7 +484,9 @@ msgstr "%(encoding)s エンコードでは CSV ファイルをデコードでき
msgid ""
"DKIM path non-writable (either a permission issue or the directory does not "
"exist)"
-msgstr "DKIM パスが書き込みできません ( 権限問題か、ディレクトリーが存在しないかのいずれかです )"
+msgstr ""
+"DKIM パスが書き込みできません ( 権限問題か、ディレクトリーが存在しないかのい"
+"ずれかです )"
#: admin/management/commands/subcommands/_manage_dkim_keys.py:52
msgid "Failed to generate DKIM private key"
@@ -583,7 +612,7 @@ msgid "Key length"
msgstr "キー長"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "行が無効"
@@ -601,7 +630,9 @@ msgstr "{} : ドメインの各メールボックスの容量制限の値が無
#: admin/models/domain.py:350
msgid "{}: default mailbox quota cannot be greater than domain quota"
-msgstr "{} : 各メールボックスの容量制限の値は、ドメインの容量制限の値より小さくしてください"
+msgstr ""
+"{} : 各メールボックスの容量制限の値は、ドメインの容量制限の値より小さくしてく"
+"ださい"
#: admin/models/domain_alias.py:36
msgid "The alias name"
@@ -657,7 +688,10 @@ msgid ""
"The domain's reputation will be affected and there is a chance that emails "
"coming from it are considered as spam. You should contact those providers "
"and ask them to unlist detected IP address(es)."
-msgstr "ドメインの格付けが影響を与え、このドメインからのメールが SPAM とみなされる可能性があります。DNSBL 提供元に連絡し、検出された IP アドレスのリストからの削除を依頼する必要があります。"
+msgstr ""
+"ドメインの格付けが影響を与え、このドメインからのメールが SPAM とみなされる可"
+"能性があります。DNSBL 提供元に連絡し、検出された IP アドレスのリストからの削"
+"除を依頼する必要があります。"
#: admin/templates/admin/notifications/domain_invalid_mx.html:3
#, python-format
@@ -720,7 +754,9 @@ msgstr "自動応答メッセージを自動生成する際の件名のデフォ
msgid ""
"Default content used when an auto-reply message is created automatically. "
"The '%(name)s' macro will be replaced by the user's full name."
-msgstr "自動応答メッセージを自動生成する際の本文のデフォルト値。「%(name)s」マクロはユーザーのフルネームに置き換えます。"
+msgstr ""
+"自動応答メッセージを自動生成する際の本文のデフォルト値。「%(name)s」マクロは"
+"ユーザーのフルネームに置き換えます。"
#: autoreply/apps.py:15
msgid "Automatic replies"
@@ -777,9 +813,10 @@ msgstr "カレンダー管理を許可"
#: calendars/app_settings.py:48
msgid "Allow domain administrators to manage user calendars (read and write)"
-msgstr "ドメイン管理者にユーザーカレンダーの管理 ( 読み取り・書き込み ) を許可します"
+msgstr ""
+"ドメイン管理者にユーザーカレンダーの管理 ( 読み取り・書き込み ) を許可します"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "その他"
@@ -791,7 +828,8 @@ msgstr "ICS ファイルの最大サイズ"
#: calendars/app_settings.py:68
msgid ""
"Maximum size in bytes of imported ICS files (or KB, MB, GB if specified)"
-msgstr "インポートする ICS ファイルの最大サイズをバイト ( または KB、MB、GB ) で指定"
+msgstr ""
+"インポートする ICS ファイルの最大サイズをバイト ( または KB、MB、GB ) で指定"
#: calendars/app_settings.py:89 core/api/v2/viewsets.py:172
msgid "Calendars"
@@ -817,7 +855,9 @@ msgstr "CardDAV でアドレス帳を同期します"
msgid ""
"Choose to synchronize or not your address book using CardDAV. You will be "
"able to access your contacts from the outside."
-msgstr "CardDAV を使ってアドレス帳の同期を行うか・行わないかを選んでください。同期すると外からアドレス帳にアクセスできます。"
+msgstr ""
+"CardDAV を使ってアドレス帳の同期を行うか・行わないかを選んでください。同期す"
+"ると外からアドレス帳にアクセスできます。"
#: contacts/app_settings.py:29
msgid "Synchronization frequency"
@@ -880,7 +920,7 @@ msgstr "2FA はすでに有効です"
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr "「%s」から「%s」ユーザーの 2FA 設定変更は失敗"
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr "無効なパスワード"
@@ -892,25 +932,24 @@ msgstr "2 要素認証が無効"
msgid "Local"
msgstr "ローカル"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "ユーザープロフィール"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "不正な構文"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "不正なラウンド数"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr "このコードは無効です"
-#: core/api/v2/serializers.py:473 core/views/auth.py:194
-#: core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr "Modoboa のパスワード再設定で利用するコード : {}"
@@ -959,7 +998,9 @@ msgstr "ラウンド"
msgid ""
"Number of rounds to use (only used by sha256crypt and sha512crypt). Must be "
"between 1000 and 999999999, inclusive."
-msgstr "ラウンド数 ( sha256crypt と sha512crypt のみ使用 ) 。1000 ~ 999999999 の間で設定してください。"
+msgstr ""
+"ラウンド数 ( sha256crypt と sha512crypt のみ使用 ) 。1000 ~ 999999999 の間で"
+"設定してください。"
#: core/app_settings.py:73
msgid "Update password scheme at login"
@@ -967,7 +1008,9 @@ msgstr "ログイン時にパスワード スキーマを更新"
#: core/app_settings.py:76
msgid "Update user password at login to use the default password scheme"
-msgstr "デフォルトのパスワード スキーマに切り替えるため、ログイン時にパスワードを更新します"
+msgstr ""
+"デフォルトのパスワード スキーマに切り替えるため、ログイン時にパスワードを更新"
+"します"
#: core/app_settings.py:84
msgid "Default password"
@@ -985,410 +1028,537 @@ msgstr "ランダムパスワード長"
msgid "Length of randomly generated passwords."
msgstr "ランダムで生成するパスワードの長さ。"
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "ランダムで生成するパスワードの長さ。"
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "パスワードサービス URL を更新"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
-msgstr "ユーザがパスワードを更新するための外部ページの URL。ローカルユーザー以外のユーザー、つまり外部認証 ( LDAP、SMTP ) が成功した後に自動作成されるユーザにのみ適用されます。"
+msgstr ""
+"ユーザがパスワードを更新するための外部ページの URL。ローカルユーザー以外の"
+"ユーザー、つまり外部認証 ( LDAP、SMTP ) が成功した後に自動作成されるユーザに"
+"のみ適用されます。"
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "パスワード再設定の案内"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr "パスワード再設定ページに表示する一時的なメッセージ"
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "SMS を使ったパスワード再設定"
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr "電話番号を入力したユーザーは SMS によるパスワード再設定を有効にする"
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "SMS 事業者"
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr "パスワード再設定の SMS を送信する業者を選んでください"
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr "LDAP"
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "サーバーアドレス"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "LDAP サーバーの IP アドレスまたは DNS 名"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "サーバーポート"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "LDAP サーバーの TCP ポート番号"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "セカンダリーサーバー ( フォールバック ) を有効にする"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
-msgstr "セカンダリー LDAP サーバー。プライマリーサーバーで失敗した際に利用します。"
+msgstr ""
+"セカンダリー LDAP サーバー。プライマリーサーバーで失敗した際に利用します。"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "セカンダリーサーバー アドレス"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "セカンダリー LDAP サーバーの IP アドレスまたは DNS 名"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "セカンダリーサーバー ポート"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "セカンダリー LDAP サーバーの TCP ポート番号"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "暗号化接続を使う"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "LDAP サーバー に接続する際に SSL/STARTTLS を使います"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "LDAP サーバーは Active Directory ですか?"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "管理者グループ"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
-"Members of those LDAP Posix groups will be created as domain administrators."
-" Use ';' characters to separate groups."
-msgstr "ここで指定する LDAP の Posix グループのメンバーをドメイン管理者として作成します。複数のグループを指定する際は「;」で区切ってください。"
+"Members of those LDAP Posix groups will be created as domain administrators. "
+"Use ';' characters to separate groups."
+msgstr ""
+"ここで指定する LDAP の Posix グループのメンバーをドメイン管理者として作成しま"
+"す。複数のグループを指定する際は「;」で区切ってください。"
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "グループタイプ"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "ディレクトリーで使用している LDAP グループのタイプ。"
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "グループの検索ベース"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "グループを探す際の検索ベースの識別名 ( DN )"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "パスワード属性"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "ユーザーパスワードを格納している属性"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "LDAP 認証設定"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "認証方式"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "使用する認証方式を選択"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "バインド DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
-msgstr "LDAP サーバーにバインドする際の識別名。空のままにすると匿名バインドです。"
+msgstr ""
+"LDAP サーバーにバインドする際の識別名。空のままにすると匿名バインドです。"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "バインド パスワード"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr "(「バインド DN」で ) LDAP サーバーにバインドする際のパスワード"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "ユーザーの検索ベース"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "ユーザーを探す際の検索ベースの識別名 ( DN )"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "検索フィルター"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
-msgstr "オプションのフィルタ文字列 ( 例 : (objectClass=person) )。「()」カッコで囲まないと有効になりません。"
+msgstr ""
+"オプションのフィルタ文字列 ( 例 : (objectClass=person) )。「()」カッコで囲ま"
+"ないと有効になりません。"
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "ユーザー DN テンプレート"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
-msgstr "ユーザー DN を作成する際のテンプレート。1 つのプレースホルダー ( 例 : %(user)s ) を含めてください。"
+msgstr ""
+"ユーザー DN を作成する際のテンプレート。1 つのプレースホルダー ( 例 : "
+"%(user)s ) を含めてください。"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "LDAP 同期設定"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "LDAP へのエクスポートを有効"
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr "ローカル データベース・LDAP ディレクトリー間での自動同期を有効にする"
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr "ローカルアカウントを削除するとリモート LDAP のアカウントも削除する"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
-msgstr "ローカルアカウントを削除すると、リモートLDAPアカウントも削除、または無効にします。"
+msgstr ""
+"ローカルアカウントを削除すると、リモートLDAPアカウントも削除、または無効にし"
+"ます。"
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "アカウント DN テンプレート"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
-msgstr "アカウント DN を作成する際のテンプレート。1 つのプレースホルダー ( 例 : %(user)s ) を含めてください。"
+msgstr ""
+"アカウント DN を作成する際のテンプレート。1 つのプレースホルダー ( 例 : "
+"%(user)s ) を含めてください。"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "LDAP からのインポートを有効"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
-msgstr "LDAP ディレクトリーからローカル データベースへのアカウント同期を有効にします"
+msgstr ""
+"LDAP ディレクトリーからローカル データベースへのアカウント同期を有効にします"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "ユーザー名属性"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr "ユーザー名を格納している LDAP 属性名。"
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Dovecot LDAP 同期を有効"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr "LDAP 認証設定を Dovecot の設定に適用します。"
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Dovecot LDAP 設定ファイル"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr "Dovecot の LDAP 設定ファイルの場所。"
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "ダッシュボード"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom message"
+msgid "Custom welcome message"
+msgstr "カスタムメッセージ"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr "パスワード再設定ページに表示する一時的なメッセージ"
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "カスタム RSS フィード"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr "リセラーとドメイン管理者に表示する独自 RSS フィードを設定します。"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr "リセラーとドメイン管理者に表示する独自 RSS フィードを設定します。"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr "リセラーとドメイン管理者に表示する独自 RSS フィードを設定します。"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "機能ウィジェットを非表示に"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr "リセラーとドメイン管理者の機能ウィジェットを非表示にします"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "別のメールアドレス"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "通知"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "送信者アドレス"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "通知を送信するメールアドレスです。"
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "パブリック API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "通信を有効に"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "新しいバージョンのリリースを自動チェックする"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "新しいバージョンをチェックする"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "新バージョンリリースでメールを送信"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr "新しいバージョンがリリースされたら管理者にメールで通知"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "受信者"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "新しいバージョンのリリースを通知するメールの受信者を指定してください。"
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "統計を送信"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr "Modoboa パブリック API の統計 ( 数と利用拡張機能 ) を送信します"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr "非利用アカウント追跡を有効に"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
-"Allow the administrator to set a threshold (in days) beyond which an account"
-" is considered inactive if the user hasn't logged in"
-msgstr "ユーザーがログインしておらず、アカウント非利用とみなす期間 ( 日 ) を設定することを管理者に許可します"
+"Allow the administrator to set a threshold (in days) beyond which an account "
+"is considered inactive if the user hasn't logged in"
+msgstr ""
+"ユーザーがログインしておらず、アカウント非利用とみなす期間 ( 日 ) を設定する"
+"ことを管理者に許可します"
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "アカウントを非利用とみなすログイン間隔"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
-"An account with a last login date greater than this threshold (in days) will"
-" be considered as inactive"
-msgstr "最終ログイン日が、このしきい値 ( 日数 ) よりも以前になったアカウントを非利用とみなします"
+"An account with a last login date greater than this threshold (in days) will "
+"be considered as inactive"
+msgstr ""
+"最終ログイン日が、このしきい値 ( 日数 ) よりも以前になったアカウントを非利用"
+"とみなします"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "ページトップ通知のチェック間隔"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "2 つのページトップの通知のチェックの間隔 ( 秒 )"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "最大ログ記録期間"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "ログを記録する日数の最大期間"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "ページあたりの件数"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "ページあたりに表示される項目の数"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "デフォルトのリダイレクト先"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr "アプリケーションが未指定の際、デフォルトとなるリダイレクト先"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
-msgstr "USE_TZ を False にすると、夏時間・冬時間の移行の際に問題となる可能性があります ( 例 : 時計が変更されることで、同じローカル時刻が 2 度発生します )。"
+msgstr ""
+"USE_TZ を False にすると、夏時間・冬時間の移行の際に問題となる可能性がありま"
+"す ( 例 : 時計が変更されることで、同じローカル時刻が 2 度発生します )。"
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "「USE_TZ=True」を settings.py に設定してください"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr "ご利用のパスワード スキーマは現在非推奨です。"
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr "パスワード スキーマをより強力なものに更新してください"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "標準ユーザー"
@@ -1480,59 +1650,59 @@ msgstr "非推奨のパスワード スキーマ ( %s ) を利用しています
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] 新バージョン リリース"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "メールボックスのアクセスを許可"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "この管理者にユーザーのメールボックスへのアクセスを許可します"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "パスワード"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "言語"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "ページ表示で優先する言語。"
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "電話番号"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "別のメールアドレス"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr "別のメールアドレス。再設定が必要な際に利用します。"
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "パスワードの更新に失敗 : LDAP モジュールがインストールされていません"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "アカウント"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "不明"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "自分のロール以上のアカウントはインポートできません"
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr "標準ユーザー「{}」に有効なメールアドレスがありません"
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr "「{}」では、ユーザー名とメールアドレスの項目は同一にしてください。"
@@ -1615,7 +1785,9 @@ msgid ""
msgid_plural ""
"\n"
" The following updates are available:\n"
-msgstr[0] "\n 以下の更新が用意されています :\n"
+msgstr[0] ""
+"\n"
+" 以下の更新が用意されています :\n"
#: core/utils.py:43
msgid "The core part of Modoboa"
@@ -1634,7 +1806,9 @@ msgstr "パスワード スキーマが一致しません。%s のパスワー
#: core/views/auth.py:116
#, python-format
msgid "Password hash parameter missmatch. Updating %s password"
-msgstr "パスワードのハッシュ パラメーターが一致しません。%s パスワードを更新しています"
+msgstr ""
+"パスワードのハッシュ パラメーターが一致しません。%s パスワードを更新していま"
+"す"
#: core/views/auth.py:154
msgid "User '{}' successfully logged out"
@@ -1650,7 +1824,8 @@ msgstr "逆引きを有効に"
#: dmarc/forms.py:23
msgid "Enable reverse DNS lookups (reports will be longer to display)"
-msgstr "DNS の逆引きを有効にします ( レポート表示まで時間がかかるようになります )"
+msgstr ""
+"DNS の逆引きを有効にします ( レポート表示まで時間がかかるようになります )"
#: dmarc/forms.py:42
msgid "DMARC"
@@ -1846,15 +2021,17 @@ msgstr "対象フォルダーフィルター"
#: imap_migration/app_settings.py:76
msgid ""
"A comma seperated list of folders to explicitly include in sync even if "
-"filtered by the Folder Filter Exclusions. Example: debian.user, "
-"debian.personal "
-msgstr "除外フォルダーフィルターで対象から外れても同期に含めるフォルダーをカンマ区切りで明示します。例 : debian.user, debian.personal"
+"filtered by the Folder Filter Exclusions. Example: debian.user, debian."
+"personal "
+msgstr ""
+"除外フォルダーフィルターで対象から外れても同期に含めるフォルダーをカンマ区切"
+"りで明示します。例 : debian.user, debian.personal"
#: imap_migration/apps.py:20
msgid "IMAP Migration"
msgstr "IMAP 移行"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr "IMAP サーバーへの接続に失敗しました : {error}"
@@ -1863,7 +2040,8 @@ msgstr "IMAP サーバーへの接続に失敗しました : {error}"
msgid ""
"Automatic domain/mailbox creation is disabled which means IMAP "
"authentication won't work."
-msgstr "IMAP 認証が動作しない場合にドメイン・メールボックスの自動作成を無効にします。"
+msgstr ""
+"IMAP 認証が動作しない場合にドメイン・メールボックスの自動作成を無効にします。"
#: imap_migration/checks.py:16
msgid ""
@@ -1886,21 +2064,21 @@ msgstr "LDAP アカウントの削除に失敗 : {}"
msgid "Failed to disable LDAP account: {}"
msgstr "LDAP アカウントの無効化に失敗 : {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr "パブリック API での通信に失敗 : %s"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "文字列のエンコード検出ができませんでした"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr "アクセス拒否 : {}"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "アクセス拒否"
@@ -1937,13 +2115,17 @@ msgstr "ドメイン管理者数"
msgid ""
"Maximum number of allowed domain administrators for a new administrator. (0 "
"to deny any creation, -1 to allow unlimited creations)"
-msgstr "新しい管理者に作成を許可するドメイン管理者数の上限。( 0 で作成の拒否、-1 で無制限の作成 )"
+msgstr ""
+"新しい管理者に作成を許可するドメイン管理者数の上限。( 0 で作成の拒否、-1 で無"
+"制限の作成 )"
#: limits/app_settings.py:41
msgid ""
"Maximum number of allowed domains for a new administrator. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "新しい管理者に作成を許可するドメイン数の上限。( 0 で作成の拒否、-1 で無制限の作成 )"
+msgstr ""
+"新しい管理者に作成を許可するドメイン数の上限。( 0 で作成の拒否、-1 で無制限の"
+"作成 )"
#: limits/app_settings.py:49 limits/app_settings.py:123 limits/constants.py:22
#: limits/constants.py:76
@@ -1952,15 +2134,19 @@ msgstr "ドメインエイリアス"
#: limits/app_settings.py:52
msgid ""
-"Maximum number of allowed domain aliases for a new administrator. (0 to deny"
-" any creation, -1 to allow unlimited creations)"
-msgstr "新しい管理者に作成を許可するドメインエイリアス数の上限。( 0 で作成の拒否、-1 で無制限の作成 )"
+"Maximum number of allowed domain aliases for a new administrator. (0 to deny "
+"any creation, -1 to allow unlimited creations)"
+msgstr ""
+"新しい管理者に作成を許可するドメインエイリアス数の上限。( 0 で作成の拒否、-1 "
+"で無制限の作成 )"
#: limits/app_settings.py:64
msgid ""
"Maximum number of allowed mailboxes for a new administrator. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "新しい管理者に作成を許可するメールボックス数の上限。( 0 で作成の拒否、-1 で無制限の作成 )"
+msgstr ""
+"新しい管理者に作成を許可するメールボックス数の上限。( 0 で作成の拒否、-1 で無"
+"制限の作成 )"
#: limits/app_settings.py:73 limits/app_settings.py:146 limits/constants.py:39
#: limits/constants.py:92
@@ -1971,7 +2157,9 @@ msgstr "メールボックス エイリアス"
msgid ""
"Maximum number of allowed aliases for a new administrator. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "新しい管理者に作成を許可するエイリアス数の上限。( 0 で作成の拒否、-1 で無制限の作成 )"
+msgstr ""
+"新しい管理者に作成を許可するエイリアス数の上限。( 0 で作成の拒否、-1 で無制限"
+"の作成 )"
#: limits/app_settings.py:84 limits/constants.py:59
msgid "Quota"
@@ -1981,7 +2169,8 @@ msgstr "容量制限"
msgid ""
"The quota a reseller will be allowed to share between the domains he "
"creates. (0 means no quota)"
-msgstr "リセラーに対して許可する、作成するドメインの容量制限の合算値。( 0 で無制限 )"
+msgstr ""
+"リセラーに対して許可する、作成するドメインの容量制限の合算値。( 0 で無制限 )"
#: limits/app_settings.py:98
msgid "Default per-domain limits"
@@ -1997,27 +2186,35 @@ msgstr "ドメインごとの容量制限を有効もしくは無効にします
#: limits/app_settings.py:114
msgid ""
-"Maximum number of allowed domain administrators for a new domain. (0 to deny"
-" any creation, -1 to allow unlimited creations)"
-msgstr "新しいドメインに作成を許可するドメイン管理者数の上限。( 0 で作成の拒否、-1 で無制限の作成 )"
+"Maximum number of allowed domain administrators for a new domain. (0 to deny "
+"any creation, -1 to allow unlimited creations)"
+msgstr ""
+"新しいドメインに作成を許可するドメイン管理者数の上限。( 0 で作成の拒否、-1 で"
+"無制限の作成 )"
#: limits/app_settings.py:126
msgid ""
"Maximum number of allowed domain aliases for a new domain. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "新しいドメインに作成を許可するドメインエイリアス数の上限。( 0 で作成の拒否、-1 で無制限の作成 )"
+msgstr ""
+"新しいドメインに作成を許可するドメインエイリアス数の上限。( 0 で作成の拒"
+"否、-1 で無制限の作成 )"
#: limits/app_settings.py:138
msgid ""
"Maximum number of allowed mailboxes for a new domain. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "新しいドメインに作成を許可するメールボックス数の上限。( 0 で作成の拒否、-1 で無制限の作成 )"
+msgstr ""
+"新しいドメインに作成を許可するメールボックス数の上限。( 0 で作成の拒否、-1 で"
+"無制限の作成 )"
#: limits/app_settings.py:149
msgid ""
-"Maximum number of allowed aliases for a new domain. (0 to deny any creation,"
-" -1 to allow unlimited creations)"
-msgstr "新しいドメインに作成を許可するエイリアス数の上限。( 0 で作成の拒否、-1 で無制限の作成 )"
+"Maximum number of allowed aliases for a new domain. (0 to deny any creation, "
+"-1 to allow unlimited creations)"
+msgstr ""
+"新しいドメインに作成を許可するエイリアス数の上限。( 0 で作成の拒否、-1 で無制"
+"限の作成 )"
#: limits/apps.py:16
msgid "Limits"
@@ -2220,7 +2417,8 @@ msgstr "ダウンロードしたら文書を削除"
msgid ""
"Automatically delete a document just after its first download from this "
"interface"
-msgstr "このインターフェースからダウンロードをしたのちに、文書を自動的に削除します"
+msgstr ""
+"このインターフェースからダウンロードをしたのちに、文書を自動的に削除します"
#: pdfcredentials/app_settings.py:68
msgid "Generate documents only at account creation"
@@ -2230,7 +2428,9 @@ msgstr "アカウント作成時のみ文書を作成"
msgid ""
"Generate a new document only when a new account is created. If set to no, a "
"new document will be created each time a password is updated."
-msgstr "新しくアカウントを作成する際にのみ、新しい文書を作成します。「いいえ」に設定すると、パスワードを更新するたびに新しい文書を作成します。"
+msgstr ""
+"新しくアカウントを作成する際にのみ、新しい文書を作成します。「いいえ」に設定"
+"すると、パスワードを更新するたびに新しい文書を作成します。"
#: pdfcredentials/app_settings.py:84
msgid "Customization options"
@@ -2268,7 +2468,9 @@ msgstr "メールクライアント接続設定を含める"
msgid ""
"Include required SMTP and IMAP connection information to configure a mail "
"client, a tablet or a phone"
-msgstr "メールクライアント、タブレットやスマートフォンに設定する際に必要な SMTP・IMAP 接続の情報を含める"
+msgstr ""
+"メールクライアント、タブレットやスマートフォンに設定する際に必要な SMTP・"
+"IMAP 接続の情報を含める"
#: pdfcredentials/app_settings.py:123 pdfcredentials/documents.py:133
msgid "SMTP server address"
@@ -2329,7 +2531,14 @@ msgid ""
"Dear %s, this document contains the credentials you will need\n"
"to connect to Modoboa. Learn the content and destroy\n"
"the document as soon as possible.\n"
-msgstr "\n%s 様、この文書には Modoboa メールサーバーへの接続に必要な認証情報を記しています。\n認証情報が第三者に漏れれば、メールの内容をすべて読み取られるほか、なりすましによるメール送信も可能になります。\n内容を理解し必要な設定を終えたら、厳重に管理する・廃棄するなど、対応をおねがいします。\n"
+msgstr ""
+"\n"
+"%s 様、この文書には Modoboa メールサーバーへの接続に必要な認証情報を記してい"
+"ます。\n"
+"認証情報が第三者に漏れれば、メールの内容をすべて読み取られるほか、なりすまし"
+"によるメール送信も可能になります。\n"
+"内容を理解し必要な設定を終えたら、厳重に管理する・廃棄するなど、対応をおねが"
+"いします。\n"
#: pdfcredentials/documents.py:95
msgid "Web panel:"
@@ -2348,7 +2557,10 @@ msgid ""
"\n"
"Here you can view your emails anytime online, create filters or manage\n"
"your contacts.\n"
-msgstr "\nこの画面からあなたのメールをオンラインで確認できるほか、表示フィルターを\n作成したり、連絡先を管理することができます。\n"
+msgstr ""
+"\n"
+"この画面からあなたのメールをオンラインで確認できるほか、表示フィルターを\n"
+"作成したり、連絡先を管理することができます。\n"
#: pdfcredentials/documents.py:126
msgid "Please change your password!"
@@ -2366,7 +2578,9 @@ msgstr "この設定はパソコン、またはスマートフォンやタブレ
msgid ""
"Failed to create PDF_credentials directory. Please check the permissions or "
"the path."
-msgstr "PDF_credentials ディレクトリーの作成に失敗しました。権限またはパスを確認してください。"
+msgstr ""
+"PDF_credentials ディレクトリーの作成に失敗しました。権限またはパスを確認して"
+"ください。"
#: pdfcredentials/handlers.py:64
msgid "Download PDF credentials"
@@ -2442,9 +2656,11 @@ msgstr "キー マップ パス"
#: rspamd/app_settings.py:21
msgid ""
-"Absolute path of the file which contains paths to DKIM private keys. Must be"
-" readable by _rspamd group or user."
-msgstr "DKIM プライベートキー ファイルの絶対パス。_rspamd グループまたはユーザーに読み取り権限が必要です。"
+"Absolute path of the file which contains paths to DKIM private keys. Must be "
+"readable by _rspamd group or user."
+msgstr ""
+"DKIM プライベートキー ファイルの絶対パス。_rspamd グループまたはユーザーに読"
+"み取り権限が必要です。"
#: rspamd/app_settings.py:30
msgid "Selector map path"
@@ -2454,7 +2670,9 @@ msgstr "セレクター マップ パス"
msgid ""
"Absolute path of the file which contains names of DKIM selectors. Must be "
"readable by _rspamd group or user."
-msgstr "DKIM セレクター ファイルの絶対パス。_rspamd グループまたはユーザーに読み取り権限が必要です。"
+msgstr ""
+"DKIM セレクター ファイルの絶対パス。_rspamd グループまたはユーザーに読み取り"
+"権限が必要です。"
#: rspamd/app_settings.py:51
msgid "Rspamd dashboard location"
@@ -2462,10 +2680,13 @@ msgstr "Rspamd ダッシュボードの場所"
#: rspamd/app_settings.py:53
msgid ""
-"Location of the rspamd dashboard. Can either be a relative URL (eg. "
-"'/rspamd') or a full URL (eg. 'https://rspamd.domain.tld/').Only use for "
+"Location of the rspamd dashboard. Can either be a relative URL (eg. '/"
+"rspamd') or a full URL (eg. 'https://rspamd.domain.tld/').Only use for "
"guidance on the Super-Admin dashboard."
-msgstr "rspamd ダッシュボードの場所。相対 URL ( 例 : '/rspamd' ) またはフル URL ( 例 : 'https://rspamd.domain.tld/' ) のどちらでもかまいません。スーパー管理者ダッシュボードからのガイドにしか利用しません。"
+msgstr ""
+"rspamd ダッシュボードの場所。相対 URL ( 例 : '/rspamd' ) またはフル URL "
+"( 例 : 'https://rspamd.domain.tld/' ) のどちらでもかまいません。スーパー管理"
+"者ダッシュボードからのガイドにしか利用しません。"
#: rspamd/apps.py:18
msgid "Rspamd"
@@ -2588,11 +2809,11 @@ msgstr "メッセージを拒否"
msgid "Stop processing"
msgstr "処理を停止"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr "MANAGESIEVE サーバーへの接続に失敗。設定を確認してください。"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr "サーバーに十分な空きがありません"
@@ -2645,7 +2866,8 @@ msgstr "パスワードがわからない?"
msgid ""
"Your password has been set. You may go ahead and sign "
"in now."
-msgstr "パスワードを設定しました。サインイン で進みます。"
+msgstr ""
+"パスワードを設定しました。サインイン で進みます。"
#: templates/registration/password_reset_confirm.html:8
msgid "Change password"
@@ -2661,7 +2883,9 @@ msgstr "送信"
msgid ""
"The password reset link was invalid, possibly because it has already been "
"used. Please request a new password reset."
-msgstr "パスワードの再設定リンクが無効です。おそらくこのリンクからはすでに操作を終えたものと思われます。もう一度「パスワード再設定」の操作をしてください。"
+msgstr ""
+"パスワードの再設定リンクが無効です。おそらくこのリンクからはすでに操作を終え"
+"たものと思われます。もう一度「パスワード再設定」の操作をしてください。"
#: templates/registration/password_reset_confirm_code.html:22
msgid "Enter the code you've just received by SMS"
@@ -2681,7 +2905,11 @@ msgid ""
"exists with the email you entered. You should receive them shortly.
"
"If you don't receive an email, please make sure you've entered your "
"primary address, and check your spam folder.
"
-msgstr "入力したメールアドレスが登録済みのものであれば、パスワード設定方法を記載したメールが届きます。
メールが届かなければ、入力したアドレスが正しいものだったかどうか、または SPAM フォルダーに配信されていないかを確認してください。
"
+msgstr ""
+"入力したメールアドレスが登録済みのものであれば、パスワード設定方法を記載し"
+"たメールが届きます。
メールが届かなければ、入力したアドレスが正しいも"
+"のだったかどうか、または SPAM フォルダーに配信されていないかを確認してくださ"
+"い。
"
#: templates/registration/password_reset_email.html:4
#: templates/registration/password_reset_email_v2.html:4
@@ -2689,14 +2917,18 @@ msgstr "入力したメールアドレスが登録済みのものであれば
msgid ""
"To initiate the password reset process for your %(username)s Modoboa "
"account, click the link below:"
-msgstr "パスワードの再設定処理をはじめます。対象のアカウントは %(username)s でよろしいですか? よろしければ以下のリンクをクリックしてください : "
+msgstr ""
+"パスワードの再設定処理をはじめます。対象のアカウントは %(username)s でよろし"
+"いですか? よろしければ以下のリンクをクリックしてください : "
#: templates/registration/password_reset_email.html:10
#: templates/registration/password_reset_email_v2.html:10
msgid ""
"If clicking the link above doesn't work, please copy and paste the URL in a "
"new browser window instead."
-msgstr "上のリンクが動作しなければ、URL を Web ブラウザにコピー・貼りつけしてください。"
+msgstr ""
+"上のリンクが動作しなければ、URL を Web ブラウザにコピー・貼りつけしてくださ"
+"い。"
#: templates/registration/password_reset_email.html:14
#: templates/registration/password_reset_email_v2.html:14
@@ -2725,9 +2957,11 @@ msgstr "ワンタイム パスワード"
#: templates/registration/twofactor_code_verify.html:35
msgid ""
-"Enter the code from the two-factor app on your mobile device. If you've lost"
-" your device, you may enter one of your recovery codes."
-msgstr "あなたのスマートフォンの 2 要素認証アプリのコードを入力してください。スマートフォンをなくしているなどの場合は、再設定コードのいずれかを入力してください。"
+"Enter the code from the two-factor app on your mobile device. If you've lost "
+"your device, you may enter one of your recovery codes."
+msgstr ""
+"あなたのスマートフォンの 2 要素認証アプリのコードを入力してください。スマート"
+"フォンをなくしているなどの場合は、再設定コードのいずれかを入力してください。"
#: templates/registration/twofactor_code_verify.html:42
msgid "Verify code"
@@ -2764,7 +2998,8 @@ msgstr "最大添付サイズ"
#: webmail/app_settings.py:19
msgid "Maximum attachment size in bytes (or KB, MB, GB if specified)"
-msgstr "添付ファイルの最大サイズをバイトで ( 必要に応じて KB, MB, GB も指定可 ) "
+msgstr ""
+"添付ファイルの最大サイズをバイトで ( 必要に応じて KB, MB, GB も指定可 ) "
#: webmail/app_settings.py:67
msgid "SMTP settings"
@@ -2894,7 +3129,7 @@ msgstr "署名テキスト"
msgid "User defined email signature"
msgstr "ユーザー定義のメール署名"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr "添付ファイルの削除に失敗 : "
@@ -2902,7 +3137,7 @@ msgstr "添付ファイルの削除に失敗 : "
msgid "Date"
msgstr "日付"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "階層区切りの取得に失敗"
diff --git a/modoboa/locale/ka/LC_MESSAGES/django.po b/modoboa/locale/ka/LC_MESSAGES/django.po
index e31a6c92e..ea0972116 100644
--- a/modoboa/locale/ka/LC_MESSAGES/django.po
+++ b/modoboa/locale/ka/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,75 +18,75 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -94,56 +94,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -155,11 +155,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -424,12 +424,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -578,7 +578,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -774,7 +774,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -875,7 +875,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -887,24 +887,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -979,410 +979,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1474,59 +1566,59 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr ""
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1853,7 +1945,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1885,21 +1977,21 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2587,11 +2679,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2893,7 +2985,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr ""
@@ -2901,7 +2993,7 @@ msgstr ""
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/locale/nl_NL/LC_MESSAGES/django.po
index aebcd5fce..35bc900d1 100644
--- a/modoboa/locale/nl_NL/LC_MESSAGES/django.po
+++ b/modoboa/locale/nl_NL/LC_MESSAGES/django.po
@@ -19,7 +19,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2024-07-17 11:46+0200\n"
"Last-Translator: J Rosier \n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/tonio/modoboa/"
@@ -30,7 +30,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -38,73 +38,73 @@ msgstr ""
"Quota gedeeld tussen mailboxen. Kan uitgedrukt worden in kB, MB (standaard) "
"of GB. Een waarde van 0 betekent geen quota."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr "Standaard quotum in MB per mailbox. 0 betekent geen quotum."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
#| msgid "An alias with this name already exists."
msgid "domain alias with this name already exists"
msgstr "Een alias met deze naam bestaat al."
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Geen geauthoriseerd MX record gevonden voor dit domein"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "Kan niet groter zijn dan domeinquotum"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Toegang geweigerd."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Dit veld is verplicht"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr "Lijst van beheerde domeinen (alleen resellers en domeinbeheerders)."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Niet toegestaan voor deze rol."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Moet gelijk zijn aan de mailbox full_address"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Dit veld is verplicht."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Lokaal domein {} bestaat niet"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Lijst ontvangers."
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "Gebruiker '%s' bestaat al"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "Je hebt geen toegang tot dit domein."
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "Je hebt geen toegang tot deze mailbox."
@@ -112,56 +112,56 @@ msgstr "Je hebt geen toegang tot deze mailbox."
msgid "Here is your new Modoboa password: {}"
msgstr "Hier is je nieuwe Modoboa wachtwoord:{}"
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "DKIM Key opslagdirectory niet geconfigureerd"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Je kunt geen onbeperkt quotum definiëren."
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "Gebruiker '%s' bestaat al"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Dit moet een positief geheel getal zijn."
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "Openssl kan niet gevonden worden. Controleer of dit geïnstalleerd is."
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Map niet gevonden."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr "Dit veld laat alleen geldige IP-adressen (of netwerken) toe"
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Definieer ten minste 1 geautoriseerd netwerk / adres"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr "Er is een mailbox vereist om een alias te creëren"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown tag {}"
msgid "Unknown status"
@@ -175,11 +175,11 @@ msgstr "Je hebt geen toegang tot dit domein"
msgid "You can't delete your own domain"
msgstr "Je kunt je eigen domein niet verwijderen"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -468,12 +468,12 @@ msgstr "DNS naam is te lang: %s"
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Ongeldig IP-adres format voor {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Object bestaat al: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d objecten succesvol geïmporteerd"
@@ -628,7 +628,7 @@ msgid "Key length"
msgstr "Sleutellengte"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Onjuiste regel"
@@ -859,7 +859,7 @@ msgstr "Domeinbeheerder"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "Sta deze beheerder toe om mailboxen van gebruikers te benaderen"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Diversen"
@@ -970,7 +970,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -984,24 +984,24 @@ msgstr ""
msgid "Local"
msgstr "Lokaal"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Gebruikersprofiel"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Ongeldige zinsbouw"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Ongeldig nummer van rondes"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr "Gebruik de volgende code om het Modoboa wachtwoord te herstellen: {}"
@@ -1086,11 +1086,21 @@ msgstr "Lengte van willekeurig wachtwoord"
msgid "Length of randomly generated passwords."
msgstr "Lengte van willekeurig gegenereerde wachtwoorden"
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Lengte van willekeurig gegenereerde wachtwoorden"
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "Service-url voor wachtwoorden updaten"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
@@ -1100,104 +1110,104 @@ msgstr ""
"bijwerken. Alleen van toepassing op niet-lokale gebruikers die automatisch "
"worden aangemaakt na een succesvolle externe authenticatie (LDAP, SMTP)."
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "Melding wachtwoordherstel"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr "Een tijdelijke melding die wordt getoond op de wachtwoordresetpagina."
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "Wachtwoordherstel via SMS activeren"
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
"Wachtwoordherstel via SMS activeren voor gebruikers die een telefoonnummer "
"hebben ingevuld."
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "SMS provider"
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr "Kies een provider voor het sturen van een SMS voor wachtwoordherstel."
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Serveradres"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "Het IP-adres of de hostname van LDAP-server"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Serverpoort"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Het TCP poortnummer van de LDAP-server"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "Secundaire server activeren (fallback)"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
"Activeer secundaire LDAP server, te gebruiken als de primaire server wegvalt"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "Adres van secundaire server"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "Het IP adres of DNS naam van de secundaire LDAP server"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "secundaire-serverpoort"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "TCP poortnummer van de secundaire LDAP server"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Gebruik een beveiligde verbinding"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Gebruik een SSL/TLS verbinding met de LDAP-server"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "De LDAP-server is een Active Directory"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Beheerdergroepen"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1205,47 +1215,47 @@ msgstr ""
"Leden van deze LDAP POSIX-groepen zullen aangemaakt worden als "
"domeinbeheerders. Gebruik ';' karakters om groepen te scheiden."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Groeptype"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "De LDAP groeptype dat wordt gebruikt voor uw LDAP-directory."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Groepen zoekbasis"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "De gedistingeerde naam van de zoekbasis om groepen te vinden"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Wachtwoord attribuut"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Het attribuut dat gebruikt wordt om wachtwoorden op te slaan"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "LDAP authenticatie-instellingen"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Authenticatiemethode"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Kies de te gebruiken authenticatiemethode"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Koppeling DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1253,29 +1263,29 @@ msgstr ""
"De gedistingeerde naam om te gebruiken bij het koppelen met de LDAP-server. "
"Laat leeg voor een anonieme koppeling."
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Koppel wachtwoord"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"Het wachtwoord om te gebruiken tijdens het koppelen met de LDAP-server (met "
"'koppel DN')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Gebruikers zoekbasis"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "De gedistingeerde naam van de zoekbasis om gebruikers te vinden"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Zoekfilter"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1283,11 +1293,11 @@ msgstr ""
"Een optionele filter string (zoals '(objectClass=person)'). Om geldig te "
"kunnen zijn, moet het tussen haakjes staan."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Gebruiker DN template"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1296,25 +1306,25 @@ msgstr ""
"Het template dat gebruikt wordt om een gebruiker zijn/haar DN op te bouwen. "
"Het moet een placeholder bevatten (bijvoorbeeld. %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "LDAP synchronisatie-instellingen"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "Activeer export naar LDAP"
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
"Activeer automatische synchronisatie tussen lokale database en LDAP directory"
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr "Verwijder extern LDAP account als het lokale account wordt verwijderd"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
@@ -1322,11 +1332,11 @@ msgstr ""
"Verwijder extern LDAP account als het lokale account wordt verwijderd. Zo "
"niet, dan wordt het gedeactiveerd."
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "Account DN sjabloon"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
@@ -1335,131 +1345,202 @@ msgstr ""
"Het sjabloon voor het opbouwen van het DN (distinguishedname). Het moet een "
"tijdelijke aanduiding (placeholder) bevatten (bijvoorbeeld %(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "Activeer import van LDAP"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr "Activeer accountsynchronisatie van LDAP directory naar lokale database"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "Gebruikersnaamattribuut"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr "De naam van het LDAP-attribuut waar de gebruikersnaam staat."
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Activeer Dovecot LDAP synchronisatie"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
"LDAP authenticatie-instellingen worden toegepast op Dovecot-configuratie."
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Dovecot LDAP configuratiebestand"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr "Locatie van het configuratiebestand met Dovecot LDAP-instellingen."
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Bedieningspaneel"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom message"
+msgid "Custom welcome message"
+msgstr "Aangepast bericht"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr "Een tijdelijke melding die wordt getoond op de wachtwoordresetpagina."
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Aangepaste RSS feed."
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr "Toon aangepaste RSS feed aan resellers en domein beheerders. "
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr "Toon aangepaste RSS feed aan resellers en domein beheerders. "
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr "Toon aangepaste RSS feed aan resellers en domein beheerders. "
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Verberg opties widget"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr "Verberg features widget voor resellers en domein administrators. "
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Tweede e-mailadres"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Notificaties"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Afzenderadres"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "E-mailadres dat gebruikt wordt om notificaties te versturen"
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Publieke API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Communicatie toestaan"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Controleert automatisch of een nieuwere versie beschikbaar is"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Controleer of er een nieuwe versie beschikbaar is"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "Stuur een e-mail als er nieuwe versies worden gevonden"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr "Stuur een e-mail naar administrators over nieuwe versies"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Ontvanger"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "Ontvanger van notificatiemails over nieuwe versies"
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Verstuur statistieken"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Verstuur statistieken naar de publieke Modoboa API (statistieken en "
"gebruikte extenties)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Drempelwaarde inactieve gebruikers"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Drempelwaarde inactieve gebruikers"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1467,41 +1548,41 @@ msgstr ""
"Een gebruiker die langer dan dit aantal dagen niet ingelogd is, wordt op "
"inactief gezet."
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Top notificaties controle interval"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Interval tussen twee notificatiecontroles (in seconden)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Maximum bewaartijd van logs"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "De maximum bewaartijd in dagen van een log record"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Items per pagina"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Aantal getoonde items per pagina"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Standaard top omleiding"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"De standaard omleiding die gebruikt wordt als er geen andere applicatie is "
"opgegeven"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1511,20 +1592,44 @@ msgstr ""
"tussen zomer- en wintertijd (bijv. dezelfde locale tijd komt twee keer voor "
"door de tijdsverandering)"
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Zet 'USE_TZ = TRUE' in settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Update password scheme at login"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Update wachtwoordschema bij inloggen"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Gebruiker"
@@ -1616,63 +1721,63 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] update(s) beschikbaar"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Sta mailboxtoegang toe"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Sta deze beheerder toe om mailboxen van gebruikers te benaderen"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "wachtwoord"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "taal"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Voorkeurstaal om pagina's weer te geven"
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Telefoonnummer"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Tweede e-mailadres"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
"Een alternatief e-mailadres, dit kan gebruikt worden voor herstel "
"mogelijkheden."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Mislukt om wachtwoord aan te passen: LDAP-module niet geinstalleerd"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "account"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Onbekend"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "U kunt geen accounts importeren met hogere rechten dan die van uzelf"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "De gebruiker '%s' moet een geldig e-mailadres hebben"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2021,7 +2126,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr "IMAP migratie"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to IMAP server failed: {error}"
@@ -2054,24 +2159,24 @@ msgstr "Verwijderen LDAP account mislukt: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "Uitschakelen LDAP account mislukt: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Communicatie met publieke Modoboa API toestaan"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "Kan de encoding van de string niet bepalen. "
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Toegang geweigerd: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Toegang geweigerd"
@@ -2865,13 +2970,13 @@ msgstr "Bericht doorsturen naar"
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
#, fuzzy
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr "Verbinding naar MANAGESIEVE server mislukt, controleer uw configuratie"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3220,7 +3325,7 @@ msgstr "Handtekeningtekst"
msgid "User defined email signature"
msgstr "Door gebruiker opgegeven e-mailhandtekening"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to remove filter"
msgid "Failed to remove attachment: "
@@ -3230,7 +3335,7 @@ msgstr "Bijlage verwijderen is mislukt:"
msgid "Date"
msgstr "Datum"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Mislukt om het hiërarchische scheidingsteken te verkrijgen"
@@ -3258,6 +3363,3 @@ msgstr "Prullenbak"
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr "Bijlage is te groot (maximaal toegestane grootte: %s)"
-
-#~ msgid "Automatic reply timeout"
-#~ msgstr "Automatisch antwoorden timeout"
diff --git a/modoboa/locale/no/LC_MESSAGES/django.po b/modoboa/locale/no/LC_MESSAGES/django.po
index 47d6dd73d..0bddf2ad2 100644
--- a/modoboa/locale/no/LC_MESSAGES/django.po
+++ b/modoboa/locale/no/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2020-05-11 18:45+0000\n"
"Last-Translator: Nils Otto Lillegrein , 2020\n"
"Language-Team: Norwegian (https://www.transifex.com/tonio/teams/13749/no/)\n"
@@ -21,75 +21,75 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -97,56 +97,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -158,11 +158,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -427,12 +427,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -581,7 +581,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -777,7 +777,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -878,7 +878,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -890,24 +890,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -982,410 +982,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1477,61 +1569,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
#, fuzzy
#| msgid "Failed to update LDAP account: {}"
msgid "Failed to update password: LDAP module not installed"
msgstr "Kunne ikke oppdatere LDAP-konto: {}"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1858,7 +1950,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1890,21 +1982,21 @@ msgstr "Kunne ikke slette LDAP-konto: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "Kunne ikke deaktivere LDAP-konto: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2594,11 +2686,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2900,7 +2992,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to create LDAP account: {}"
msgid "Failed to remove attachment: "
@@ -2910,7 +3002,7 @@ msgstr "Kunne ikke opprette LDAP-konto: {}"
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/pl_PL/LC_MESSAGES/django.po b/modoboa/locale/pl_PL/LC_MESSAGES/django.po
index 3c6f7f236..15d951b23 100644
--- a/modoboa/locale/pl_PL/LC_MESSAGES/django.po
+++ b/modoboa/locale/pl_PL/LC_MESSAGES/django.po
@@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2021-07-09 07:40+0000\n"
"Last-Translator: KrystianPlichta \n"
"Language-Team: Polish (Poland) (http://www.transifex.com/tonio/modoboa/"
@@ -28,7 +28,7 @@ msgstr ""
"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && "
"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -36,75 +36,75 @@ msgstr ""
"Miejsce dzielone między skrzynki. Może być wyrażone w KB, MB (domyślnie) lub "
"GB. Wartość 0 oznacza brak limitu."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
"Domyślne ograniczenie (w MB) dla nowych skrzynek. Wartość 0 oznacza brak "
"ograniczenia."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
msgid "domain alias with this name already exists"
msgstr "Alias z taką nazwą już istnieje"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Nie znaleziono autoryzowanych dla tej domeny rekordów MX "
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "Nie może być wyższa niż limit domeny"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Odmowa dostępu"
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "To pole jest obowiązkowe"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Lista administratorów domen (tylko resellerów i administratorów domen)."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Niedozwolone dla tej roli."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Musi być równe z full_address skrzynki."
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "To pole jest wymagane"
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Lokalna domena {} nie istnieje"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Lista odbiorców"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "Użytkownik '%s' już istnieje"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "Nie masz dostępu do tej domeny."
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "Nie masz dostępu do tej skrzynki."
@@ -112,58 +112,58 @@ msgstr "Nie masz dostępu do tej skrzynki."
msgid "Here is your new Modoboa password: {}"
msgstr "Twoje nowe hasło do Modoboa to: {}"
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "Katalog przechowywania kluczy DKIM nie został skonfigurowany"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Nie możesz przypisać nielimitowanej przestrzeni"
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "Użytkownik '%s' już istnieje"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Musi być liczbą całkowitą dodatnią"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "Brak openssl , upewnij się że jest zainstalowany."
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Katalog nie znaleziony."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Zdefiniuj przynajmniej jedną autoryzowaną sieć / adres"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
#, fuzzy
#| msgid "A mailbox is required"
msgid "A mailbox is required to create aliases."
msgstr "Skrzynka jest obowiązkowa"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown"
msgid "Unknown status"
@@ -177,11 +177,11 @@ msgstr "Nie masz uprawnień dla tej domeny"
msgid "You can't delete your own domain"
msgstr "Nie możesz usunąć swoje własnej domeny"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -473,12 +473,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Nieprawidłowy format adresu IP dla {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Obiekt %s już istnieje"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "Zaimportowano %d obiektów z sukcesem"
@@ -633,7 +633,7 @@ msgid "Key length"
msgstr "Długość klucza"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Niepoprawna linia"
@@ -871,7 +871,7 @@ msgstr "Administrator domeny"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "Zezwól temu administratorowi na dostęp do skrzynek użytkowników"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Różne"
@@ -982,7 +982,7 @@ msgstr "2FA jest już włączone"
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -996,24 +996,24 @@ msgstr "2FA nie jest włączone"
msgid "Local"
msgstr "Lokalnie"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Profil użytkownika"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Nieprawidłowa składnia"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Nieprawidłowa liczba rund"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr "Ten kod jest nieprawidłowy"
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr "Proszę użyć następującego kodu, aby odzyskać hasło Modoboa: {}"
@@ -1098,11 +1098,21 @@ msgstr "Długość losowego hasła"
msgid "Length of randomly generated passwords."
msgstr "Długość losowo wygenerowanego hasła"
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Długość losowo wygenerowanego hasła"
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "Zaktualizuj URL usługi hasła"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
@@ -1113,106 +1123,106 @@ msgstr ""
"utworzonych automatycznie po prawidłowym zalogowaniu do zewnętrznych usług "
"(LDAP, SMTP)."
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "Komunikat o odzyskiwaniu hasła"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
"Tymczasowa wiadomość, która będzie wyświetlana na stronie resetowania hasła."
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "Włącz odzyskiwania hasła przez SMS"
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
"Włącz odzyskiwanie hasła przez SMS dla użytkowników, którzy podali numer "
"telefonu."
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "Dostawca SMS"
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr "Wybierz dostawcę, aby wysłać SMS odzyskiwania hasła Dostawca SMS"
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Adres serwera"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "IP lub nazwa DNS serwera LDAP"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Port serwera"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Port TCP używany przez LDAP"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "Włącz dodatkowy serwer (awaryjny)"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
"Włącz dodatkowy serwer LDAP, który będzie użyty, gdy pierwszorzędny nie "
"będzie dostępny"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "Adres serwera dodatkowego"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "Adres IP lub nazwa DNS dodatkowego serwera LDAP"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "Port na serwerze dodatkowym"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "Numer portu TCP używanego przez dodatkowy serwer LDAP"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Użyj bezpiecznego polączenia"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Użyj SSL/STARTTLS dla połączenia z serwerem LDAP"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Czy LDAP jest Active Directory "
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Administrator grup"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1220,47 +1230,47 @@ msgstr ""
"Członkowie tych grup LDAP Posix będą utworzeni jako administratorzy domeny. "
"Użyj znaku ';' jako separatora grup."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Typ grupy"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "Typ grupy LDAP do wykorzystania z Twoim katalogiem."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Wyszukiwarka grup"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "Nazwa wyróżniająca bazy wyszukiwania użyte do znalezienia grupy"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Atrybut hasła"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Atrybut używany do przechowywania haseł użytkowników"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "Ustawienia uwierzytelniania LDAP"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Metoda autentykacji"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Wybierz metode autentykacji"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Przypnij do DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1268,37 +1278,37 @@ msgstr ""
"DN do użycia przy połączeniu do LDAP'a. Zostaw puste dla anonimowego "
"podłączenia"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Hasło"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr "Hasło używane do połdłączenia do LDAP'a (z wskazanym DN)"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Wyszukiwania użytkowników"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "Nazwa wyróżniająca bazy wyszukiwania użyte do znalezienia grupy"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Filtr wyszukiwania"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr "Użyj szablonu DN"
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Użyj szablonu DN"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1307,24 +1317,24 @@ msgstr ""
"Szablon użyty do skonstruowania DN użytkownika. Powinna ona zawierać jeden "
"symbol zastępczy (np. %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "Ustawienia synchronizacji z LDAP"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "Włącz export do LDAP"
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr "Włącz automatyczną synchronizację lokalnej bazy danych i katalogu LDAP"
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr "Skasuj konto na zdalnym LDAP kiedy zostanie skasowane konto lokalne"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
@@ -1332,11 +1342,11 @@ msgstr ""
"Skasuj konto na zdalnym LDAP kiedy zostanie skasowane konto lokalne, w innym "
"przypadku zostanie ono wyłączone."
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "Szablon konta DN"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
@@ -1345,132 +1355,206 @@ msgstr ""
"Szablon używany do budowy DN konta. Powinien zawierać jeden placeholder (ie. "
"%(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "Włącz import z LDAP"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr "Włącz synchronizację konta ze katalogu LDAP z lokalną bazą danych"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "Atrybut nazwa użytkownika"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr "Nazwa atrybutu LDAP, w którym można znaleźć nazwę użytkownika."
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Włącz synchronizację Dovecot LDAP"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
"Ustawienia uwierzytelniania LDAP zostaną zastosowane do konfiguracji Dovecot."
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Plik konfiguracyjny Dovecot LDAP"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
"Lokalizacja pliku konfiguracyjnego, który zawiera ustawienia Dovecot LDAP."
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Panel główny"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom message"
+msgid "Custom welcome message"
+msgstr "Własna wiadomość"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+"Tymczasowa wiadomość, która będzie wyświetlana na stronie resetowania hasła."
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Spersonalizowany kanał RSS"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
"Wyświetl spersonalizowany kanał RSS odsprzedawcy i administratorom domen"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Wyświetl spersonalizowany kanał RSS odsprzedawcy i administratorom domen"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Wyświetl spersonalizowany kanał RSS odsprzedawcy i administratorom domen"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Ukryj kontrolki opcji"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr "Ukryj kontrolki opcji dla administratorów domeny i resellerów"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Zapasowy email"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Powiadomienia"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Adres nadawcy"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Adres e-mail używany do wysyłania powiadomień"
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Publiczne API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Włącz komunikację"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Automatycznie sprawdzaj czy nowa wersja jest dostępna"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Sprawdź nowe wersje"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "Wyślij email, jeżeli została znaleziona nowa wersja"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr "Wyślij email, by powiadomić aministratorów o nowej wersji"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Odbioraca"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "Odbiorca emaili z powiadomieniem o nowej wersji"
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Wyślij statystyki"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Prześlij statystyki do publicznego API Modoboa (licznik i użyte rozszerzenia)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Próg nieaktywności konta"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Próg nieaktywności konta"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1478,39 +1562,39 @@ msgstr ""
"Konto z datą ostatniego logowania większą niż podany próg (w dniach) "
"zostanie uznane za nieaktywne. "
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Odstęp pomiędzy powiadomieniami "
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Odstęp pomiędzy dwoma powiadomieniami (w sek.)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Max wiek wpisu w logu"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Max wiek w dniach dla wpisu w logu"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Elementów na stronie"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Liczba wyświetlanych elementów na stronie"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Domyślne górne przekierowanie"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr "Domyślne górne przekierowanie kiedy nie wskazano aplikacji"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1520,20 +1604,44 @@ msgstr ""
"czasu pomiędzy letnim a zimowym (ten sam czas będzie występował dwa razy z "
"powodu zmiany godziny)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Ustaw `USE_TZ = True` w settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Update password scheme at login"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Aktualizuj schemat haseł przy logowaniu"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Prosty użytkownik"
@@ -1625,61 +1733,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] Aktualizacja(y) dostępna(e)"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Zezwól na dostęp do skrzynek"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Zezwól temu administratorowi na dostęp do skrzynek użytkowników"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "hasło"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "Język"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Preferowany język"
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Numer telefonu"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Zapasowy email"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr "Alternatywny email, może zostać użyty do odzyskania hasła"
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Nieudana zmiana hasła: moduł LDAP nie został zainstalowany"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "konto"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Nieznany"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Nie możesz zaimportować konta z rolą wyższą od własnej"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "Prosty uzytkownik '%s' musi posiadać prawidłowy adres email"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2048,7 +2156,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to IMAP server failed: {error}"
@@ -2081,24 +2189,24 @@ msgstr "Niepowodzenie w trakcie usuwania konta LDAP"
msgid "Failed to disable LDAP account: {}"
msgstr "Niepowodzenie w trakcie wyłaczania konta LDAP"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Włącz komunikację z publicznym API Modoboa"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "nie potrafi rozpoznać kodowania tekstu"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Odmowa dostepu: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Dostęp zabroniony"
@@ -2869,11 +2977,11 @@ msgstr "Odrzuć wiadomość"
msgid "Stop processing"
msgstr "Zatrzymaj przetwarzanie"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr "Błąd połączenia do serwera MANAGESIEVE: %s, sprawdź konfigurację"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3234,7 +3342,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to remove filter"
msgid "Failed to remove attachment: "
@@ -3244,7 +3352,7 @@ msgstr "Nie udało się usunąć filtru"
msgid "Date"
msgstr "Data"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Nie udało się rozpoznać hierarchii separatora"
@@ -3274,6 +3382,3 @@ msgstr ""
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr ""
-
-#~ msgid "Automatic reply timeout"
-#~ msgstr "Automatyczny limit czasu odpowiedzi"
diff --git a/modoboa/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/locale/pt_BR/LC_MESSAGES/django.po
index 6b28c4a31..0e17742de 100644
--- a/modoboa/locale/pt_BR/LC_MESSAGES/django.po
+++ b/modoboa/locale/pt_BR/LC_MESSAGES/django.po
@@ -26,7 +26,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2011-07-01 08:15+0000\n"
"Last-Translator: Rafael Barretto Alves , "
"2013,2015-2017,2025\n"
@@ -39,7 +39,7 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
"1000000 == 0 ? 1 : 2;\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -47,75 +47,75 @@ msgstr ""
"Cota compartilhada entre caixas de correio. Pode ser expresso em KB, MB "
"(padrão) ou GB. Um valor 0 significa que não há cota."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
"Cota padrão em MB aplicada para caixas de correio. Um valor 0 significa que "
"não há cota."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
#| msgid "Alias with this name already exists"
msgid "domain alias with this name already exists"
msgstr "Já existe um apelido com este nome"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Nenhum registro MX autorizado encontrado para este domínio"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "Não pode ser maior que a cota de domínio"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Permissão negada."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Este campo é obrigatório"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Lista de domínios administrados (somente revendedores e administradores de "
"domínio)."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Não é permitido para esta função."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Deve ser igual a full_address de caixa de correio"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Este campo é obrigatório."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Domínio local {} não existe"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "Uma lista de destinatários"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr "Este apelido já existe"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "Você não tem acesso a este domínio."
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "Você não tem acesso a esta caixa de correio."
@@ -123,58 +123,58 @@ msgstr "Você não tem acesso a esta caixa de correio."
msgid "Here is your new Modoboa password: {}"
msgstr "Aqui está sua nova senha do Modoboa: {}"
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "Diretório de armazenamento de chaves DKIM não configurado"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Você não pode definir uma cota ilimitada."
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "O usuário '%s' já existe"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Deve ser um inteiro positivo"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "openssl não encontrado, certifique-se que está instalado."
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Diretório não encontrado."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr "Este campo permite apenas endereços IP válidos (ou redes)"
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr "Desative a migração imap antes de desativar esta opção."
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Defina pelo menos uma rede/endereço autorizado"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
"A parte à esquerda de um endereço de e-mail não pode ter mais de 64 "
"caracteres."
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr "Uma caixa de correio é necessária para criar apelidos."
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr "Status desconhecido"
@@ -186,11 +186,11 @@ msgstr "Você não tem acesso a este domínio"
msgid "You can't delete your own domain"
msgstr "Você não pode excluir seu próprio domínio"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr "Nenhum ID de alarme fornecido"
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr "IDs de alarme inválidos recebidos"
@@ -485,12 +485,12 @@ msgstr "O nome DNS é muito longo: %s"
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Formato de endereço IP inválido para {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "O objeto já existe: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d objetos importados com sucesso"
@@ -642,7 +642,7 @@ msgid "Key length"
msgstr "Comprimento da chave"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Linha inválida"
@@ -863,7 +863,7 @@ msgstr ""
"Permitir aos administradores de domínio gerir calendários dos usuários "
"(leitura e escrita)"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Diversos"
@@ -970,7 +970,7 @@ msgstr ""
"Falha na tentativa de edição de configurações do TFA de '%s' como usuário "
"'%s'"
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr "Senha inválida"
@@ -982,24 +982,24 @@ msgstr "2FA não está habilitado"
msgid "Local"
msgstr "Local"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Perfil do usuário"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Sintaxe inválida"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Número de ciclos inválido"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr "Este código é inválido"
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
"Por favor, use o seguinte código para recuperar sua senha do Modoboa: {}"
@@ -1080,11 +1080,21 @@ msgstr "Tamanho de senha aleatório"
msgid "Length of randomly generated passwords."
msgstr "Tamanho das senhas geradas aleatoriamente."
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Tamanho das senhas geradas aleatoriamente."
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "Atualizar URL do serviço de senha"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
@@ -1094,105 +1104,105 @@ msgstr ""
"Aplica-se apenas a usuários não locais, como por exemplo aqueles criados "
"automaticamente após uma autenticação externa bem-sucedida (LDAP, SMTP)."
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "Anúncio de recuperação de senha"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
"Uma mensagem temporária que será exibida na página de redefinição de senha."
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "Ativar recuperação de senha por SMS"
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
"Habilitar a recuperação de senha por SMS para usuários que preencheram um "
"número de telefone."
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "Provedor de SMS"
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr "Escolha um provedor para enviar SMS de recuperação de senha"
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr "LDAP"
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Endereço do servidor"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "O endereço IP do nome DNS do servidor LDAP"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Porta do servidor"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "O número da porta TCP usada pelo servidor LDAP"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "Habilitar servidor secundário (fallback)"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
"Habilitar um servidor LDAP secundário que será usado se o primário falhar"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "Endereço do servidor secundário"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "O endereço IP ou o nome DNS do servidor LDAP secundário"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "Porta do servidor secundário"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "O número da porta TCP usada pelo servidor secundário LDAP"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Usar conexão segura"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Usar uma conexão SSL/STARTTLS para acessar o servidor LDAP"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Informe se o servidor LDAP é um Active Directory"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Grupos de administradores"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1200,47 +1210,47 @@ msgstr ""
"Membros dos grupos do LDAP Posix serão criados como administradores de "
"domínio. Use o caractere ';' para separar grupos."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Tipo de grupo"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "O tipo de grupo LDAP para ser usado em seu diretório."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Base de pesquisa de grupos"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "O nome distinto da base de pesquisa usada para encontrar grupos"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Atributo de senha"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "O atributo usado para armazenar senhas de usuários"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "Configurações de autenticação LDAP"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Método de autenticação"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Escolha o método de autenticação para usar"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Vincular DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1248,27 +1258,27 @@ msgstr ""
"O nome distinto para usar quando vincular ao servidor LDAP. Deixe vazio para "
"vincular anonimamente"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Vincular senha"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr "A senha usada quando vincular ao servidor LDAP (com 'Vincular DN')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Base de pesquisa de usuários"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "O nome distinto da base de pesquisa usada para encontrar usuários"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Filtro de pesquisa"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1276,11 +1286,11 @@ msgstr ""
"Uma string opcional de filtro (por ex: '(objectClass=person)'). Para ser "
"válida, deve estar entre parênteses."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Usar template DN"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1289,26 +1299,26 @@ msgstr ""
"A template usada para construir um DN de usuário. Deve conter um placeholder "
"(por ex: %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "Configurações de sincronização LDAP"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "Habilitar exportação para LDAP"
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
"Ativar a sincronização automática entre o banco de dados local e o diretório "
"LDAP"
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr "Excluir conta LDAP remota quando a conta local for excluída"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
@@ -1316,11 +1326,11 @@ msgstr ""
"Exclua a conta LDAP remota quando a conta local for excluída, caso "
"contrário, ela será desativada."
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "Modelo de DN de conta"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
@@ -1329,127 +1339,203 @@ msgstr ""
"O modelo usado para construir o DN de uma conta. Ele deve conter um espaço "
"reservado (ou seja. %(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "Habilitar importação do LDAP"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
"Habilitar a sincronização de conta do diretório LDAP para o banco de dados "
"local"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "Atributo de nome de usuário"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr "O nome do atributo LDAP em que o nome de usuário pode ser encontrado."
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Ativar sincronização LDAP do Dovecot"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
"As configurações de autenticação LDAP serão aplicadas à configuração do "
"Dovecot."
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Arquivo de configuração LDAP do Dovecot"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
"Localização do arquivo de configuração que contém as configurações LDAP do "
"Dovecot."
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Painel"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom message"
+msgid "Custom welcome message"
+msgstr "Mensagem personalizada"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+"Uma mensagem temporária que será exibida na página de redefinição de senha."
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Feed RSS personalizado"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
"Mostrar um feed RSS personalizado para revendedores e administradores de "
"domínio"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Mostrar um feed RSS personalizado para revendedores e administradores de "
+"domínio"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Mostrar um feed RSS personalizado para revendedores e administradores de "
+"domínio"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Ocultar widget de recursos"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
"Ocultar widget de recursos para revendedores e administradores de domínio"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "E-mail secundário"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Notificações"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Endereço do remente"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Endereço de e-mail usado para enviar notificações."
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "API Pública"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Habilitar comunicação"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Verificar automaticamente se uma nova versão está disponível"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Verificar novas versões"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "Envie um e-mail quando novas versões forem encontradas"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr "Envie um e-mail para notificar os administradores sobre novas versões"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Destinatário"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "Destinatário de e-mails de notificação de novas versões."
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Enviar estatísticas"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Enviar estatísticas à API pública do Modoboa (contadores e extensões "
"utilizadas)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr "Ativar rastreamento de conta inativa"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
@@ -1457,11 +1543,11 @@ msgstr ""
"Permitir que o administrador defina um limite (em dias) além do qual uma "
"conta é considerada inativa se o usuário não tiver feito login"
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Limite de conta inativa"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1469,40 +1555,40 @@ msgstr ""
"Uma conta com uma data de login maior que este limite (em dias) será "
"considerada como inativa"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Intervalo de verificação de verificações de topo"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Intervalo entre checagem de notificações (em segundos)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Idade máxima do registro de log"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "A idade máxima em dias de um registro de log"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Itens por página"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Número de itens exibidos por página"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Redirecionamento de topo padrão"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"O redirecionamento padrão usado quando nenhuma aplicação é especificada"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1512,18 +1598,42 @@ msgstr ""
"durante as transições entre horários de verão / inverno (exemplo: o horário "
"local ocorrendo duas vezes devido a alteração do relógio)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Definir `USE_TZ = TRUE em settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr "O esquema de senha que você está usando está obsoleto."
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr "Atualize seu esquema de senha para uma mais forte"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Usuário simples"
@@ -1615,64 +1725,64 @@ msgstr "Você ainda está usando um esquema de senha obsoleto (%s)"
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] Atualização(ões) disponível(is)"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Permitir acesso a caixa de correio"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
"Permitir que este administrador acesse as caixas de correio de usuários"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "senha"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "idioma"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Idioma padrão para visualizar mensagens."
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Número de telefone"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "E-mail secundário"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
"Endereço de e-mail alternativo, pode ser usado para recuperar a conta caso "
"precise."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Falha ao atualizar senha: módulo LDAP não instalado"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "conta"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Desconhecido"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Você não pode importar uma conta com um papel maior que o seu"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "O usuário simples '%s' deve ter um endereço de e-mail válido"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2020,7 +2130,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr "Migração IMAP"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to IMAP server failed: {error}"
@@ -2056,23 +2166,23 @@ msgstr "Falha ao excluir a conta LDAP: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "Falha ao desativar a conta LDAP: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr "Falha ao se comunicar com a API pública: %s"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "não é possível determinar a codificação da cadeia de caracteres"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Permissão negada: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Permissão negada"
@@ -2811,12 +2921,12 @@ msgstr "Rejeitar mensagem"
msgid "Stop processing"
msgstr "Parar o processamento"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
"Falha na conexão com o servidor MANAGESIEVE, verifique sua configuração"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr "Não há espaço suficiente no servidor"
@@ -3165,7 +3275,7 @@ msgstr "Texto da assinatura"
msgid "User defined email signature"
msgstr "Assinatura de e-mail definida pelo usuário"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to create LDAP account: {}"
msgid "Failed to remove attachment: "
@@ -3175,7 +3285,7 @@ msgstr "Falha ao remover anexo:"
msgid "Date"
msgstr "Data"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Falha ao recuperar o delimitador de hierarquia"
@@ -3205,6 +3315,3 @@ msgstr ""
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr "Anexo muito grande (limite: %s)"
-
-#~ msgid "Automatic reply timeout"
-#~ msgstr "Tempo limite de resposta automática"
diff --git a/modoboa/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/locale/pt_PT/LC_MESSAGES/django.po
index dbbc548d3..acbddeb5b 100644
--- a/modoboa/locale/pt_PT/LC_MESSAGES/django.po
+++ b/modoboa/locale/pt_PT/LC_MESSAGES/django.po
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2024-07-17 11:45+0200\n"
"Last-Translator: Mike C. \n"
"Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/"
@@ -24,7 +24,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
#, fuzzy
#| msgid ""
#| "Default quota (in MB) applied to freshly created domains with no value "
@@ -36,7 +36,7 @@ msgstr ""
"Quota (em MB) a aplicar a domínios recentemente criados sem valor "
"especificado. Um valor de 0 implica sem quota."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
#, fuzzy
#| msgid ""
#| "Default quota (in MB) applied to freshly created domains with no value "
@@ -46,76 +46,76 @@ msgstr ""
"Quota (em MB) a aplicar a domínios recentemente criados sem valor "
"especificado. Um valor de 0 implica sem quota."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
msgid "domain alias with this name already exists"
msgstr "Já existe um 'alias' com este nome"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
#, fuzzy
#| msgid "Permissions"
msgid "Permission denied."
msgstr "Permissões"
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Este campo é obrigatório"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
#, fuzzy
#| msgid "A mailbox is required"
msgid "This field is required."
msgstr "É necessária uma caixa de correio"
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
#, fuzzy
#| msgid "Domain does not exist"
msgid "Local domain {} does not exist"
msgstr "O domínio não existe"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "O utilizador '%s' já existe"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "Não tem acesso a este domínio"
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -125,60 +125,60 @@ msgstr "Não tem acesso a este domínio"
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "O utilizador '%s' já existe"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Tem de ser um inteiro, positivo"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
#, fuzzy
#| msgid "Domain modified"
msgid "Directory not found."
msgstr "Domínio alterado"
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
#, fuzzy
#| msgid "A mailbox is required"
msgid "A mailbox is required to create aliases."
msgstr "É necessária uma caixa de correio"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown domain %s"
msgid "Unknown status"
@@ -192,11 +192,11 @@ msgstr "Não tem acesso a este domínio"
msgid "You can't delete your own domain"
msgstr "Não é possível eliminar o seu próprio domínio"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -487,12 +487,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Valor de quota inválido para o dominio '%s'"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Este objeto já existe: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d objetos importados com sucesso"
@@ -655,7 +655,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Linha inválida"
@@ -883,7 +883,7 @@ msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
"Número máximo de administradores de domínio que este utilizador pode criar"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Vários"
@@ -994,7 +994,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -1008,26 +1008,26 @@ msgstr ""
msgid "Local"
msgstr "Local"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
#, fuzzy
#| msgid "Profile"
msgid "User profile"
msgstr "Perfil"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Sintax inválida"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Número de linhas inválido"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -1114,124 +1114,132 @@ msgstr "Password para bind"
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
#, fuzzy
#| msgid "Default password scheme"
msgid "Update password service URL"
msgstr "Esquema pré-definido para passwords"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Endereço do Servidor"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "O endereço IP do servidor de DNS do servidor LDAP"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Porta do Servidor"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr " A porta TCP usada pelo servidor LDAP"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
#, fuzzy
#| msgid "Server address"
msgid "Secondary server address"
msgstr "Endereço do Servidor"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
#, fuzzy
#| msgid "The IP address or the DNS name of the LDAP server"
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "O endereço IP do servidor de DNS do servidor LDAP"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
#, fuzzy
#| msgid "Server port"
msgid "Secondary server port"
msgstr "Porta do Servidor"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
#, fuzzy
#| msgid "The TCP port number used by the LDAP server"
msgid "The TCP port number used by the LDAP secondary server"
msgstr " A porta TCP usada pelo servidor LDAP"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Utilizar uma ligação segura"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
#, fuzzy
#| msgid "Use an SSL/TLS connection to access the LDAP server"
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Usar SSL/TLS na ligaçao de acesso ao servidor LDAP"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Especificar se o servidor LDAP e um Active Directory"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Grupos de Administrador"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1239,51 +1247,51 @@ msgstr ""
"Os membros destes grupos \"LDAP Posix\" serão criados como administradores "
"de domínio. Use ';' para separar os grupos."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
#, fuzzy
#| msgid "Group name"
msgid "Group type"
msgstr "Nome do grupo"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Base para pesquisa de Grupos"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "O nome único para a base de pesquisa, usado para encontrar grupos"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Atributo de palavra-passe"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "O atributo utilizado para armazenar palavras-passe"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
#, fuzzy
#| msgid "Authentication method"
msgid "LDAP authentication settings"
msgstr "Método de autenticação"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Método de autenticação"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Escolher o método de autenticação"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "\"Bind DN\""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1291,28 +1299,28 @@ msgstr ""
"O nome único usado para fazer o \"bind\" ao servidor LDAP. Deixar vario "
"para \"bind\" anónimo"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Password para bind"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"A password usada para fazer o \"bind\" ao servidor LDAP (com 'Bind DN')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Base para pesquisa de utilizadores"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "O nome único a usar para pesquisa de utilizadores"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Filtro de pesquisa"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1320,11 +1328,11 @@ msgstr ""
"Um filtro opcional (ex: '(objetClass=person)'). Tem de estar entre "
"parênteses para ser válido"
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Template DN de utilizador"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1333,38 +1341,38 @@ msgstr ""
"O template usado para construir o DN (nome único). Deve apenas conter um "
"'placeholder' (ex: %(user)s) "
-#: core/app_settings.py:338
+#: core/app_settings.py:350
#, fuzzy
#| msgid "LDAP settings"
msgid "LDAP synchronization settings"
msgstr "Definições do serviço de directório"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
#, fuzzy
#| msgid "User DN template"
msgid "Account DN template"
msgstr "Template DN de utilizador"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, fuzzy, python-format
#| msgid ""
#| "The template used to construct a user's DN. It should contain one "
@@ -1376,194 +1384,282 @@ msgstr ""
"O template usado para construir o DN (nome único). Deve apenas conter um "
"'placeholder' (ex: %(user)s) "
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
#, fuzzy
#| msgid "Password attribute"
msgid "Username attribute"
msgstr "Atributo de palavra-passe"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "sent messages"
+msgid "Custom welcome message"
+msgstr "A criar mensagem"
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr ""
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Server port"
+msgid "Secondary theme color"
+msgstr "Porta do Servidor"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
#, fuzzy
#| msgid "Authentication"
msgid "Notifications"
msgstr "Autenticação"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
#, fuzzy
#| msgid "Server address"
msgid "Sender address"
msgstr "Endereço do Servidor"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr ""
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Verifica automaticamente se existem novas versões"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Procurar novas versões"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Destinatário"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Intervalo de tempo para verificar notificações (no topo)"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
#, fuzzy
#| msgid "Interval between two top notification checks"
msgid "Interval between two top notification checks (in seconds)"
msgstr "Intervalo de tempo de verificação entre duas notificações (no topo)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Idade máxima do registo no log"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "A idade maxima do registo de um log, em dias, e de"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Itens por página"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Número de itens apresentados por página"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Redirecionamento pré-definido"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"O redirecionamento padrão usado quando nenhuma aplicação se encontra "
"especificada"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Default password scheme"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Esquema pré-definido para passwords"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Utilizador simples"
@@ -1666,65 +1762,65 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "Uma nova versão está disponível!"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "password"
-#: core/models.py:79
+#: core/models.py:78
#, fuzzy
#| msgid "Prefered language"
msgid "language"
msgstr "Idioma preferido"
-#: core/models.py:83
+#: core/models.py:82
#, fuzzy
#| msgid "Prefered language to display pages"
msgid "Prefered language to display pages."
msgstr "Idioma preferido para exibir páginas"
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Falha ao actualizar password: Modulo LDAP não instalado"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "conta"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Não é possível importa uma conta com permissões superiores"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "O simple utilizador '%s' deve ter endereço de e-mail válido"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2083,7 +2179,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to IMAP server failed: {error}"
@@ -2116,23 +2212,23 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Acesso negado: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Acesso negado"
@@ -2909,11 +3005,11 @@ msgstr "Reencaminhar mensagens para"
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr "Ligação ao servidor MANAGESIEVE falhou, valide a configuração"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3254,7 +3350,7 @@ msgstr "Assinatura"
msgid "User defined email signature"
msgstr "Assinatura de email definida pelo utilizador"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to remove filter"
msgid "Failed to remove attachment: "
@@ -3264,7 +3360,7 @@ msgstr "Falha ao remover os anexos:"
msgid "Date"
msgstr "Data"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Falha ao recuperar hierarquia delimitador"
@@ -3292,6 +3388,3 @@ msgstr ""
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr "Anexo demasiado grande (limite %s)"
-
-#~ msgid "Automatic reply timeout"
-#~ msgstr "Tempo limite de resposta automática"
diff --git a/modoboa/locale/ro_RO/LC_MESSAGES/django.po b/modoboa/locale/ro_RO/LC_MESSAGES/django.po
index 358b030f7..9e703e56f 100644
--- a/modoboa/locale/ro_RO/LC_MESSAGES/django.po
+++ b/modoboa/locale/ro_RO/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2021-10-04 13:27+0000\n"
"Last-Translator: Simona Iacob \n"
"Language-Team: Romanian (Romania) (http://www.transifex.com/tonio/modoboa/"
@@ -22,7 +22,7 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -30,76 +30,76 @@ msgstr ""
"Limită distribuită intre căsuțele postale. Poate fi exprimată in KB, MB "
"(implicit) sau GB. Valoarea 0 reprezintă nelimitat."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
"Cota implicită exprimată în MB aplivată la cutiile poștale. O valuare 0 "
"înseamnă fără cotă."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
#| msgid "Alias with this name already exists"
msgid "domain alias with this name already exists"
msgstr "Un alias cu acelasi nume deja există"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Nu s-au gasit înregistrări MX autorizate pentru acest domeniu"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "Nu poate fi mai mare decat cota domeniului"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Permisiune refuzată."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Acest câmp este necesar"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Lista domenilor administrate (doar reselleri și administratori de domeniu)"
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Ne permis pentru acest rol."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Trebuie să fie egal cu mailbox full_address"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Acest câmp este necesar."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Domeniu local {} nu există"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "O listă de destinatari"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "Utilizatorul '%s' exista deja"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "Nu ai acces la acest domeniu."
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "Nu ai acces la această cutie postală"
@@ -107,58 +107,58 @@ msgstr "Nu ai acces la această cutie postală"
msgid "Here is your new Modoboa password: {}"
msgstr "Aici este noua ta parolă Modoboa: {}"
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "Folderul de stocare a cheilor DKIM nu este configurat"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Nu poți sa definești o cotă nelimitată"
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "Utilizatorul '%s' exista deja"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Trebuie să fie un număr întreg pozitiv"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "openssl nu a fost găsit, asigurați-vă că este instalat."
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Directorul nu a fost găsit."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Definiți cel puțin o adresă de rețea autorizată"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
#, fuzzy
#| msgid "A mailbox is required"
msgid "A mailbox is required to create aliases."
msgstr "O căsuță poștală este necesară"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown"
msgid "Unknown status"
@@ -172,11 +172,11 @@ msgstr "Nu aveți acces la acest domeniu"
msgid "You can't delete your own domain"
msgstr "Nu poți să îți ștergi propriul domeniu"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -475,12 +475,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Adresă IP invalidă pentru {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Obiectul deja există: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d obiecte importate cu succes"
@@ -636,7 +636,7 @@ msgid "Key length"
msgstr "Mărime cheie"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Linie invalidă"
@@ -870,7 +870,7 @@ msgstr ""
"Permiteți acestui administrator să acceseze cutiile poștale ale "
"utilizatorilor"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Diverse"
@@ -979,7 +979,7 @@ msgstr "2FA este deja activat"
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -993,24 +993,24 @@ msgstr "2FA nu este activat"
msgid "Local"
msgstr "Local"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Profil utilizator"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Sintaxă invalidă"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Număr invalid de iterații"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr "Acest cod nu este valabil"
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
"Vă rugăm să folosiți următorul cod pentru a vă recupera parola Modoboa: {}"
@@ -1097,11 +1097,21 @@ msgstr "Mărime parolă aleatorie"
msgid "Length of randomly generated passwords."
msgstr "Mărimea parolelor generate aleator."
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Mărimea parolelor generate aleator."
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "Actualizarea URL-ului serviciului de parolă"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
@@ -1111,106 +1121,106 @@ msgstr ""
"Se aplică numai utilizatorilor care nu sunt locali, adică cei creați automat "
"după o autentificare externă reușită (LDAP, SMTP)."
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "Anunț de recuperare a parolei"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr "Un mesaj temporar care va fi afișat pe pagina de resetare a parolei."
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "Activați recuperarea parolei prin SMS"
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
"Activați recuperarea parolei prin SMS pentru utilizatorii care au completat "
"un număr de telefon."
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "Furnizor de SMS"
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr "Alegeți un furnizor pentru a trimite SMS de recuperare a parolei"
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Adresă server"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "Adresa IP sau numele DNS al serverului LDAP"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Port server"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Numărul de port TCP folosit de serverul LDAP"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "Activați serverul secundar (fallback)"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
"Activați un server LDAP secundar care va fi utilizat în cazul în care "
"serverul principal eșuează"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "Adresa serverului secundar"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "Adresa IP sau numele DNS al serverului LDAP secundar"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "Portul serverului secundar"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "Numărul portului TCP utilizat de serverul secundar LDAP"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Folosește o conexiune securizată"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
"Folosește o conexiune de tip SSL/STARTTLS pentru a accesa serverul LDAP"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Specifică daca serverul LDAP este unul de tip Active Directory"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Grupuri administrator"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1218,47 +1228,47 @@ msgstr ""
"Membrii acelor grupuri LDAP Posix vor fi create ca administratori de "
"domeniu. Folosește caracterul ';' pentru a separa grupurile."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Tipul de grup"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "Tipul grupului LDAP pe care îl utilizați cu directorul selectat."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Baza pentru căutare grupuri"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "Numele ales al bazei de căutare utilizat pentru a găsi grupuri"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Atributul parolă"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Atributul folosit pentru a stoca parola utilizatorului"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "Setări de autentificare LDAP"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Metoda de autentificare"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Alege metodă folosită pentru autentificare"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Atribuie DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1266,28 +1276,28 @@ msgstr ""
"Numele ales folosit la atribuirea cu servarul LDAP. Câpul necompletat se "
"foloseste în cazul atribuirii anonime"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Parola de atribuire"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"Parola folosită la momentul atribuiri cu servarul LDAP (vezi 'Atribuie DB')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Căutare bază de utilizatori"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "Numele ales al bazei de căutare utilizat pentru a găsi utilizatori"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Filtru de căutare"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1295,11 +1305,11 @@ msgstr ""
"Un filtru opțional (de ex. '(ObjectClass = persoană)'). Pentru a fi valid, "
"trebuie să fie închis în paranteze."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Templateul DN pt utilizator"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1308,26 +1318,26 @@ msgstr ""
"Templateul folosit pentru a construi un utilizator DN. Ar trebui să conțină "
"un substituent (de ex. %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "Setări de sincronizare LDAP"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "Activați exportul către LDAP"
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
"Activați sincronizarea automată între baza de date locală și directorul LDAP"
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
"Ștergerea contului LDAP la distanță atunci când contul local este șters"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
@@ -1335,11 +1345,11 @@ msgstr ""
"Ștergeți contul LDAP la distanță atunci când contul local este șters, altfel "
"acesta va fi dezactivat."
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "Șablon de cont DN"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
@@ -1348,136 +1358,209 @@ msgstr ""
" Șablonul utilizat pentru a construi DN-ul unui cont. Acesta trebuie să "
"conțină un spațiu rezervat (ie. %(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "Activați importul din LDAP"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
"Activați sincronizarea conturilor din directorul LDAP în baza de date locală"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "Atributul nume de utilizator"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr "Numele atributului LDAP în care poate fi găsit numele de utilizator."
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Activați sincronizarea Dovecot LDAP"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
"Setările de autentificare LDAP vor fi aplicate la configurația Dovecot."
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Fișier de configurare Dovecot LDAP"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr "Locația fișierului de configurare care conține setările Dovecot LDAP."
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Bord"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "spam messages"
+msgid "Custom welcome message"
+msgstr "mesaje spam"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr "Un mesaj temporar care va fi afișat pe pagina de resetare a parolei."
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Feedul RSS personalizat"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
"Afișează feedul RSS personalizat la reselleri și administratori de domeniu"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Afișează feedul RSS personalizat la reselleri și administratori de domeniu"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Afișează feedul RSS personalizat la reselleri și administratori de domeniu"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Ascunde widgetul de caracteristici "
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
"Ascunde widgetul de caracteristici pentru reselleri și administratori de "
"domeniu"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Email secundar"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Notificări"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Adresa expeditorului"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Adresa de email folosită pentru trimiterea notificărilor."
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "API public"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Activați comunicarea"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Verifică automat dacă este disponibilă o versiune mai nouă"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Verifică dacă există noi versiuni"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "Trimiteți un e-mail atunci când sunt găsite versiuni noi"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
"Trimiteți un e-mail pentru a notifica administratorii despre noile versiuni"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Beneficiar"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "Destinatarul e-mailurilor de notificare a noilor versiuni."
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Trimite statistici"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Trimiteți statistici către API-ul public Modoboa (contoare și extensii "
"utilizate)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Pragul pentru cont invalid"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Pragul pentru cont invalid"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1485,42 +1568,42 @@ msgstr ""
"Un cont cu o ultima data de conectare mai mare decat acest prag (in zile) va "
"fi considerat inactiv"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Intervalul de verificare a notificărilor"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
"Intervalul dintre două verificări de notificare principală (în secunde)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Vechimea maximă a înregistrărilor log"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Vechimea maximă în zilele de înregistrare a intrărilor în jurnal"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Număr de itemi per pagină"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Numărul de itemi afișați pe o pagină"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Redirecționarea principală implicită"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"Redirecționarea implicită utilizată atunci când nu este specificată nici o "
"aplicație"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1530,20 +1613,44 @@ msgstr ""
"tranzițiilor între timul de vara / iarna (adică același timp local care "
"apare de două ori ca urmare a modificării ceasului)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Setează `USE_TZ = True` în settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Update password scheme at login"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Actualizarea schemei de parole la autentificare"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Utilizator simplu"
@@ -1635,63 +1742,63 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] Actualizare(i) disponibilă"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Permiteți accesul la cutiile poștale"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
"Permiteți acestui administrator să acceseze cutiile poștale ale "
"utilizatorilor"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "parolă"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "limbă"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Limba preferată pentru afișarea paginilor."
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Numar de telefon"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Email secundar"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr "O adresă de e-mail alternativă poate fi utilizată pentru recuperare."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Eroare la actualizarea parolei: modulul LDAP nu este instalat"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "cont"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Necunoscut"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Nu puteți importa un cont cu un rol mai mare decât al dvs."
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "Utilizatorul simplu '%s' trebuie să aibă o adresă de e-mail validă"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2054,7 +2161,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -2086,24 +2193,24 @@ msgstr "Nu s-a reușit ștergerea contului LDAP: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "Nu s-a reușit dezactivarea contului LDAP: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Activați comunicarea cu API-ul public Modoboa"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "imposibil de determinat codarea textului"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "Permisiune refuzată: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Permisiune refuzată"
@@ -2879,11 +2986,11 @@ msgstr "mesaje rejectate"
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3246,7 +3353,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to create LDAP account: {}"
msgid "Failed to remove attachment: "
@@ -3256,7 +3363,7 @@ msgstr "Nu s-a reușit crearea unui cont LDAP: {}"
msgid "Date"
msgstr "Dată"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/ru/LC_MESSAGES/django.po b/modoboa/locale/ru/LC_MESSAGES/django.po
index 408ca7729..6ba81b31a 100644
--- a/modoboa/locale/ru/LC_MESSAGES/django.po
+++ b/modoboa/locale/ru/LC_MESSAGES/django.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2020-05-06 11:16+0000\n"
"Last-Translator: Antoine Nguyen \n"
"Language-Team: Russian (http://www.transifex.com/tonio/modoboa/language/"
@@ -27,86 +27,86 @@ msgstr ""
"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
"(n%100>=11 && n%100<=14)? 2 : 3);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
msgid "domain alias with this name already exists"
msgstr "Синоним с таким именем уже есть"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
#, fuzzy
#| msgid "Permissions"
msgid "Permission denied."
msgstr "Права"
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Это поле обязательно для заполнеия"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
#, fuzzy
#| msgid "A quota is required"
msgid "This field is required."
msgstr "Требуется квота"
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
#, fuzzy
#| msgid "Domain does not exist"
msgid "Local domain {} does not exist"
msgstr "Домен не существует"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "Пользователь '%s' уже существует"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "Вы не имеете права доступа к этому домену"
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -116,58 +116,58 @@ msgstr "Вы не имеете права доступа к этому доме
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "Пользователь '%s' уже существует"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
#, fuzzy
#| msgid "Domain modified"
msgid "Directory not found."
msgstr "Домен изменен"
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown"
msgid "Unknown status"
@@ -181,11 +181,11 @@ msgstr "Вы не имеете права доступа к этому доме
msgid "You can't delete your own domain"
msgstr "Вы не можете удалить собственный домен"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -460,12 +460,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Объект уже существует: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d объектов импортировано"
@@ -630,7 +630,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Ошибочная строка"
@@ -847,7 +847,7 @@ msgstr "Администратор домена"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "Разрешить этому администратору доступ к пользовательским ящикам."
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Прочее"
@@ -954,7 +954,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -968,24 +968,24 @@ msgstr ""
msgid "Local"
msgstr "Локальный"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Профиль пользователя"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Ошибка в написании"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Неправильное количество циклов"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -1070,112 +1070,122 @@ msgstr "Длина случайного пароля"
msgid "Length of randomly generated passwords."
msgstr "Длина случайно сгенерированного пароля."
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Длина случайно сгенерированного пароля."
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Адрес сервера"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "IP адрес или DNS имя сервера LDAP"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Порт сервера"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "Номер TCP порта LDAP сервера"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Использовать безопасное соединение"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Использовать SSL/TLS соединение с LDAP сервером"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Укажите, если LDAP сервер в Active Directory"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Администратор груп"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1183,47 +1193,47 @@ msgstr ""
"Члены этих LDAP Posix групп должны быть созданы администратором домена. "
"Используйте ';' для как разделитель груп"
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Тип группы"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "Тип групп, используемых вашим каталогом LDAP"
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "База поиска групп"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "Уникальное имя базы которое используется для поиска групп"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Свойства пароля"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Свойства используемые для сохранения пользовательских паролей"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Метод аутентификации"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Выберите метод аутентификации "
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Соединится с DN "
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1231,27 +1241,27 @@ msgstr ""
"Отличительное имя используемое для соединения с LDAP сервером. Оставьте "
"пустым для анонимного соединения"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Пароль для соединения"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr "Пароль для соединения с LDAP сервером"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "База поиска пользователей"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "Уникальное имя базы которое используется для поиска пользователей"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Фильтр поиска"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1259,11 +1269,11 @@ msgstr ""
"Необязательная срока поиска (например '(objectClass=person)') Значение нужно "
"заключить в скобки"
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Шаблон пользователя DN"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1272,166 +1282,238 @@ msgstr ""
"Шаблон используется для построения запросов к DN Он должен содержать атрибут "
"например (%(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Приборная панель"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "sent messages"
+msgid "Custom welcome message"
+msgstr "Отправлено сообщений"
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Пользовательская RSS лента"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
"Отображать пользовательскую ленту RSS для реселлеров и администраторов "
"доменов"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Отображать пользовательскую ленту RSS для реселлеров и администраторов "
+"доменов"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Отображать пользовательскую ленту RSS для реселлеров и администраторов "
+"доменов"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Спрятать виджет новых функций"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr "Спрятать виджет новых функций для реселлеров и администраторов доменов"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Вспомогательный email"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Уведомления"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Адрес отправителя"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Email адрес для отправки уведомлений"
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Публичный API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Разрешить передачу"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Автоматически проверять доступность новых версий."
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Проверить новые версии"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Получатель"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Отправить статистику"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"Отправлять статистику в Modoboa public API (счетчики и используемые "
"расширения)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Порог неактивного аккаунта"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Порог неактивного аккаунта"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1439,57 +1521,81 @@ msgstr ""
"Аккаунт с датой последнего входа, превышающей этот порог (в днях), будет "
"считаться неактивным"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Интервал между двумя последними проверками уведомлений (в секундах)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Максимальный срок хранения лог записей"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Срок хранения лог записей в днях "
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Элементов на странице"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Количество элементов на странице"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Порог перенаправления по умолчанию"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr "Если приложение не указано. Используется перенаправление по умолчанию."
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Обычный пользователь"
@@ -1581,61 +1687,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Разрешить этому администратору доступ к пользовательским ящикам."
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "пароль"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "язык"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Предпочитаемый язык для отображения страниц."
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Номер телефона"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Вспомогательный email"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr "Альтернативный e-mail может быть использован для востановления."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Ошибка обновления пароля: модуль LDAP не установлен"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "Аккаунт"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Неизвестное"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Вы не можете импортировать аккаунт с ролью старше чем у вас"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "Пользователь '%s' должен иметь действительный почтовый адрес"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -1991,7 +2097,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgid "Connection to IMAP server failed: {error}"
@@ -2024,24 +2130,24 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Разрешить передачу с публичным API Modoboa"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "В разрешении отказано: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "В разрешении отказано"
@@ -2834,11 +2940,11 @@ msgstr ""
msgid "Stop processing"
msgstr "Остановить обработку"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr "Соединение с сервером MANAGESIEVE не удалось, проверьте конфигурацию"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3183,7 +3289,7 @@ msgstr "Тест подписи"
msgid "User defined email signature"
msgstr "Пользовательская подпись"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to remove filter"
msgid "Failed to remove attachment: "
@@ -3193,7 +3299,7 @@ msgstr "Не удалось удалить вложение:"
msgid "Date"
msgstr "Дата"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Не удалось получить разделитель уровней иерархии"
@@ -3223,6 +3329,3 @@ msgstr "Корзина"
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr "Вложения слишком велики (лимит: %s)"
-
-#~ msgid "Automatic reply timeout"
-#~ msgstr "Тайм-аут автоматического ответа"
diff --git a/modoboa/locale/si/LC_MESSAGES/django.po b/modoboa/locale/si/LC_MESSAGES/django.po
index 23a5f57b7..87da52d98 100644
--- a/modoboa/locale/si/LC_MESSAGES/django.po
+++ b/modoboa/locale/si/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2020-05-11 18:45+0000\n"
"Last-Translator: හෙළබස, 2022\n"
"Language-Team: Sinhala (https://www.transifex.com/tonio/teams/13749/si/)\n"
@@ -21,75 +21,75 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -97,56 +97,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -158,11 +158,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -427,12 +427,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -581,7 +581,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -777,7 +777,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -878,7 +878,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -890,24 +890,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -982,410 +982,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1477,61 +1569,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
#, fuzzy
#| msgid "Failed to update LDAP account: {}"
msgid "Failed to update password: LDAP module not installed"
msgstr "LDAP ගිණුම යාවත්කාලයට අසමත් විය: {}"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1858,7 +1950,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1890,21 +1982,21 @@ msgstr "LDAP ගිණුම මැකීමට අසමත් විය: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "LDAP ගිණුම අබල කිරීමට අසමත් විය: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2594,11 +2686,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2900,7 +2992,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to create LDAP account: {}"
msgid "Failed to remove attachment: "
@@ -2910,7 +3002,7 @@ msgstr "LDAP ගිණුම සෑදීමට අසමත් විය: {}"
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/sk/LC_MESSAGES/django.po b/modoboa/locale/sk/LC_MESSAGES/django.po
index 434a6c98c..51635dd1a 100644
--- a/modoboa/locale/sk/LC_MESSAGES/django.po
+++ b/modoboa/locale/sk/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -19,75 +19,75 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n "
">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -95,56 +95,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -156,11 +156,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -425,12 +425,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -579,7 +579,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -775,7 +775,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -876,7 +876,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -888,24 +888,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -980,410 +980,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1475,59 +1567,59 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr ""
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1854,7 +1946,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1886,21 +1978,21 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2588,11 +2680,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2894,7 +2986,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr ""
@@ -2902,7 +2994,7 @@ msgstr ""
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/sk_SK/LC_MESSAGES/django.po b/modoboa/locale/sk_SK/LC_MESSAGES/django.po
index 751e83749..426d3ff03 100644
--- a/modoboa/locale/sk_SK/LC_MESSAGES/django.po
+++ b/modoboa/locale/sk_SK/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2020-05-11 18:45+0000\n"
"Last-Translator: R .. , 2020\n"
"Language-Team: Slovak (Slovakia) (https://www.transifex.com/tonio/"
@@ -23,75 +23,75 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n "
">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -99,56 +99,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -160,11 +160,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -429,12 +429,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -583,7 +583,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -779,7 +779,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -880,7 +880,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -892,24 +892,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -984,410 +984,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1479,61 +1571,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
#, fuzzy
#| msgid "Failed to update LDAP account: {}"
msgid "Failed to update password: LDAP module not installed"
msgstr "Nepodarilo sa aktulizovať účet LDAP: {}"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1870,7 +1962,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1902,21 +1994,21 @@ msgstr "Nepodarilo sa odstrániť účet LDAP: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "Nepodarilo sa deaktivovať účet LDAP: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2606,11 +2698,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2912,7 +3004,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to create LDAP account: {}"
msgid "Failed to remove attachment: "
@@ -2922,7 +3014,7 @@ msgstr "Nepodarilo sa vytvoriť účet LDAP: {}"
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/sl_SI/LC_MESSAGES/django.po b/modoboa/locale/sl_SI/LC_MESSAGES/django.po
index 86e2010f1..4da0c033b 100644
--- a/modoboa/locale/sl_SI/LC_MESSAGES/django.po
+++ b/modoboa/locale/sl_SI/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2016-11-09 16:13+0000\n"
"Last-Translator: Gregor \n"
"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/tonio/modoboa/"
@@ -20,75 +20,75 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
"n%100==4 ? 2 : 3);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -96,56 +96,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknow migration"
msgid "Unknown status"
@@ -159,11 +159,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -430,12 +430,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -588,7 +588,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -791,7 +791,7 @@ msgstr "Selitev IMAP"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -896,7 +896,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -908,24 +908,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -1004,422 +1004,516 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Naslov strežnika"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Vrata strežnika"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
#, fuzzy
#| msgid "Server address"
msgid "Secondary server address"
msgstr "Naslov strežnika"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
#, fuzzy
#| msgid "Server port"
msgid "Secondary server port"
msgstr "Vrata strežnika"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Uporabi zavarovano povezavo"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
#, fuzzy
#| msgid "Use a secured connection to access IMAP server"
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Za dostop do IMAP strežnika, uporabite zavarovano povezavo"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
#, fuzzy
#| msgid "Connection settings"
msgid "LDAP authentication settings"
msgstr "Nastavitve povezave"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
#, fuzzy
#| msgid "Connection settings"
msgid "LDAP synchronization settings"
msgstr "Nastavitve povezave"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr ""
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Server port"
+msgid "Secondary theme color"
+msgstr "Vrata strežnika"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr ""
-#: core/app_settings.py:504
+#: core/app_settings.py:601
#, fuzzy
#| msgid "Server address"
msgid "Sender address"
msgstr "Naslov strežnika"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr ""
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1511,61 +1605,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr ""
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
#, fuzzy
#| msgid "Unknow migration"
msgid "Unknown"
msgstr "Neznana selitev"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1912,7 +2006,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr "Selitev IMAP"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, fuzzy, python-brace-format
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to IMAP server failed: {error}"
@@ -1945,21 +2039,21 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2693,13 +2787,13 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
#, fuzzy
#| msgid "Connection to IMAP server failed: %s"
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr "Povezava z IMAP strežnikom ni uspela: %s"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -3015,7 +3109,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr ""
@@ -3023,7 +3117,7 @@ msgstr ""
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/sv/LC_MESSAGES/django.po b/modoboa/locale/sv/LC_MESSAGES/django.po
index afd7aa006..10e6f17d3 100644
--- a/modoboa/locale/sv/LC_MESSAGES/django.po
+++ b/modoboa/locale/sv/LC_MESSAGES/django.po
@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
-#
+#
# Translators:
# Martin Persson , 2014,2017
# Olle Gustafsson , 2013
@@ -10,85 +10,92 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2011-07-01 08:15+0000\n"
-"Last-Translator: Olle Gustafsson , 2013,2015-2018,2020,2022-2023,2025\n"
-"Language-Team: Swedish (http://app.transifex.com/tonio/modoboa/language/sv/)\n"
+"Last-Translator: Olle Gustafsson , "
+"2013,2015-2018,2020,2022-2023,2025\n"
+"Language-Team: Swedish (http://app.transifex.com/tonio/modoboa/language/"
+"sv/)\n"
+"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
-msgstr "Kvot som delas mellan brevlådor. Kan uttryckas i KB, MB (standard) eller GB. Ett värde på 0 betyder ingen kvot."
+msgstr ""
+"Kvot som delas mellan brevlådor. Kan uttryckas i KB, MB (standard) eller GB. "
+"Ett värde på 0 betyder ingen kvot."
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr "Standardkvot i MB tillämpas på postlådor. Ett värde på 0 betyder ingen kvot."
+msgstr ""
+"Standardkvot i MB tillämpas på postlådor. Ett värde på 0 betyder ingen kvot."
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr "ett domänalias med detta namn finns redan"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "Ingen auktoriserad MX-post hittades för den här domänen"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "Kan inte vara större än domänkvoten"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "Åtkomst nekad."
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Detta fält är obligatoriskt"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
-msgstr "Lista över administrerade domäner (endast återförsäljare och domänadministratörer)."
+msgstr ""
+"Lista över administrerade domäner (endast återförsäljare och "
+"domänadministratörer)."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "Inte tillåtet för denna roll."
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "Måste vara lika med postlådans full_adress"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "Detta fält är obligatoriskt."
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "Lokal domän {} finns inte"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "En lista över mottagare"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr "Detta alias finns redan"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "Du har inte åtkomst till den här domänen."
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "Du har inte tillgång till den här brevlådan."
@@ -96,56 +103,57 @@ msgstr "Du har inte tillgång till den här brevlådan."
msgid "Here is your new Modoboa password: {}"
msgstr "Här är ditt nya Modoboa-lösenord: {}"
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "Lagringskatalogen för DKIM-nycklar är inte konfigurerad"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr "Det här fältet är giltigt när typen är relaydomain"
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "Du kan inte definiera en obegränsad kvot."
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "Användare '%s' finns redan"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "Måste vara ett positivt heltal"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "openssl hittades ej, säkerställ att det är installerat."
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "Katalog hittades ej."
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr "Detta fält tillåter bara giltiga IP-adresser (eller nätverk)"
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr "Inaktivera imap-migrering innan du inaktiverar det här alternativet."
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "Definiera minst ett auktoriserat nätverk/adress"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
-msgstr "Den vänstra delen av en e-postadress kan inte vara längre än 64 tecken."
+msgstr ""
+"Den vänstra delen av en e-postadress kan inte vara längre än 64 tecken."
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr "En brevlåda krävs för att skapa alias."
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr "Okänd status"
@@ -157,11 +165,11 @@ msgstr "Du saknar åtkomst till denna domän"
msgid "You can't delete your own domain"
msgstr "Du kan inre radera din egen domän"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr "Inget larm-ID angett"
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr "Mottog ogiltiga larm-id(n)"
@@ -183,9 +191,11 @@ msgstr "Giltiga MX"
#: admin/app_settings.py:37
msgid ""
-"A list of IP or network address every MX record should match. A warning will"
-" be sent if a record does not respect it."
-msgstr "En lista med IP- eller nätverksadresser som varje MX-post ska matcha. En varning kommer att skickas om en post inte respekterar den."
+"A list of IP or network address every MX record should match. A warning will "
+"be sent if a record does not respect it."
+msgstr ""
+"En lista med IP- eller nätverksadresser som varje MX-post ska matcha. En "
+"varning kommer att skickas om en post inte respekterar den."
#: admin/app_settings.py:47
msgid "New domains must use authorized MX(s)"
@@ -195,7 +205,9 @@ msgstr "Nya domäner måste använda auktoriserade MX(er)"
msgid ""
"Prevent the creation of a new domain if its MX record does not use one of "
"the defined addresses."
-msgstr "Förhindra skapandet av en ny domän om dess MX-post inte använder någon av de definierade adresserna."
+msgstr ""
+"Förhindra skapandet av en ny domän om dess MX-post inte använder någon av de "
+"definierade adresserna."
#: admin/app_settings.py:59
msgid "Enable IPV6 checks"
@@ -219,7 +231,9 @@ msgstr "Aktivera DKIM-kontroller"
#: admin/app_settings.py:80
msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
-msgstr "Kontrollera om alla domäner med DKIM-inloggning aktiverad har en giltig DNS-post"
+msgstr ""
+"Kontrollera om alla domäner med DKIM-inloggning aktiverad har en giltig DNS-"
+"post"
#: admin/app_settings.py:88
msgid "Enable DMARC checks"
@@ -262,7 +276,10 @@ msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
-msgstr "Absolut sökväg till katalogen där DKIMs privata nycklar kommer att lagras. Se till att den här katalogen tillhör root-användaren och inte kan läsas av omvärlden."
+msgstr ""
+"Absolut sökväg till katalogen där DKIMs privata nycklar kommer att lagras. "
+"Se till att den här katalogen tillhör root-användaren och inte kan läsas av "
+"omvärlden."
#: admin/app_settings.py:137
msgid "Default DKIM key length"
@@ -280,7 +297,9 @@ msgstr "Standard domänkvota"
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
-msgstr "Standardkvot (i MB) tillämpas på nyskapade domäner utan värde angivet. Ett värde på 0 betyder ingen kvot."
+msgstr ""
+"Standardkvot (i MB) tillämpas på nyskapade domäner utan värde angivet. Ett "
+"värde på 0 betyder ingen kvot."
#: admin/app_settings.py:156
msgid "Default domain sending limit"
@@ -290,7 +309,9 @@ msgstr "Standardgräns för domänsändning"
msgid ""
"Number of messages freshly created domains will be allowed to send per day. "
"Leave empty for no limit."
-msgstr "Antal meddelanden som nyskapade domäner tillåts skicka per dag. Lämna tomt utan gräns."
+msgstr ""
+"Antal meddelanden som nyskapade domäner tillåts skicka per dag. Lämna tomt "
+"utan gräns."
#: admin/app_settings.py:170 limits/app_settings.py:61
#: limits/app_settings.py:135 limits/constants.py:31 limits/constants.py:84
@@ -305,7 +326,9 @@ msgstr "Hantera brevlådor på filsystemet"
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
-msgstr "Byt namn på eller ta bort postlådor i filsystemet när de byter namn eller tas bort inom Modoboa"
+msgstr ""
+"Byt namn på eller ta bort postlådor i filsystemet när de byter namn eller "
+"tas bort inom Modoboa"
#: admin/app_settings.py:186 admin/models/domain.py:36
msgid "Default mailbox quota"
@@ -315,7 +338,9 @@ msgstr "Standard brevlådekvota"
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
-msgstr "Standardpostlådekvot (i MB) tillämpas på nyskapade domäner utan värde angivet. Ett värde på 0 betyder ingen kvot."
+msgstr ""
+"Standardpostlådekvot (i MB) tillämpas på nyskapade domäner utan värde "
+"angivet. Ett värde på 0 betyder ingen kvot."
#: admin/app_settings.py:197
msgid "Default mailbox sending limit"
@@ -325,7 +350,9 @@ msgstr "Standardgräns för postlådans sändning"
msgid ""
"Number of messages freshly created mailboxes will be allowed to send per "
"day. Leave empty for no limit."
-msgstr "Antal meddelanden som nyskapade brevlådor tillåts skicka per dag. Lämna tomt utan gräns."
+msgstr ""
+"Antal meddelanden som nyskapade brevlådor tillåts skicka per dag. Lämna tomt "
+"utan gräns."
#: admin/app_settings.py:207
msgid "Automatic account removal"
@@ -340,8 +367,7 @@ msgid "Automatic domain/mailbox creation"
msgstr "Automatisk domän-/brevlådeskapande"
#: admin/app_settings.py:221
-msgid ""
-"Create a domain and a mailbox when an account is automatically created."
+msgid "Create a domain and a mailbox when an account is automatically created."
msgstr "Skapa en domän och en postlåda när ett konto skapas automatiskt."
#: admin/app_settings.py:230
@@ -427,12 +453,12 @@ msgstr "DNS namn är för långt: {}"
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Ogiltigt IP-adressformat för {domain}; {addr}"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "Objekt finns redan: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d objekt har importerats framgångsrikt"
@@ -455,7 +481,9 @@ msgstr "Det gick inte att avkoda CSV-fil med %(encoding)s kodning"
msgid ""
"DKIM path non-writable (either a permission issue or the directory does not "
"exist)"
-msgstr "DKIM sökväg ej skrivbar (endera rättighetsproblem eller katalogen existerar inte)"
+msgstr ""
+"DKIM sökväg ej skrivbar (endera rättighetsproblem eller katalogen existerar "
+"inte)"
#: admin/management/commands/subcommands/_manage_dkim_keys.py:52
msgid "Failed to generate DKIM private key"
@@ -574,14 +602,16 @@ msgstr "Aktivera DKIM-signering"
#: admin/models/domain.py:63
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
-msgstr "Om du aktiverar den här funktionen kommer en DKIM-nyckel att genereras för den här domänen."
+msgstr ""
+"Om du aktiverar den här funktionen kommer en DKIM-nyckel att genereras för "
+"den här domänen."
#: admin/models/domain.py:70
msgid "Key length"
msgstr "Nyckellängd"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Ogiltig rad"
@@ -648,14 +678,19 @@ msgstr "Domänen existerar inte"
msgid ""
"Modoboa detected that domain %(domain)s is listed by the following DNSBL "
"providers:"
-msgstr "Modoboa upptäckte att domänen %(domain)s listas av följande DNSBL-leverantörer:"
+msgstr ""
+"Modoboa upptäckte att domänen %(domain)s listas av följande DNSBL-"
+"leverantörer:"
#: admin/templates/admin/notifications/domain_in_dnsbl.html:11
msgid ""
"The domain's reputation will be affected and there is a chance that emails "
"coming from it are considered as spam. You should contact those providers "
"and ask them to unlist detected IP address(es)."
-msgstr "Domänens rykte kommer att påverkas och det finns en chans att e-postmeddelanden som kommer från den betraktas som spam. Du bör kontakta dessa leverantörer och be dem att ta bort upptäckta IP-adresser."
+msgstr ""
+"Domänens rykte kommer att påverkas och det finns en chans att e-"
+"postmeddelanden som kommer från den betraktas som spam. Du bör kontakta "
+"dessa leverantörer och be dem att ta bort upptäckta IP-adresser."
#: admin/templates/admin/notifications/domain_invalid_mx.html:3
#, python-format
@@ -702,7 +737,8 @@ msgstr "Period mellan två autosvar"
#: autoreply/app_settings.py:20
msgid ""
"Number of days to wait before sending a new auto-reply to the same recipient"
-msgstr "Antal dagar att vänta innan ett nytt autosvar skickas till samma mottagare"
+msgstr ""
+"Antal dagar att vänta innan ett nytt autosvar skickas till samma mottagare"
#: autoreply/app_settings.py:27 autoreply/app_settings.py:36
msgid "Default subject"
@@ -718,7 +754,9 @@ msgstr "Standard ämne när ett autosvarsmeddelande skapas automatiskt."
msgid ""
"Default content used when an auto-reply message is created automatically. "
"The '%(name)s' macro will be replaced by the user's full name."
-msgstr "Standard innehåll som används när ett autosvarsmeddelande skapas automatiskt. '%(name)s' ersätts med användarens fullständiga namn."
+msgstr ""
+"Standard innehåll som används när ett autosvarsmeddelande skapas "
+"automatiskt. '%(name)s' ersätts med användarens fullständiga namn."
#: autoreply/apps.py:15
msgid "Automatic replies"
@@ -755,7 +793,9 @@ msgstr "Server URL"
#: calendars/app_settings.py:19
msgid ""
"The URL of your Radicale server. It will be used to construct calendar URLs."
-msgstr "URL:en till din Radicale-server. Den kommer att användas för att skapa kalenderwebbadresser."
+msgstr ""
+"URL:en till din Radicale-server. Den kommer att användas för att skapa "
+"kalenderwebbadresser."
#: calendars/app_settings.py:31
msgid "Rights management"
@@ -775,9 +815,10 @@ msgstr "Tillåt administration av kalendrar"
#: calendars/app_settings.py:48
msgid "Allow domain administrators to manage user calendars (read and write)"
-msgstr "Tillåt domänadministratörer att hantera användarkalendrar (läsa och skriva)"
+msgstr ""
+"Tillåt domänadministratörer att hantera användarkalendrar (läsa och skriva)"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Övrigt"
@@ -789,7 +830,8 @@ msgstr "Maximal storlek på ICS-filer"
#: calendars/app_settings.py:68
msgid ""
"Maximum size in bytes of imported ICS files (or KB, MB, GB if specified)"
-msgstr "Maximum size in bytes of imported ICS files (or KB, MB, GB if specified)"
+msgstr ""
+"Maximum size in bytes of imported ICS files (or KB, MB, GB if specified)"
#: calendars/app_settings.py:89 core/api/v2/viewsets.py:172
msgid "Calendars"
@@ -815,7 +857,9 @@ msgstr "Synchonize address book using CardDAV"
msgid ""
"Choose to synchronize or not your address book using CardDAV. You will be "
"able to access your contacts from the outside."
-msgstr "Choose to synchronize or not your address book using CardDAV. You will be able to access your contacts from the outside."
+msgstr ""
+"Choose to synchronize or not your address book using CardDAV. You will be "
+"able to access your contacts from the outside."
#: contacts/app_settings.py:29
msgid "Synchronization frequency"
@@ -876,9 +920,10 @@ msgstr "2FA redan aktiverat"
#: core/api/v1/serializers.py:87
#, python-format
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
-msgstr "Misslyckades TFA-inställningar redigeringsförsök från '%s' som användare '%s'"
+msgstr ""
+"Misslyckades TFA-inställningar redigeringsförsök från '%s' som användare '%s'"
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr "Ogiltigt lösenordd"
@@ -890,25 +935,24 @@ msgstr "2FA är nu aktiverat"
msgid "Local"
msgstr "Lokal"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Användarprofil"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Ogiltig syntax"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Ogiltigt antal omgångar"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr "Denna kod är ogiltig"
-#: core/api/v2/serializers.py:473 core/views/auth.py:194
-#: core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr "Använd följande kod för att återställa ditt Modoboa lösenord: {}"
@@ -957,7 +1001,9 @@ msgstr "Antal omgångar"
msgid ""
"Number of rounds to use (only used by sha256crypt and sha512crypt). Must be "
"between 1000 and 999999999, inclusive."
-msgstr "Antal omgångar att använda (används endast av sha256crypt och sha512crypt). Måste vara mellan 1000 och 999999999."
+msgstr ""
+"Antal omgångar att använda (används endast av sha256crypt och sha512crypt). "
+"Måste vara mellan 1000 och 999999999."
#: core/app_settings.py:73
msgid "Update password scheme at login"
@@ -965,7 +1011,8 @@ msgstr "Uppdatera lösenordsschema vid inloggning"
#: core/app_settings.py:76
msgid "Update user password at login to use the default password scheme"
-msgstr "Uppdatera användarlösenord vid inloggning för att använda standard schema"
+msgstr ""
+"Uppdatera användarlösenord vid inloggning för att använda standard schema"
#: core/app_settings.py:84
msgid "Default password"
@@ -983,410 +1030,552 @@ msgstr "Slumpmässig längd på lösenord"
msgid "Length of randomly generated passwords."
msgstr "Längd på slumpmässigt genererat lösenord"
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Längd på slumpmässigt genererat lösenord"
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "Uppdatera lösenords service URL"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
-msgstr "Webbadressen till en extern sida där användare kan uppdatera sitt lösenord. Det gäller endast icke-lokala användare, dvs. de som skapas automatiskt efter en lyckad extern autentisering (LDAP, SMTP)."
+msgstr ""
+"Webbadressen till en extern sida där användare kan uppdatera sitt lösenord. "
+"Det gäller endast icke-lokala användare, dvs. de som skapas automatiskt "
+"efter en lyckad extern autentisering (LDAP, SMTP)."
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "Meddelande om återställning av lösenord"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
-msgstr "Ett tillfälligt meddelande som kommer att visas på sidan för återställning av lösenord."
+msgstr ""
+"Ett tillfälligt meddelande som kommer att visas på sidan för återställning "
+"av lösenord."
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "Aktivera lösenordsåterställning via SMS"
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
-msgstr "Aktivera återställning av lösenord via SMS för användare som fyllt i ett telefonnummer."
+msgstr ""
+"Aktivera återställning av lösenord via SMS för användare som fyllt i ett "
+"telefonnummer."
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "SMS provider"
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr "Välj en leverantör för att skicka SMS för lösenordsåterställning"
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr "LDAP"
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Server adress"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "IP adressen eller DNS namn för LDAP server"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Server port"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "TCP port som används av LDAP servern"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "Aktivera sekundär server (reserv)"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
-msgstr "Aktivera en sekundär LDAP-server som kommer att användas om den primära misslyckas"
+msgstr ""
+"Aktivera en sekundär LDAP-server som kommer att användas om den primära "
+"misslyckas"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "Sekundär serveradress"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "IP-adressen eller DNS-namnet på den sekundära LDAP-servern"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "Sekundär serverport"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "TCP-portnumret som används av LDAP sekundärserver"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Använd en säker anslutning"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "Använd en SSL / STARTTLS-anslutning för att komma åt LDAP-servern"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Berätta om LDAP-servern är en Active Directory"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Administratörsgrupper"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
-"Members of those LDAP Posix groups will be created as domain administrators."
-" Use ';' characters to separate groups."
-msgstr "Användare av dessa LDAP Posix grupper kommer skapas som domänadministratörer. Använd ';' för att separera grupper."
+"Members of those LDAP Posix groups will be created as domain administrators. "
+"Use ';' characters to separate groups."
+msgstr ""
+"Användare av dessa LDAP Posix grupper kommer skapas som "
+"domänadministratörer. Använd ';' för att separera grupper."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Grupptyp"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "Välj LDAP grupptyp att använda med din katalog"
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Grupper sökbas"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "Det unika namnet för sökbasen som används för att hitta grupper"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Lösenordsattribut"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Attribut som används för att lagra användarlösenord"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "LDAP autentiseringsinställningar"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Autentiseringsmetod"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Välj autentiseringsmetod att använda"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Bind DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
-msgstr "Det unika namnet för att använda vid bindningar till LDAP-servern. Lämna tomt för en anonym bindning"
+msgstr ""
+"Det unika namnet för att använda vid bindningar till LDAP-servern. Lämna "
+"tomt för en anonym bindning"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Bind lösenord"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
-msgstr "Lösenordet ska användas vid bindning till LDAP-servern (med \"Bind DN ')"
+msgstr ""
+"Lösenordet ska användas vid bindning till LDAP-servern (med \"Bind DN ')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Användare sökbas"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "Det unika namnet för sökbasen som används för att hitta användare"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Sökfilter"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
-msgstr "En valfri filtersträng (t.ex. \"(objectClass = personer) '). För att vara giltigt måste det omges av parenteser."
+msgstr ""
+"En valfri filtersträng (t.ex. \"(objectClass = personer) '). För att vara "
+"giltigt måste det omges av parenteser."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Anvädar DN mall"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
-msgstr "Mallen som används för att konstruera en användares DN. Den bör innehålla en platshållare (dvs. %(user)s)"
+msgstr ""
+"Mallen som används för att konstruera en användares DN. Den bör innehålla en "
+"platshållare (dvs. %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "LDAP synkroniseringsinställningar"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "Aktivera export till LDAP"
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
-msgstr "Aktivera automatisk synkronisering mellan lokal databas och LDAP-katalog"
+msgstr ""
+"Aktivera automatisk synkronisering mellan lokal databas och LDAP-katalog"
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr "Ta bort fjärran LDAP-konto när lokalt konto raderas"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
-msgstr "Radera LDAP-fjärrkonto när det lokala kontot raderas, annars inaktiveras det."
+msgstr ""
+"Radera LDAP-fjärrkonto när det lokala kontot raderas, annars inaktiveras det."
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "DN-mall för kontot"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
-msgstr "Mallen som används för att skapa ett kontos DN. Den ska innehålla en platshållare (ex.%(user)s)"
+msgstr ""
+"Mallen som används för att skapa ett kontos DN. Den ska innehålla en "
+"platshållare (ex.%(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "Aktiver import från LDAP"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr "Aktivera kontosynkronisering från LDAP-katalog till lokal databas"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "Attribut för användarnamn"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr "Namnet på LDAP-attributet där användarnamnet finns."
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Aktivera Dovecot LDAP-synkronisering"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr "LDAP-autentiseringsinställningar tillämpas på Dovecot-konfigurationen."
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Dovecot LDAP-konfigurationsfil"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
-msgstr "Plats för konfigurationsfilen som innehåller Dovecot LDAP-inställningar."
+msgstr ""
+"Plats för konfigurationsfilen som innehåller Dovecot LDAP-inställningar."
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Kontrollpanel"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom message"
+msgid "Custom welcome message"
+msgstr "Anpassat meddelande"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+"Ett tillfälligt meddelande som kommer att visas på sidan för återställning "
+"av lösenord."
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Användardefinierat RSS-flöde"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
-msgstr "Visa användardefinierat RSS-flöde för återförsäljare och domänadministratörer"
+msgstr ""
+"Visa användardefinierat RSS-flöde för återförsäljare och domänadministratörer"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+"Visa användardefinierat RSS-flöde för återförsäljare och domänadministratörer"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+"Visa användardefinierat RSS-flöde för återförsäljare och domänadministratörer"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Dölj egenskaper widget"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr "Dölj egenskaper widget för återförsäljare och domänadministratörer"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "Sekundär e-post"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Notifikationer"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Avsändaradress"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "E-postadress som används till att skicka notifikationer."
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Publikt API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "Aktivera kommunikation"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "Kontrollera automatiskt om en nyare version finns"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Kontrollera nya versioner"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "Skicka ett mejl när nya versioner hittas"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
-msgstr "Skicka ett e-postmeddelande för att meddela administratörer om nya versioner"
+msgstr ""
+"Skicka ett e-postmeddelande för att meddela administratörer om nya versioner"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Mottagare"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "Mottagare av e-postmeddelanden om nya versioner."
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "Skicka statistik"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
-msgstr "Skicka statistik för Modoboas publika API (räknare och använda tillägg)"
+msgstr ""
+"Skicka statistik för Modoboas publika API (räknare och använda tillägg)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr "Aktivera spårning av inaktiva konton"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
-"Allow the administrator to set a threshold (in days) beyond which an account"
-" is considered inactive if the user hasn't logged in"
-msgstr "Tillåt administratören att ställa in en tröskel (i dagar) över vilken ett konto anses inaktivt om användaren inte har loggat in"
+"Allow the administrator to set a threshold (in days) beyond which an account "
+"is considered inactive if the user hasn't logged in"
+msgstr ""
+"Tillåt administratören att ställa in en tröskel (i dagar) över vilken ett "
+"konto anses inaktivt om användaren inte har loggat in"
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Gräns för inaktiva konton"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
-"An account with a last login date greater than this threshold (in days) will"
-" be considered as inactive"
-msgstr "Ett konto som inte har loggat in innan denna gräns (antal dagar) kommer anses som inaktivt"
+"An account with a last login date greater than this threshold (in days) will "
+"be considered as inactive"
+msgstr ""
+"Ett konto som inte har loggat in innan denna gräns (antal dagar) kommer "
+"anses som inaktivt"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "Toppnotifikationer kontrollintervall"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "Intervall mellan två toppnotifikationskontroller (i sekunder)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Maximal ålder för loggpost"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Maximal ålder i dagar för en logg post"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Artiklar per sida"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Antal poster som visas per sida"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Standard topp omdirigering"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr "Standard omdirigering när ingen applikation angetts"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
-msgstr "Du måste ange USE_TZ till False, detta kan leda till problem under övergångar mellan sommar / vintertid (dvs samma lokal tid som uppträder två gånger på grund av klockbyte)."
+msgstr ""
+"Du måste ange USE_TZ till False, detta kan leda till problem under "
+"övergångar mellan sommar / vintertid (dvs samma lokal tid som uppträder två "
+"gånger på grund av klockbyte)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "Ange `USE_TZ = True` i settings.py"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr "Lösenordsschemat du använder är föråldrat."
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr "Uppgradera ditt lösenordsschema till ett starkare"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Enkel användare"
@@ -1478,59 +1667,59 @@ msgstr "Du använder fortfarande ett föråldrat lösenordsschema (%s)"
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] Uppdatering(ar) finns"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "Tillåt åtkomst till brevlådor"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Tillåt den här administratören att ändra användares brevlådor"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "lösenord"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "språk"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Önskat språk för att visa sidor."
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Telefonnummer"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "Sekundär e-post"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr "En alternativ e-post adress, kan användas för återställningsbehov."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Misslyckades med att uppdatera lösenord: LDAP modul ej installerad"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "konto"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Okänt"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Du kan inte importera konto med en roll större än din"
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr "Den enkla användaren '{}' måste ha en giltig e-postadress"
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr "användarnamn och e-postfält får inte skilja sig åt för '{}'"
@@ -1617,8 +1806,12 @@ msgid ""
msgid_plural ""
"\n"
" The following updates are available:\n"
-msgstr[0] "\n Följande uppdateringar finns tillgängliga:\n"
-msgstr[1] "\n Följande uppdateringar finns tillgängliga:\n"
+msgstr[0] ""
+"\n"
+" Följande uppdateringar finns tillgängliga:\n"
+msgstr[1] ""
+"\n"
+" Följande uppdateringar finns tillgängliga:\n"
#: core/utils.py:43
msgid "The core part of Modoboa"
@@ -1653,7 +1846,8 @@ msgstr "Aktivera omvända sökningar"
#: dmarc/forms.py:23
msgid "Enable reverse DNS lookups (reports will be longer to display)"
-msgstr "Aktivera omvända DNS-sökningar (rapporter kommer att vara längre att visa)"
+msgstr ""
+"Aktivera omvända DNS-sökningar (rapporter kommer att vara längre att visa)"
#: dmarc/forms.py:42
msgid "DMARC"
@@ -1840,7 +2034,9 @@ msgstr "Mappfilteruteslutningar"
msgid ""
"Use a regular expression to explicitly include folders in sync. Example: "
"^Trash$|Del"
-msgstr "Använd ett reguljärt uttryck för att explicit inkludera mappar i synkronisering. Exempel: ^Trash$|Del"
+msgstr ""
+"Använd ett reguljärt uttryck för att explicit inkludera mappar i "
+"synkronisering. Exempel: ^Trash$|Del"
#: imap_migration/app_settings.py:74
msgid "Folder Filter Inclusions"
@@ -1849,15 +2045,18 @@ msgstr "Mappfilterinneslutningar"
#: imap_migration/app_settings.py:76
msgid ""
"A comma seperated list of folders to explicitly include in sync even if "
-"filtered by the Folder Filter Exclusions. Example: debian.user, "
-"debian.personal "
-msgstr "En kommaseparerad lista över mappar som explicit ska inkluderas i synkronisering även om de filtreras av mappfilteruteslutningarna. Exempel: debian.user, debian.personal"
+"filtered by the Folder Filter Exclusions. Example: debian.user, debian."
+"personal "
+msgstr ""
+"En kommaseparerad lista över mappar som explicit ska inkluderas i "
+"synkronisering även om de filtreras av mappfilteruteslutningarna. Exempel: "
+"debian.user, debian.personal"
#: imap_migration/apps.py:20
msgid "IMAP Migration"
msgstr "IMAP-migrering"
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr "Anslutning till IMAP-server misslyckades: {error}"
@@ -1866,12 +2065,16 @@ msgstr "Anslutning till IMAP-server misslyckades: {error}"
msgid ""
"Automatic domain/mailbox creation is disabled which means IMAP "
"authentication won't work."
-msgstr "Automatic domain/mailbox creation is disabled which means IMAP authentication won't work."
+msgstr ""
+"Automatic domain/mailbox creation is disabled which means IMAP "
+"authentication won't work."
#: imap_migration/checks.py:16
msgid ""
"Go to the online parameters panel (admin tab) and activate this feature."
-msgstr "Gå till onlineparametrarnas panel (admin-fliken) och aktivera den här funktionen."
+msgstr ""
+"Gå till onlineparametrarnas panel (admin-fliken) och aktivera den här "
+"funktionen."
#: ldapsync/lib.py:82
msgid "Failed to create LDAP account: {}"
@@ -1889,21 +2092,21 @@ msgstr "Failed to delete LDAP account: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "Det gick inte att inaktivera LDAP-konto: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr "Det gick inte att kommunicera med offentligt API: %s"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "kan inte bestämma kodning av sträng"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr "Tillstånd nekad: {}"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "Tillstånd nekas"
@@ -1940,13 +2143,17 @@ msgstr "Domänadministratörer"
msgid ""
"Maximum number of allowed domain administrators for a new administrator. (0 "
"to deny any creation, -1 to allow unlimited creations)"
-msgstr "Maximalt antal tillåtna domänadministratörer för en ny administratör. (0 för att neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
+msgstr ""
+"Maximalt antal tillåtna domänadministratörer för en ny administratör. (0 för "
+"att neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
#: limits/app_settings.py:41
msgid ""
"Maximum number of allowed domains for a new administrator. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "Maximalt antal tillåtna domäner för en ny administratör. (0 för att neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
+msgstr ""
+"Maximalt antal tillåtna domäner för en ny administratör. (0 för att neka "
+"någon skapelse, -1 för att tillåta obegränsade skapelser)"
#: limits/app_settings.py:49 limits/app_settings.py:123 limits/constants.py:22
#: limits/constants.py:76
@@ -1955,15 +2162,19 @@ msgstr "Domän alias"
#: limits/app_settings.py:52
msgid ""
-"Maximum number of allowed domain aliases for a new administrator. (0 to deny"
-" any creation, -1 to allow unlimited creations)"
-msgstr "Maximalt antal tillåtna domänalias för en ny administratör. (0 för att neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
+"Maximum number of allowed domain aliases for a new administrator. (0 to deny "
+"any creation, -1 to allow unlimited creations)"
+msgstr ""
+"Maximalt antal tillåtna domänalias för en ny administratör. (0 för att neka "
+"någon skapelse, -1 för att tillåta obegränsade skapelser)"
#: limits/app_settings.py:64
msgid ""
"Maximum number of allowed mailboxes for a new administrator. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "Maximalt antal tillåtna brevlådor för en ny administratör. (0 för att neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
+msgstr ""
+"Maximalt antal tillåtna brevlådor för en ny administratör. (0 för att neka "
+"någon skapelse, -1 för att tillåta obegränsade skapelser)"
#: limits/app_settings.py:73 limits/app_settings.py:146 limits/constants.py:39
#: limits/constants.py:92
@@ -1974,7 +2185,9 @@ msgstr "Brevlådealias"
msgid ""
"Maximum number of allowed aliases for a new administrator. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "Maximalt antal tillåtna alias för en ny administratör. (0 för att neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
+msgstr ""
+"Maximalt antal tillåtna alias för en ny administratör. (0 för att neka någon "
+"skapelse, -1 för att tillåta obegränsade skapelser)"
#: limits/app_settings.py:84 limits/constants.py:59
msgid "Quota"
@@ -1984,7 +2197,9 @@ msgstr "Kvota"
msgid ""
"The quota a reseller will be allowed to share between the domains he "
"creates. (0 means no quota)"
-msgstr "Den kvot som en återförsäljare får dela mellan de domäner han skapar. (0 betyder ingen kvot)"
+msgstr ""
+"Den kvot som en återförsäljare får dela mellan de domäner han skapar. (0 "
+"betyder ingen kvot)"
#: limits/app_settings.py:98
msgid "Default per-domain limits"
@@ -2000,27 +2215,35 @@ msgstr "Aktivera eller inaktivera gränser per domän"
#: limits/app_settings.py:114
msgid ""
-"Maximum number of allowed domain administrators for a new domain. (0 to deny"
-" any creation, -1 to allow unlimited creations)"
-msgstr "Maximalt antal tillåtna domänadministratörer för en ny domän. (0 för att neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
+"Maximum number of allowed domain administrators for a new domain. (0 to deny "
+"any creation, -1 to allow unlimited creations)"
+msgstr ""
+"Maximalt antal tillåtna domänadministratörer för en ny domän. (0 för att "
+"neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
#: limits/app_settings.py:126
msgid ""
"Maximum number of allowed domain aliases for a new domain. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "Maximalt antal tillåtna domänalias för en ny domän. (0 för att neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
+msgstr ""
+"Maximalt antal tillåtna domänalias för en ny domän. (0 för att neka någon "
+"skapelse, -1 för att tillåta obegränsade skapelser)"
#: limits/app_settings.py:138
msgid ""
"Maximum number of allowed mailboxes for a new domain. (0 to deny any "
"creation, -1 to allow unlimited creations)"
-msgstr "Maximalt antal tillåtna postlådor för en ny domän. (0 för att neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
+msgstr ""
+"Maximalt antal tillåtna postlådor för en ny domän. (0 för att neka någon "
+"skapelse, -1 för att tillåta obegränsade skapelser)"
#: limits/app_settings.py:149
msgid ""
-"Maximum number of allowed aliases for a new domain. (0 to deny any creation,"
-" -1 to allow unlimited creations)"
-msgstr "Maximalt antal tillåtna alias för en ny domän. (0 för att neka någon skapelse, -1 för att tillåta obegränsade skapelser)"
+"Maximum number of allowed aliases for a new domain. (0 to deny any creation, "
+"-1 to allow unlimited creations)"
+msgstr ""
+"Maximalt antal tillåtna alias för en ny domän. (0 för att neka någon "
+"skapelse, -1 för att tillåta obegränsade skapelser)"
#: limits/apps.py:16
msgid "Limits"
@@ -2223,7 +2446,9 @@ msgstr "Ta bort dokument efter den första nedladdningen"
msgid ""
"Automatically delete a document just after its first download from this "
"interface"
-msgstr "Ta bort ett dokument automatiskt precis efter den första nedladdningen från det här gränssnittet"
+msgstr ""
+"Ta bort ett dokument automatiskt precis efter den första nedladdningen från "
+"det här gränssnittet"
#: pdfcredentials/app_settings.py:68
msgid "Generate documents only at account creation"
@@ -2233,7 +2458,9 @@ msgstr "Generera dokument endast när kontot skapas"
msgid ""
"Generate a new document only when a new account is created. If set to no, a "
"new document will be created each time a password is updated."
-msgstr "Skapa ett nytt dokument först när ett nytt konto har skapats. Om inställt på nej kommer ett nytt dokument att skapas varje gång ett lösenord uppdateras."
+msgstr ""
+"Skapa ett nytt dokument först när ett nytt konto har skapats. Om inställt på "
+"nej kommer ett nytt dokument att skapas varje gång ett lösenord uppdateras."
#: pdfcredentials/app_settings.py:84
msgid "Customization options"
@@ -2271,7 +2498,9 @@ msgstr "Inkludera anslutningsinställningar för e-postklienten"
msgid ""
"Include required SMTP and IMAP connection information to configure a mail "
"client, a tablet or a phone"
-msgstr "Inkludera nödvändig SMTP- och IMAP-anslutningsinformation för att konfigurera en e-postklient, en surfplatta eller en telefon"
+msgstr ""
+"Inkludera nödvändig SMTP- och IMAP-anslutningsinformation för att "
+"konfigurera en e-postklient, en surfplatta eller en telefon"
#: pdfcredentials/app_settings.py:123 pdfcredentials/documents.py:133
msgid "SMTP server address"
@@ -2332,7 +2561,11 @@ msgid ""
"Dear %s, this document contains the credentials you will need\n"
"to connect to Modoboa. Learn the content and destroy\n"
"the document as soon as possible.\n"
-msgstr "\nKära %s, det här dokumentet innehåller de referenser du behöver\nför att ansluta till Modoboa. Lär dig innehållet och förstör\ndokumentet så snart som möjligt.\n"
+msgstr ""
+"\n"
+"Kära %s, det här dokumentet innehåller de referenser du behöver\n"
+"för att ansluta till Modoboa. Lär dig innehållet och förstör\n"
+"dokumentet så snart som möjligt.\n"
#: pdfcredentials/documents.py:95
msgid "Web panel:"
@@ -2351,7 +2584,11 @@ msgid ""
"\n"
"Here you can view your emails anytime online, create filters or manage\n"
"your contacts.\n"
-msgstr "\nHär kan du se dina e-postmeddelanden när som helst online, skapa filter eller hantera\ndina kontakter.\n"
+msgstr ""
+"\n"
+"Här kan du se dina e-postmeddelanden när som helst online, skapa filter "
+"eller hantera\n"
+"dina kontakter.\n"
#: pdfcredentials/documents.py:126
msgid "Please change your password!"
@@ -2369,7 +2606,9 @@ msgstr "Använd dessa inställningar för din dator, surfplatta eller telefon."
msgid ""
"Failed to create PDF_credentials directory. Please check the permissions or "
"the path."
-msgstr "Det gick inte att skapa PDF-uppgiftskatalogen. Kontrollera behörigheterna eller sökvägen."
+msgstr ""
+"Det gick inte att skapa PDF-uppgiftskatalogen. Kontrollera behörigheterna "
+"eller sökvägen."
#: pdfcredentials/handlers.py:64
msgid "Download PDF credentials"
@@ -2377,18 +2616,22 @@ msgstr "Ladda ner PDF-uppgifter"
#: pdfcredentials/lib.py:29
msgid "Can't write to selected directory to store PDF documents"
-msgstr "Det går inte att skriva till den valda katalogen för att lagra PDF-dokument"
+msgstr ""
+"Det går inte att skriva till den valda katalogen för att lagra PDF-dokument"
#: pdfcredentials/lib.py:35
#, python-format
msgid "Failed to create the directory that will contain PDF documents (%s)"
-msgstr "Det gick inte att skapa katalogen som kommer att innehålla PDF-dokument (%s)"
+msgstr ""
+"Det gick inte att skapa katalogen som kommer att innehålla PDF-dokument (%s)"
#: pdfcredentials/lib.py:82
msgid ""
"Failed to create PDF_credentials file. Please check the permissions or the "
"path."
-msgstr "Det gick inte att skapa PDF-uppgiftsfilen. Kontrollera behörigheterna eller sökvägen."
+msgstr ""
+"Det gick inte att skapa PDF-uppgiftsfilen. Kontrollera behörigheterna eller "
+"sökvägen."
#: policyd/core.py:99
msgid "Daily sending limit reached"
@@ -2445,9 +2688,11 @@ msgstr "Sökväg till nyckelkarta"
#: rspamd/app_settings.py:21
msgid ""
-"Absolute path of the file which contains paths to DKIM private keys. Must be"
-" readable by _rspamd group or user."
-msgstr "Absolut sökväg till filen som innehåller sökvägar till DKIM privata nycklar. Måste vara läsbar av _rspamd-gruppen eller användaren."
+"Absolute path of the file which contains paths to DKIM private keys. Must be "
+"readable by _rspamd group or user."
+msgstr ""
+"Absolut sökväg till filen som innehåller sökvägar till DKIM privata nycklar. "
+"Måste vara läsbar av _rspamd-gruppen eller användaren."
#: rspamd/app_settings.py:30
msgid "Selector map path"
@@ -2457,7 +2702,9 @@ msgstr "Sökväg till selector-karta"
msgid ""
"Absolute path of the file which contains names of DKIM selectors. Must be "
"readable by _rspamd group or user."
-msgstr "Absolut sökväg till filen som innehåller namn på DKIM-selectors. Måste vara läsbar av _rspamd-gruppen eller användaren."
+msgstr ""
+"Absolut sökväg till filen som innehåller namn på DKIM-selectors. Måste vara "
+"läsbar av _rspamd-gruppen eller användaren."
#: rspamd/app_settings.py:51
msgid "Rspamd dashboard location"
@@ -2465,10 +2712,13 @@ msgstr "Plats för Rspamd-dashboard"
#: rspamd/app_settings.py:53
msgid ""
-"Location of the rspamd dashboard. Can either be a relative URL (eg. "
-"'/rspamd') or a full URL (eg. 'https://rspamd.domain.tld/').Only use for "
+"Location of the rspamd dashboard. Can either be a relative URL (eg. '/"
+"rspamd') or a full URL (eg. 'https://rspamd.domain.tld/').Only use for "
"guidance on the Super-Admin dashboard."
-msgstr "Plats för Rspamd-dashboarden. Kan vara en relativ URL (t.ex. '/rspamd') eller en fullständig URL (t.ex. 'https://rspamd.domain.tld/'). Används endast för vägledning på Super-Admin-dashboarden."
+msgstr ""
+"Plats för Rspamd-dashboarden. Kan vara en relativ URL (t.ex. '/rspamd') "
+"eller en fullständig URL (t.ex. 'https://rspamd.domain.tld/'). Används "
+"endast för vägledning på Super-Admin-dashboarden."
#: rspamd/apps.py:18
msgid "Rspamd"
@@ -2591,11 +2841,13 @@ msgstr "Avvisa meddelande"
msgid "Stop processing"
msgstr "Sluta bearbeta"
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
-msgstr "Anslutning till MANAGESIEVE-server misslyckades, kontrollera din konfiguration"
+msgstr ""
+"Anslutning till MANAGESIEVE-server misslyckades, kontrollera din "
+"konfiguration"
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr "Inte tillräckligt med utrymme på servern"
@@ -2648,7 +2900,9 @@ msgstr "Glömt ditt lösenord?"
msgid ""
"Your password has been set. You may go ahead and sign "
"in now."
-msgstr "Ditt lösenord har ändrats. Du kan fortsätta med att logga in."
+msgstr ""
+"Ditt lösenord har ändrats. Du kan fortsätta med att logga in."
#: templates/registration/password_reset_confirm.html:8
msgid "Change password"
@@ -2664,7 +2918,9 @@ msgstr "Skicka"
msgid ""
"The password reset link was invalid, possibly because it has already been "
"used. Please request a new password reset."
-msgstr "Lösenordets återställningslänk är ogiltig, förmodligen för att den redan använts. Var vänlig begär en ny återställning av lösenord."
+msgstr ""
+"Lösenordets återställningslänk är ogiltig, förmodligen för att den redan "
+"använts. Var vänlig begär en ny återställning av lösenord."
#: templates/registration/password_reset_confirm_code.html:22
msgid "Enter the code you've just received by SMS"
@@ -2684,7 +2940,11 @@ msgid ""
"exists with the email you entered. You should receive them shortly.
"
"If you don't receive an email, please make sure you've entered your "
"primary address, and check your spam folder.
"
-msgstr "Vi har e-postat dig instruktioner för att ändra ditt lösenord, om ett konto finns med den e-post adress du angav. Du borde få detta brev inom kort.
Om du inte fått något brev, var vänlig kontrollera att du angav rätt e-post adress, och kolla din skräpkatalog.
"
+msgstr ""
+"Vi har e-postat dig instruktioner för att ändra ditt lösenord, om ett "
+"konto finns med den e-post adress du angav. Du borde få detta brev inom kort."
+"
Om du inte fått något brev, var vänlig kontrollera att du angav rätt "
+"e-post adress, och kolla din skräpkatalog.
"
#: templates/registration/password_reset_email.html:4
#: templates/registration/password_reset_email_v2.html:4
@@ -2692,14 +2952,18 @@ msgstr "Vi har e-postat dig instruktioner för att ändra ditt lösenord, om
msgid ""
"To initiate the password reset process for your %(username)s Modoboa "
"account, click the link below:"
-msgstr "För att starta processen för återställning av lösenord för ditt %(username)s Modoboa konto, klicka på länken nedanför:"
+msgstr ""
+"För att starta processen för återställning av lösenord för ditt %(username)s "
+"Modoboa konto, klicka på länken nedanför:"
#: templates/registration/password_reset_email.html:10
#: templates/registration/password_reset_email_v2.html:10
msgid ""
"If clicking the link above doesn't work, please copy and paste the URL in a "
"new browser window instead."
-msgstr "Om det ej går att klicka på länken, klipp och klistra länken i ett nytt webbläsarfönster istället."
+msgstr ""
+"Om det ej går att klicka på länken, klipp och klistra länken i ett nytt "
+"webbläsarfönster istället."
#: templates/registration/password_reset_email.html:14
#: templates/registration/password_reset_email_v2.html:14
@@ -2728,9 +2992,11 @@ msgstr "Engångslösenord"
#: templates/registration/twofactor_code_verify.html:35
msgid ""
-"Enter the code from the two-factor app on your mobile device. If you've lost"
-" your device, you may enter one of your recovery codes."
-msgstr "Ange koden från tvåfaktorsappen på din mobila enhet. Om du har tappat bort din enhet kan du ange en av dina återställningskoder."
+"Enter the code from the two-factor app on your mobile device. If you've lost "
+"your device, you may enter one of your recovery codes."
+msgstr ""
+"Ange koden från tvåfaktorsappen på din mobila enhet. Om du har tappat bort "
+"din enhet kan du ange en av dina återställningskoder."
#: templates/registration/twofactor_code_verify.html:42
msgid "Verify code"
@@ -2897,7 +3163,7 @@ msgstr "Signaturtext"
msgid "User defined email signature"
msgstr "Användardefinierad e-postsignatur"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr "Det gick inte att ta bort bilagan:"
@@ -2905,7 +3171,7 @@ msgstr "Det gick inte att ta bort bilagan:"
msgid "Date"
msgstr "Datum"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Misslyckades med att hämta hierarkinavgränsaren"
diff --git a/modoboa/locale/tr/LC_MESSAGES/django.po b/modoboa/locale/tr/LC_MESSAGES/django.po
index 4c4813a64..57e0da380 100644
--- a/modoboa/locale/tr/LC_MESSAGES/django.po
+++ b/modoboa/locale/tr/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2021-12-24 20:48+0000\n"
"Last-Translator: Mustafa OYMAK\n"
"Language-Team: Turkish (http://www.transifex.com/tonio/modoboa/language/"
@@ -19,85 +19,85 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
#| msgid "Enter a valid email address."
msgid "domain alias with this name already exists"
msgstr "Geçerli bir e-posta adresi girin."
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
#, fuzzy
#| msgid "Permission denied"
msgid "Permission denied."
msgstr "İzin reddedildi"
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Bu alan gerekli"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
#, fuzzy
#| msgid "Hide features widget for resellers and domain administrators"
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr "Bayiler ve alan adı yöneticileri için Özellikler Aracı'nı gizle."
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
#, fuzzy
#| msgid "This field is required"
msgid "This field is required."
msgstr "Bu alan gerekli"
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "Enter a valid email address."
msgid "This alias already exists"
msgstr "Geçerli bir e-posta adresi girin."
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -105,56 +105,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown"
msgid "Unknown status"
@@ -170,11 +170,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr "Kendi hesabınızı silemezsiniz"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -459,12 +459,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -632,7 +632,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "Geçersiz satır"
@@ -845,7 +845,7 @@ msgstr "Alan adı Yöneticisi"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "Bu yöneticinin kullanıcı posta kutularına erişimine izin ver"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Çeşitli"
@@ -952,7 +952,7 @@ msgstr "2FA zaten etkin"
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -966,24 +966,24 @@ msgstr "2FA etkin değil"
msgid "Local"
msgstr "Yerel"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Kullanıcı profili"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "Geçersiz sözdizimi"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr "Geçersiz tur sayısı"
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr "Bu kod geçersiz"
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr "Modoboa şifrenizi kurtarmak için lütfen aşağıdaki kodu kullanın: {}"
@@ -1064,11 +1064,21 @@ msgstr "Rastgele parola uzunluğu"
msgid "Length of randomly generated passwords."
msgstr "Rastgele oluşturulmuş parolaların uzunluğu."
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "Rastgele oluşturulmuş parolaların uzunluğu."
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr "Parola servisi URL sayfasını güncelle"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
@@ -1079,105 +1089,105 @@ msgstr ""
"kimlik doğrulamasından sonra otomatik olarak oluşturulanlar gibi. (LDAP, "
"SMTP)"
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr "Parola kurtarma duyurusu"
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr "Parola sıfırlandığında gösterilecek geçici bir mesaj."
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr "SMS ile parola kurtarmayı etkinleştir."
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
"Telefon numarasını belirtmiş kullanıcılar için SMS ile parola kurtarmayı "
"etkinleştir."
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr "SMS sağlayıcı"
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr "Kurtarma parolası göndermek için bir SMS sağlayıcı seçin. "
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Sunucu adresi"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "LDAP sunucusunun IP adresi ya da DNS adı"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Sunucu portu"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "LDAP sunucusunun kullandığı TCP port numarası"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr "İkincil sunucuyu etkinleştir (geri çekil)"
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
"Birincil sunucu başarısız olursa kullanılacak ikincil bir LDAP sunucusunu "
"etkinleştirin"
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr "İkincil sunucu adresi"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "İkincil LDAP sunucusunun IP adresi ya da DNS adı"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr "İkincil sunucu portu"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr "İkincil LDAP sunucusunun kullandığı TCP port numarası"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Güvenli bir bağlantı kullanın"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "LDAP sunucusuna erişmek için bir SSL/STARTTLS bağlantısı kullanın"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "Eğer LDAP sunucu bir Active Directory sunucusu ise belirtin"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Yönetici grupları"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
@@ -1185,47 +1195,47 @@ msgstr ""
"Bu LDAP Posix gruplarının üyeleri, etki alanı yöneticileri olarak "
"oluşturulacaktır. Grupları ayırmak için ';' karakterini kullanın."
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Grup türü"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "Dizininizle kullanılacak LDAP grubu türü."
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "Grup arama tabanı."
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "Grupları bulmak için kullanılan arama tabanının ayırt edici adı"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Atanan parola"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Kullanıcı parolalarını saklamak için kullanılacak nitelik"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr "LDAP kimilk doğrulama ayarları"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Kimlik doğrulama metodu"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Kullanılacak kimlik doğrulama yöntemini seçin"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "DN bağla"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
@@ -1233,28 +1243,28 @@ msgstr ""
"LDAP sunucusuna bağlanırken kullanılacak isim. Anonim bir bağlantı için boş "
"bırakın"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Parolayı bağla."
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"LDAP sunucusuna bağlanırken kullanılacak parola (Bağlanılacak 'DN' ile)"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "Kullanıcı arama tabanı"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "Kullanıcıları bulmak için kullanılan arama tabanının adı"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Arama filtresi"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
@@ -1262,11 +1272,11 @@ msgstr ""
"İsteğe bağlı bir filtre dizisi (Ör. '(objectClass=person)' gibi). Geçerli "
"olması için parantez içine alınması gereklidir."
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "Kullanıcı DN şablonu."
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
@@ -1275,24 +1285,24 @@ msgstr ""
"Bir kullanıcının DN'i oluşturmak için kullanılan şablon. Bir yer tutucu "
"içermelidir (Ör: %(user)s gibi)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr "LDAP eşitleme ayarları"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr "LDAP'a dışa aktarmayı etkinleştir."
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr "Yerel veritabanı ve LDAP arasında otomatik eşitlemeyi etkinleştir."
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr "Yerel hesap silindiğinde uzak LDAP hesabını sil"
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
@@ -1300,11 +1310,11 @@ msgstr ""
"Yerel hesap silindiğinde uzak LDAP hesabını silin, aksi halde devre dışı "
"bırakılır."
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr "Hesap DN şablonu."
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
@@ -1313,131 +1323,202 @@ msgstr ""
"Bir hesabın DN'ini oluşturmak için kullanılan şablon. Bir yer tutucu "
"içermelidir (Ör: %(user)s gibi)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr "LDAP'tan içe aktarmayı etkinleştir"
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr "LDAP dizininden yerel veritabanına hesap eşitlemeyi etkinleştir"
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr "Atanan kullanıcı adı"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr "Kullanıcı adının bulunabileceği atfedilen LDAP adı."
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr "Dovecot LDAP eşitlemesini etkinleştir"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr "LDAP kimik doğrulama ayarları Dovecot yapılandırmasına uygulanacak"
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr "Dovecot LDAP yapılandırma dosyası"
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr "Dovecot LDAP ayarlarını içeren yapılandırma dosyasının konumu"
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "Gösterge Paneli"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "Custom RSS feed"
+msgid "Custom welcome message"
+msgstr "Özel RSS beslemesi"
+
+#: core/app_settings.py:488
+#, fuzzy
+#| msgid ""
+#| "A temporary message that will be displayed on the reset password page."
+msgid "A welcome message that will be displayed instead the default one"
+msgstr "Parola sıfırlandığında gösterilecek geçici bir mesaj."
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "Özel RSS beslemesi"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr "Bayilere ve alan adı yöneticilerine özel RSS beslemesi görüntüleyin"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr "Bayilere ve alan adı yöneticilerine özel RSS beslemesi görüntüleyin"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr "Bayilere ve alan adı yöneticilerine özel RSS beslemesi görüntüleyin"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "Özellikler Aracı'nı gizle"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr "Bayiler ve alan adı yöneticileri için Özellikler Aracı'nı gizle."
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "İkincil e-posta"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Bildirimler"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Gönderici adresi"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Bildirimlerin gönderileceği e-posta adresi."
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Genel API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "İletişimi etkinleştir"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
"Daha yeni bir sürümün mevcut olup olmadığını otomatik olarak kontrol eder"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Yeni sürümleri kontrol et"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr "Yeni sürümler bulunduğunda bir e-posta gönder"
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr "Yeni sürümler hakkında yöneticilere bir bilgilendirme iletisi gönder"
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr "Alıcı"
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr "Yeni sürüm bildirim iletilerinin alıcısı."
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "İstatistikleri gönder"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
"İstatistikleri Modoboa genel API'sine gönderin (sayaçlar ve kullanılan "
"uzantılar)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "Etkin olmayan hesap eşiği"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "Etkin olmayan hesap eşiği"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
@@ -1445,40 +1526,40 @@ msgstr ""
"Son giriş tarihi bu eşikten (gün olarak) daha yüksek olan bir hesap etkin "
"değil olarak kabul edilecektir."
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "En önemli bildirimler kontrol aralığı"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "İki üst bildirim kontrolü arasındaki aralık (saniye cinsinden)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Maksimum günlük kaydı yaşı"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr "Günlük kaydının gün cinsinden maksimum yaşı"
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Sayfa başına öğe"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr "Sayfa başına görüntülenen öğe sayısı"
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr "Varsayılan üst yönlendirme"
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
"Hiçbir uygulama belirtilmediğinde kullanılan varsayılan yeniden yönlendirme"
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
@@ -1488,20 +1569,44 @@ msgstr ""
"sırasında sorunlara neden olabilir (yani saat değişikliği nedeniyle aynı "
"yerel saat iki kez oluşur)."
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr "settings.py dosyasında 'USE_TZ = True' yapın"
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Update password scheme at login"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Parola şemasını girişte güncelle"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "Basit kullanıcı"
@@ -1593,62 +1698,62 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "[modoboa] Güncellemesi(leri) mevcut"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr " Posta kutularına erişime izin ver"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "Bu yöneticinin kullanıcı posta kutularına erişimine izin ver"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "parola"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "dil"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "Sayfaları görüntülemek için tercih edilen dil."
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "Telefon numarası"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "İkincil e-posta"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
"Kurtarma ihtiyaçları için alternatif bir e-posta adresi kullanılabilir."
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "Parola güncellenemedi: LDAP modülü kurulu değil"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "Hesap"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "Bilinmeyen"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr "Sizinkinden daha büyük bir role sahip bir hesabı içe aktaramazsınız"
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "The simple user '%s' must have a valid email address"
msgid "The simple user '{}' must have a valid email address"
msgstr "'%s' basit kullanıcısının geçerli bir e-posta adresi olmalıdır"
-#: core/models.py:384
+#: core/models.py:383
#, fuzzy
#| msgid "username and email fields must not differ for '%s'"
msgid "username and email fields must not differ for '{}'"
@@ -2005,7 +2110,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -2045,24 +2150,24 @@ msgstr "{} Parola güncelleme başarısız"
msgid "Failed to disable LDAP account: {}"
msgstr "{} Parola güncelleme başarısız"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "Modoboa genel API'si ile iletişimi etkinleştir"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr "dize kodlaması belirlenemiyor"
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "%sizin reddedildi"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "İzin reddedildi"
@@ -2807,11 +2912,11 @@ msgstr "İleti"
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -3157,7 +3262,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to update password: {}"
msgid "Failed to remove attachment: "
@@ -3167,7 +3272,7 @@ msgstr "{} Parola güncelleme başarısız"
msgid "Date"
msgstr "Tarih"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/tr_TR/LC_MESSAGES/django.po b/modoboa/locale/tr_TR/LC_MESSAGES/django.po
index cccacb44d..104ec7924 100644
--- a/modoboa/locale/tr_TR/LC_MESSAGES/django.po
+++ b/modoboa/locale/tr_TR/LC_MESSAGES/django.po
@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2018-11-22 19:31+0000\n"
"Last-Translator: Ediz Duman \n"
"Language-Team: Turkish (Turkey) (http://www.transifex.com/tonio/modoboa/"
@@ -23,75 +23,75 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "Bu alan gereklidir"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -99,56 +99,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -160,11 +160,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -429,12 +429,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -583,7 +583,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -789,7 +789,7 @@ msgstr "Yönetim"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "Çeşitli"
@@ -896,7 +896,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -910,24 +910,24 @@ msgstr ""
msgid "Local"
msgstr "Yerel"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "Kullanıcı profili"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -1008,428 +1008,522 @@ msgstr "Rastgele şifre uzunluğu"
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
#, fuzzy
#| msgid "Update password scheme"
msgid "Update password service URL"
msgstr "Şifre şemasını güncelle"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "Sunucu adresi"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "LDAP sunucusunun adresi (DNS) ya da ip adresi"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "Sunucu portu"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "LDAP sunucu tarafından kullanılan TCP portu"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
#, fuzzy
#| msgid "Server address"
msgid "Secondary server address"
msgstr "Sunucu adresi"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
#, fuzzy
#| msgid "The IP address or the DNS name of the LDAP server"
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "LDAP sunucusunun adresi (DNS) ya da ip adresi"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
#, fuzzy
#| msgid "Server port"
msgid "Secondary server port"
msgstr "Sunucu portu"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
#, fuzzy
#| msgid "The TCP port number used by the LDAP server"
msgid "The TCP port number used by the LDAP secondary server"
msgstr "LDAP sunucu tarafından kullanılan TCP portu"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "Güvenli bir bağlantı kullan"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "LDAP sunucu bir Active Directory ise"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "Yönetici grupları"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "Grup türü"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "Parola özelliği"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "Kullanıcı parolalarını saklamak için kullanılacak özellik"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
#, fuzzy
#| msgid "Authentication method"
msgid "LDAP authentication settings"
msgstr "Yetkilendirme metodu"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "Yetkilendirme metodu"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "Kullanılacak yetkilendirme metodunu seçin"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "Arama filtresi"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
#, fuzzy
#| msgid "LDAP settings"
msgid "LDAP synchronization settings"
msgstr "LDAP ayarları"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
#, fuzzy
#| msgid "Password attribute"
msgid "Username attribute"
msgstr "Parola özelliği"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "gösterge Paneli"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
+msgstr ""
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr ""
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Server port"
+msgid "Secondary theme color"
+msgstr "Sunucu portu"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "Bildirimler"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "Gönderici adresi"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "Bildirimlerin gönderileceği email adresi"
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "Genel API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "Yeni versiyonları kontrol et"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "İstatistikleri gönder"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "Maksimum günlük kayıt yaşı"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "Sayfa başına öğe"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Update password scheme"
msgid "Upgrade your password scheme to a stronger one"
msgstr "Şifre şemasını güncelle"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1525,59 +1619,59 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "Bir veya daha fazla güncelleme mevcut"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "parola"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr ""
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1914,7 +2008,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1946,23 +2040,23 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permissions"
msgid "Permission denied: {}"
msgstr "İzinler"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2680,11 +2774,11 @@ msgstr "Konu"
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -3006,7 +3100,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr ""
@@ -3014,7 +3108,7 @@ msgstr ""
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/uk/LC_MESSAGES/django.po b/modoboa/locale/uk/LC_MESSAGES/django.po
index 7ab70a519..c60702dc4 100644
--- a/modoboa/locale/uk/LC_MESSAGES/django.po
+++ b/modoboa/locale/uk/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2020-05-11 18:45+0000\n"
"Last-Translator: Taras Havryliuk , 2021\n"
"Language-Team: Ukrainian (https://www.transifex.com/tonio/teams/13749/uk/)\n"
@@ -24,75 +24,75 @@ msgstr ""
"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || "
"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -100,56 +100,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -161,11 +161,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -430,12 +430,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -584,7 +584,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -780,7 +780,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -881,7 +881,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -893,24 +893,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -985,410 +985,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1480,61 +1572,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
#, fuzzy
#| msgid "Failed to update LDAP account: {}"
msgid "Failed to update password: LDAP module not installed"
msgstr "Не вдалося оновити обліковий запис LDAP: {} "
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1871,7 +1963,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1903,21 +1995,21 @@ msgstr "Не вдалося видалити обліковий запис LDAP:
msgid "Failed to disable LDAP account: {}"
msgstr "Не вдалося відключити обліковий запис LDAP: {} "
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2607,11 +2699,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2913,7 +3005,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to create LDAP account: {}"
msgid "Failed to remove attachment: "
@@ -2923,7 +3015,7 @@ msgstr "Не вдалося створити обліковий запис LDAP:
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/zh/LC_MESSAGES/django.po b/modoboa/locale/zh/LC_MESSAGES/django.po
index a29ead9f7..94c2aac9d 100644
--- a/modoboa/locale/zh/LC_MESSAGES/django.po
+++ b/modoboa/locale/zh/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,75 +18,75 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -94,56 +94,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -155,11 +155,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -424,12 +424,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -578,7 +578,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -774,7 +774,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -875,7 +875,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -887,24 +887,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -979,410 +979,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1474,59 +1566,59 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr ""
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1853,7 +1945,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1885,21 +1977,21 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2587,11 +2679,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2893,7 +2985,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
msgid "Failed to remove attachment: "
msgstr ""
@@ -2901,7 +2993,7 @@ msgstr ""
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/zh_CN/LC_MESSAGES/django.po b/modoboa/locale/zh_CN/LC_MESSAGES/django.po
index 1552019a5..c1cc440b1 100644
--- a/modoboa/locale/zh_CN/LC_MESSAGES/django.po
+++ b/modoboa/locale/zh_CN/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2020-05-11 18:45+0000\n"
"Last-Translator: 李 正 <364109980@qq.com>, 2021\n"
"Language-Team: Chinese (China) (https://www.transifex.com/tonio/teams/13749/"
@@ -22,75 +22,75 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr ""
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
msgid "domain alias with this name already exists"
msgstr ""
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr ""
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr ""
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr ""
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr ""
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr ""
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr ""
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr ""
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr ""
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
msgid "This alias already exists"
msgstr ""
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr ""
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr ""
@@ -98,56 +98,56 @@ msgstr ""
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr ""
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr ""
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr ""
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr ""
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr ""
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
msgid "A mailbox is required to create aliases."
msgstr ""
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
msgid "Unknown status"
msgstr ""
@@ -159,11 +159,11 @@ msgstr ""
msgid "You can't delete your own domain"
msgstr ""
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -428,12 +428,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr ""
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr ""
@@ -582,7 +582,7 @@ msgid "Key length"
msgstr ""
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr ""
@@ -778,7 +778,7 @@ msgstr ""
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr ""
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr ""
@@ -879,7 +879,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
msgid "Invalid password"
msgstr ""
@@ -891,24 +891,24 @@ msgstr ""
msgid "Local"
msgstr ""
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr ""
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr ""
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -983,410 +983,502 @@ msgstr ""
msgid "Length of randomly generated passwords."
msgstr ""
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+msgid "Enable special characters in randomly generated passwords."
+msgstr ""
+
+#: core/app_settings.py:114
msgid "Update password service URL"
msgstr ""
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr ""
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr ""
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr ""
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr ""
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
msgid "Secondary server address"
msgstr ""
-#: core/app_settings.py:190
+#: core/app_settings.py:202
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr ""
-#: core/app_settings.py:197
+#: core/app_settings.py:209
msgid "Secondary server port"
msgstr ""
-#: core/app_settings.py:200
+#: core/app_settings.py:212
msgid "The TCP port number used by the LDAP secondary server"
msgstr ""
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr ""
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr ""
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr ""
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr ""
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr ""
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr ""
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr ""
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr ""
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr ""
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr ""
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr ""
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr ""
-#: core/app_settings.py:264
+#: core/app_settings.py:276
msgid "LDAP authentication settings"
msgstr ""
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr ""
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr ""
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr ""
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr ""
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr ""
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr ""
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr ""
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr ""
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:338
+#: core/app_settings.py:350
msgid "LDAP synchronization settings"
msgstr ""
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
msgid "Account DN template"
msgstr ""
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, python-format
msgid ""
"The template used to construct an account's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
msgid "Username attribute"
msgstr ""
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
msgid "Enable Dovecot LDAP sync"
msgstr ""
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr ""
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+msgid "Custom welcome message"
+msgstr ""
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr ""
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr ""
-#: core/app_settings.py:484
-msgid "Hide features widget"
-msgstr ""
-
-#: core/app_settings.py:486
-msgid "Hide features widget for resellers and domain administrators"
-msgstr ""
-
-#: core/app_settings.py:498
-msgid "Notifications"
-msgstr ""
-
-#: core/app_settings.py:504
-msgid "Sender address"
-msgstr ""
-
#: core/app_settings.py:506
-msgid "Email address used to send notifications."
+msgid "Display custom RSS feed to super admins"
+msgstr ""
+
+#: core/app_settings.py:509
+msgid "Display custom RSS feed also to super administrators"
msgstr ""
#: core/app_settings.py:517
+msgid "Hide features widget"
+msgstr ""
+
+#: core/app_settings.py:519
+msgid "Hide features widget for resellers and domain administrators"
+msgstr ""
+
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+msgid "Secondary theme color"
+msgstr ""
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
+msgid "Notifications"
+msgstr ""
+
+#: core/app_settings.py:601
+msgid "Sender address"
+msgstr ""
+
+#: core/app_settings.py:603
+msgid "Email address used to send notifications."
+msgstr ""
+
+#: core/app_settings.py:614
msgid "Public API"
msgstr ""
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr ""
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr ""
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr ""
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr ""
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr ""
-#: core/app_settings.py:586
+#: core/app_settings.py:683
msgid "Enable inactive account tracking"
msgstr ""
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr ""
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr ""
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr ""
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr ""
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr ""
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr ""
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
msgid "Upgrade your password scheme to a stronger one"
msgstr ""
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr ""
@@ -1478,61 +1570,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr ""
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr ""
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr ""
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr ""
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr ""
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr ""
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr ""
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr ""
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr ""
-#: core/models.py:151
+#: core/models.py:150
#, fuzzy
#| msgid "Failed to update LDAP account: {}"
msgid "Failed to update password: LDAP module not installed"
msgstr "无法更新LDAP帐户: {}"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr ""
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr ""
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
msgid "The simple user '{}' must have a valid email address"
msgstr ""
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -1854,7 +1946,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -1886,21 +1978,21 @@ msgstr "无法删除LDAP帐户: {}"
msgid "Failed to disable LDAP account: {}"
msgstr "无法关闭LDAP帐户: {}"
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, python-format
msgid "Failed to communicate with public API: %s"
msgstr ""
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
msgid "Permission denied: {}"
msgstr ""
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr ""
@@ -2590,11 +2682,11 @@ msgstr ""
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
msgid "Not enough space on server"
msgstr ""
@@ -2896,7 +2988,7 @@ msgstr ""
msgid "User defined email signature"
msgstr ""
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
#| msgid "Failed to create LDAP account: {}"
msgid "Failed to remove attachment: "
@@ -2906,7 +2998,7 @@ msgstr "无法创建LDAP帐户: {}"
msgid "Date"
msgstr ""
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr ""
diff --git a/modoboa/locale/zh_TW/LC_MESSAGES/django.po b/modoboa/locale/zh_TW/LC_MESSAGES/django.po
index f9de56d3a..46d2c0ba2 100644
--- a/modoboa/locale/zh_TW/LC_MESSAGES/django.po
+++ b/modoboa/locale/zh_TW/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-06-20 16:45+0200\n"
+"POT-Creation-Date: 2025-07-27 10:50+0200\n"
"PO-Revision-Date: 2018-07-06 08:26+0000\n"
"Last-Translator: akong \n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/tonio/modoboa/"
@@ -21,7 +21,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: admin/api/v1/serializers.py:41
+#: admin/api/v1/serializers.py:39
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -30,72 +30,72 @@ msgid ""
"A value of 0 means no quota."
msgstr "預設套用在信箱幾 MB 的配額。值為0表示沒配額。"
-#: admin/api/v1/serializers.py:48
+#: admin/api/v1/serializers.py:46
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
msgstr "預設套用在信箱幾 MB 的配額。值為0表示沒配額。"
-#: admin/api/v1/serializers.py:90
+#: admin/api/v1/serializers.py:88
#, fuzzy
msgid "domain alias with this name already exists"
msgstr "這個名稱的別名已存在"
-#: admin/api/v1/serializers.py:100
+#: admin/api/v1/serializers.py:98
msgid "No authorized MX record found for this domain"
msgstr "沒有找到這個網域已驗證過的 MX 紀錄"
-#: admin/api/v1/serializers.py:118
+#: admin/api/v1/serializers.py:116
msgid "Cannot be greater than domain quota"
msgstr "不可以超過網域配額"
-#: admin/api/v1/serializers.py:164 admin/api/v1/serializers.py:359
-#: admin/api/v2/serializers.py:531 admin/models/alias.py:44
+#: admin/api/v1/serializers.py:162 admin/api/v1/serializers.py:357
+#: admin/api/v2/serializers.py:548 admin/models/alias.py:44
msgid "Permission denied."
msgstr "權限不足"
-#: admin/api/v1/serializers.py:226 admin/api/v2/serializers.py:89
-#: admin/api/v2/serializers.py:453 core/api/v2/serializers.py:225
-#: core/api/v2/serializers.py:227 core/api/v2/serializers.py:236
+#: admin/api/v1/serializers.py:224 admin/api/v2/serializers.py:88
+#: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
+#: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
#: transport/backends.py:40
msgid "This field is required"
msgstr "這個欄位是必填的"
-#: admin/api/v1/serializers.py:238
+#: admin/api/v1/serializers.py:236
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr "管理員網域列表 (只有經銷商和網域管理員)。"
-#: admin/api/v1/serializers.py:332 admin/api/v2/serializers.py:513
+#: admin/api/v1/serializers.py:330 admin/api/v2/serializers.py:530
msgid "Not allowed for this role."
msgstr "不允許這個身份"
-#: admin/api/v1/serializers.py:350
+#: admin/api/v1/serializers.py:348
msgid "Must be equal to mailbox full_address"
msgstr "必須跟信箱完整位址一樣"
-#: admin/api/v1/serializers.py:392 admin/api/v2/serializers.py:565
+#: admin/api/v1/serializers.py:390 admin/api/v2/serializers.py:582
#: calendars/serializers.py:175 calendars/serializers.py:177
msgid "This field is required."
msgstr "這個欄位是必填的"
-#: admin/api/v1/serializers.py:404 admin/api/v2/serializers.py:582
+#: admin/api/v1/serializers.py:402 admin/api/v2/serializers.py:599
msgid "Local domain {} does not exist"
msgstr "本機網域 {} 不存在"
-#: admin/api/v1/serializers.py:494
+#: admin/api/v1/serializers.py:492
msgid "A list of recipient"
msgstr "收件人列表"
-#: admin/api/v1/serializers.py:510 admin/api/v2/viewsets.py:271
+#: admin/api/v1/serializers.py:508 admin/api/v2/viewsets.py:286
#, fuzzy
#| msgid "User '%s' already exists"
msgid "This alias already exists"
msgstr "使用者 '%s' 已存在"
-#: admin/api/v1/serializers.py:546
+#: admin/api/v1/serializers.py:544
msgid "You don't have access to this domain."
msgstr "您不能存取這個網域。"
-#: admin/api/v1/serializers.py:555
+#: admin/api/v1/serializers.py:553
msgid "You don't have access to this mailbox."
msgstr "您不能存取這個信箱。"
@@ -103,58 +103,58 @@ msgstr "您不能存取這個信箱。"
msgid "Here is your new Modoboa password: {}"
msgstr ""
-#: admin/api/v2/serializers.py:81
+#: admin/api/v2/serializers.py:80
msgid "DKIM keys storage directory not configured"
msgstr "未設置 DKIM 金鑰儲存目錄"
-#: admin/api/v2/serializers.py:93
+#: admin/api/v2/serializers.py:92
msgid "This field is valid when type is relaydomain"
msgstr ""
-#: admin/api/v2/serializers.py:100
+#: admin/api/v2/serializers.py:99
msgid "You can't define an unlimited quota."
msgstr "您不可以定義無限制配額。"
-#: admin/api/v2/serializers.py:134
+#: admin/api/v2/serializers.py:133
#, python-format
msgid "User '%s' already exists"
msgstr "使用者 '%s' 已存在"
-#: admin/api/v2/serializers.py:249 admin/api/v2/serializers.py:255
+#: admin/api/v2/serializers.py:248 admin/api/v2/serializers.py:254
msgid "Must be a positive integer"
msgstr "必須是正整數"
-#: admin/api/v2/serializers.py:264
+#: admin/api/v2/serializers.py:263
msgid "openssl not found, please make sure it is installed."
msgstr "openssl 找不到,請確認已安裝。"
-#: admin/api/v2/serializers.py:267 pdfcredentials/api/v2/serializers.py:79
+#: admin/api/v2/serializers.py:266 pdfcredentials/api/v2/serializers.py:79
msgid "Directory not found."
msgstr "目錄不存在"
-#: admin/api/v2/serializers.py:278
+#: admin/api/v2/serializers.py:277
msgid "This field only allows valid IP addresses (or networks)"
msgstr ""
-#: admin/api/v2/serializers.py:291
+#: admin/api/v2/serializers.py:290
msgid "Please disable imap migration before disabling this option."
msgstr ""
-#: admin/api/v2/serializers.py:304
+#: admin/api/v2/serializers.py:303
msgid "Define at least one authorized network / address"
msgstr "定義至少一個已驗證網路/位址"
-#: admin/api/v2/serializers.py:548
+#: admin/api/v2/serializers.py:565
msgid "The left part of an email address can't be more than 64 characters."
msgstr ""
-#: admin/api/v2/serializers.py:570
+#: admin/api/v2/serializers.py:587
#, fuzzy
#| msgid "A mailbox is required"
msgid "A mailbox is required to create aliases."
msgstr "信箱是必要的"
-#: admin/api/v2/serializers.py:734
+#: admin/api/v2/serializers.py:751
#, fuzzy
#| msgid "Unknown"
msgid "Unknown status"
@@ -168,11 +168,11 @@ msgstr "您無權訪問此網域"
msgid "You can't delete your own domain"
msgstr "您不可以刪除您擁有的網域"
-#: admin/api/v2/viewsets.py:392
+#: admin/api/v2/viewsets.py:407
msgid "No alarm ID provided"
msgstr ""
-#: admin/api/v2/viewsets.py:396
+#: admin/api/v2/viewsets.py:411
msgid "Received invalid alarm id(s)"
msgstr ""
@@ -472,12 +472,12 @@ msgstr ""
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "無效的 IP 位址格式 %(domain)s; %(addr)s"
-#: admin/lib.py:340
+#: admin/lib.py:360
#, python-format
msgid "Object already exists: %s"
msgstr "元件已存在: %s"
-#: admin/lib.py:344
+#: admin/lib.py:364
#, python-format
msgid "%d objects imported successfully"
msgstr "%d 元件已匯入成功"
@@ -634,7 +634,7 @@ msgid "Key length"
msgstr "金鑰長度"
#: admin/models/domain.py:321 admin/models/domain_alias.py:70
-#: core/models.py:353 relaydomains/lib.py:13
+#: core/models.py:352 relaydomains/lib.py:13
msgid "Invalid line"
msgstr "無效的線"
@@ -864,7 +864,7 @@ msgstr "網域管理員"
msgid "Allow domain administrators to manage user calendars (read and write)"
msgstr "允許這個管理者來存取使用者信箱"
-#: calendars/app_settings.py:60 core/app_settings.py:579
+#: calendars/app_settings.py:60 core/app_settings.py:676
#: rspamd/app_settings.py:45
msgid "Miscellaneous"
msgstr "雜項"
@@ -973,7 +973,7 @@ msgstr ""
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
msgstr ""
-#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:415
+#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:425
#, fuzzy
#| msgid "Old password"
msgid "Invalid password"
@@ -987,24 +987,24 @@ msgstr ""
msgid "Local"
msgstr "本機"
-#: core/api/v2/serializers.py:165 core/app_settings.py:17
+#: core/api/v2/serializers.py:175 core/app_settings.py:17
msgid "User profile"
msgstr "使用者檔案"
-#: core/api/v2/serializers.py:184 core/api/v2/serializers.py:191
-#: core/api/v2/serializers.py:198
+#: core/api/v2/serializers.py:194 core/api/v2/serializers.py:201
+#: core/api/v2/serializers.py:208
msgid "Invalid syntax"
msgstr "無效語法"
-#: core/api/v2/serializers.py:203
+#: core/api/v2/serializers.py:213
msgid "Invalid rounds number"
msgstr ""
-#: core/api/v2/serializers.py:403 core/forms.py:81
+#: core/api/v2/serializers.py:413 core/forms.py:81
msgid "This code is invalid"
msgstr ""
-#: core/api/v2/serializers.py:473 core/views/auth.py:194 core/views/auth.py:247
+#: core/api/v2/serializers.py:483 core/views/auth.py:194 core/views/auth.py:247
msgid "Please use the following code to recover your Modoboa password: {}"
msgstr ""
@@ -1089,245 +1089,255 @@ msgstr "隨機密碼長度"
msgid "Length of randomly generated passwords."
msgstr "隨機產生密碼的長度。"
-#: core/app_settings.py:102
+#: core/app_settings.py:103
+msgid "Allow special characters for random password"
+msgstr ""
+
+#: core/app_settings.py:106
+#, fuzzy
+#| msgid "Length of randomly generated passwords."
+msgid "Enable special characters in randomly generated passwords."
+msgstr "隨機產生密碼的長度。"
+
+#: core/app_settings.py:114
#, fuzzy
#| msgid "Default password scheme"
msgid "Update password service URL"
msgstr "預設密碼方案"
-#: core/app_settings.py:104
+#: core/app_settings.py:116
msgid ""
"The URL of an external page where users will be able to update their "
"password. It applies only to non local users, ie. those automatically "
"created after a successful external authentication (LDAP, SMTP)."
msgstr ""
-#: core/app_settings.py:114
+#: core/app_settings.py:126
msgid "Password recovery announcement"
msgstr ""
-#: core/app_settings.py:116
+#: core/app_settings.py:128
msgid "A temporary message that will be displayed on the reset password page."
msgstr ""
-#: core/app_settings.py:125
+#: core/app_settings.py:137
msgid "Enable password recovery by SMS"
msgstr ""
-#: core/app_settings.py:128
+#: core/app_settings.py:140
msgid "Enable password recovery by SMS for users who filled a phone number."
msgstr ""
-#: core/app_settings.py:136
+#: core/app_settings.py:148
msgid "SMS provider"
msgstr ""
-#: core/app_settings.py:139
+#: core/app_settings.py:151
msgid "Choose a provider to send password recovery SMS"
msgstr ""
-#: core/app_settings.py:151
+#: core/app_settings.py:163
msgid "LDAP"
msgstr ""
-#: core/app_settings.py:157 sievefilters/app_settings.py:18
+#: core/app_settings.py:169 sievefilters/app_settings.py:18
#: sievefilters/app_settings.py:51 webmail/app_settings.py:36
#: webmail/app_settings.py:73
msgid "Server address"
msgstr "伺服器位址"
-#: core/app_settings.py:159
+#: core/app_settings.py:171
msgid "The IP address or the DNS name of the LDAP server"
msgstr "LDAP 伺服器的 IP 或 DNS 名稱"
-#: core/app_settings.py:166 sievefilters/app_settings.py:25
+#: core/app_settings.py:178 sievefilters/app_settings.py:25
#: sievefilters/app_settings.py:67 webmail/app_settings.py:54
#: webmail/app_settings.py:91
msgid "Server port"
msgstr "伺服器連接埠"
-#: core/app_settings.py:168
+#: core/app_settings.py:180
msgid "The TCP port number used by the LDAP server"
msgstr "LDAP 伺服器所使用的 TCP 連接埠"
-#: core/app_settings.py:176
+#: core/app_settings.py:188
msgid "Enable secondary server (fallback)"
msgstr ""
-#: core/app_settings.py:179
+#: core/app_settings.py:191
msgid ""
"Enable a secondary LDAP server which will be used if the primary one fails"
msgstr ""
-#: core/app_settings.py:187
+#: core/app_settings.py:199
#, fuzzy
#| msgid "Server address"
msgid "Secondary server address"
msgstr "伺服器地址"
-#: core/app_settings.py:190
+#: core/app_settings.py:202
#, fuzzy
#| msgid "The IP address or the DNS name of the LDAP server"
msgid "The IP address or the DNS name of the seondary LDAP server"
msgstr "LDAP 伺服器的 IP 或 DNS 名稱"
-#: core/app_settings.py:197
+#: core/app_settings.py:209
#, fuzzy
#| msgid "Server port"
msgid "Secondary server port"
msgstr "伺服器連接埠"
-#: core/app_settings.py:200
+#: core/app_settings.py:212
#, fuzzy
#| msgid "The TCP port number used by the LDAP server"
msgid "The TCP port number used by the LDAP secondary server"
msgstr "LDAP 伺服器所使用的 TCP 連接埠"
-#: core/app_settings.py:207 sievefilters/app_settings.py:58
+#: core/app_settings.py:219 sievefilters/app_settings.py:58
#: webmail/app_settings.py:45
msgid "Use a secured connection"
msgstr "使用安全的連線"
-#: core/app_settings.py:209
+#: core/app_settings.py:221
msgid "Use an SSL/STARTTLS connection to access the LDAP server"
msgstr "使用 SSL/STARTTLS 連線到 LDAP 伺服器"
-#: core/app_settings.py:216
+#: core/app_settings.py:228
msgid "Active Directory"
msgstr "Active Directory"
-#: core/app_settings.py:218
+#: core/app_settings.py:230
msgid "Tell if the LDAP server is an Active Directory one"
msgstr "判斷 LDAP 伺服器是否是 Active Directory 伺服器"
-#: core/app_settings.py:225
+#: core/app_settings.py:237
msgid "Administrator groups"
msgstr "管理者群組"
-#: core/app_settings.py:227
+#: core/app_settings.py:239
msgid ""
"Members of those LDAP Posix groups will be created as domain administrators. "
"Use ';' characters to separate groups."
msgstr "這些 LDAP 群組的成員將會建立為網域管理者。使用 ';' 字元來分開群組"
-#: core/app_settings.py:236
+#: core/app_settings.py:248
msgid "Group type"
msgstr "群組類型"
-#: core/app_settings.py:238
+#: core/app_settings.py:250
msgid "The LDAP group type to use with your directory."
msgstr "此 LDAP 群組類型會使用您的目錄"
-#: core/app_settings.py:245
+#: core/app_settings.py:257
msgid "Groups search base"
msgstr "群組搜尋基準"
-#: core/app_settings.py:247
+#: core/app_settings.py:259
msgid "The distinguished name of the search base used to find groups"
msgstr "搜尋基準使用醒目的名稱來找到群組"
-#: core/app_settings.py:255
+#: core/app_settings.py:267
msgid "Password attribute"
msgstr "密碼屬性"
-#: core/app_settings.py:257
+#: core/app_settings.py:269
msgid "The attribute used to store user passwords"
msgstr "此屬性使用在儲存使用者密碼"
-#: core/app_settings.py:264
+#: core/app_settings.py:276
#, fuzzy
#| msgid "Authentication method"
msgid "LDAP authentication settings"
msgstr "身份驗證方法"
-#: core/app_settings.py:272
+#: core/app_settings.py:284
msgid "Authentication method"
msgstr "身份驗證方法"
-#: core/app_settings.py:275
+#: core/app_settings.py:287
msgid "Choose the authentication method to use"
msgstr "選擇驗證模組來使用"
-#: core/app_settings.py:282 core/app_settings.py:345
+#: core/app_settings.py:294 core/app_settings.py:357
msgid "Bind DN"
msgstr "Bind DN"
-#: core/app_settings.py:284 core/app_settings.py:347
+#: core/app_settings.py:296 core/app_settings.py:359
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr "當對應到 LDAP 伺服器請使用醒目的名稱。保留空白為匿名 bind"
-#: core/app_settings.py:293 core/app_settings.py:355
+#: core/app_settings.py:305 core/app_settings.py:367
msgid "Bind password"
msgstr "Bind 密碼"
-#: core/app_settings.py:295 core/app_settings.py:357
+#: core/app_settings.py:307 core/app_settings.py:369
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr "此密碼使用於當綁定到 LDAP 伺服器 (有 'Bind DN')"
-#: core/app_settings.py:305 core/app_settings.py:410
+#: core/app_settings.py:317 core/app_settings.py:422
msgid "Users search base"
msgstr "使用者搜尋基準"
-#: core/app_settings.py:307 core/app_settings.py:412
+#: core/app_settings.py:319 core/app_settings.py:424
msgid "The distinguished name of the search base used to find users"
msgstr "搜尋基準使用醒目的名稱來找到使用者"
-#: core/app_settings.py:316 core/app_settings.py:421
+#: core/app_settings.py:328 core/app_settings.py:433
msgid "Search filter"
msgstr "搜尋過濾器"
-#: core/app_settings.py:318 core/app_settings.py:423
+#: core/app_settings.py:330 core/app_settings.py:435
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
"過濾字串的選 (例如 '(objectClass=person)'). 要能正常使用,這必須括在括號內。"
-#: core/app_settings.py:327
+#: core/app_settings.py:339
msgid "User DN template"
msgstr "使用者 DN 範本"
-#: core/app_settings.py:329
+#: core/app_settings.py:341
#, python-format
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr "此範本已使用結構化使用者的 DN. 他應該包含一個佔位符 (例如 %(user)s)"
-#: core/app_settings.py:338
+#: core/app_settings.py:350
#, fuzzy
#| msgid "LDAP settings"
msgid "LDAP synchronization settings"
msgstr "LDAP 設定"
-#: core/app_settings.py:366
+#: core/app_settings.py:378
msgid "Enable export to LDAP"
msgstr ""
-#: core/app_settings.py:368
+#: core/app_settings.py:380
msgid ""
"Enable automatic synchronization between local database and LDAP directory"
msgstr ""
-#: core/app_settings.py:377
+#: core/app_settings.py:389
msgid "Delete remote LDAP account when local account is deleted"
msgstr ""
-#: core/app_settings.py:380
+#: core/app_settings.py:392
msgid ""
"Delete remote LDAP account when local account is deleted, otherwise it will "
"be disabled."
msgstr ""
-#: core/app_settings.py:389
+#: core/app_settings.py:401
#, fuzzy
#| msgid "User DN template"
msgid "Account DN template"
msgstr "使用者 DN 範本"
-#: core/app_settings.py:391
+#: core/app_settings.py:403
#, fuzzy, python-format
#| msgid ""
#| "The template used to construct a user's DN. It should contain one "
@@ -1337,190 +1347,282 @@ msgid ""
"placeholder (ie. %(user)s)"
msgstr "此範本已使用結構化使用者的 DN. 他應該包含一個佔位符 (例如 %(user)s)"
-#: core/app_settings.py:400
+#: core/app_settings.py:412
msgid "Enable import from LDAP"
msgstr ""
-#: core/app_settings.py:402
+#: core/app_settings.py:414
msgid "Enable account synchronization from LDAP directory to local database"
msgstr ""
-#: core/app_settings.py:432
+#: core/app_settings.py:444
#, fuzzy
#| msgid "Password attribute"
msgid "Username attribute"
msgstr "密碼屬性"
-#: core/app_settings.py:434
+#: core/app_settings.py:446
msgid "The name of the LDAP attribute where the username can be found."
msgstr ""
-#: core/app_settings.py:443
+#: core/app_settings.py:455
#, fuzzy
#| msgid "Enable communication"
msgid "Enable Dovecot LDAP sync"
msgstr "啟用通訊"
-#: core/app_settings.py:445
+#: core/app_settings.py:457
msgid "LDAP authentication settings will be applied to Dovecot configuration."
msgstr ""
-#: core/app_settings.py:453
+#: core/app_settings.py:465
msgid "Dovecot LDAP config file"
msgstr ""
-#: core/app_settings.py:455
+#: core/app_settings.py:467
msgid ""
"Location of the configuration file which contains Dovecot LDAP settings."
msgstr ""
-#: core/app_settings.py:468
+#: core/app_settings.py:480
msgid "Dashboard"
msgstr "儀表板"
-#: core/app_settings.py:474
+#: core/app_settings.py:486
+#, fuzzy
+#| msgid "spam messages"
+msgid "Custom welcome message"
+msgstr "垃圾郵件"
+
+#: core/app_settings.py:488
+msgid "A welcome message that will be displayed instead the default one"
+msgstr ""
+
+#: core/app_settings.py:495
msgid "Custom RSS feed"
msgstr "自訂 RSS 來源"
-#: core/app_settings.py:476
+#: core/app_settings.py:497
msgid "Display custom RSS feed to resellers and domain administrators"
msgstr "顯示自訂的 RSS 來源給經銷商和網域管理者"
-#: core/app_settings.py:484
+#: core/app_settings.py:506
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed to super admins"
+msgstr "顯示自訂的 RSS 來源給經銷商和網域管理者"
+
+#: core/app_settings.py:509
+#, fuzzy
+#| msgid "Display custom RSS feed to resellers and domain administrators"
+msgid "Display custom RSS feed also to super administrators"
+msgstr "顯示自訂的 RSS 來源給經銷商和網域管理者"
+
+#: core/app_settings.py:517
msgid "Hide features widget"
msgstr "隱藏功能物件"
-#: core/app_settings.py:486
+#: core/app_settings.py:519
msgid "Hide features widget for resellers and domain administrators"
msgstr "隱藏功能物件給經銷商和網域管理者"
-#: core/app_settings.py:498
+#: core/app_settings.py:531
+msgid "Theme"
+msgstr ""
+
+#: core/app_settings.py:537
+msgid "Primary theme color"
+msgstr ""
+
+#: core/app_settings.py:539
+msgid ""
+"Primary color of the theme (hexadecimal code), used as the background color "
+"of the left menu for example"
+msgstr ""
+
+#: core/app_settings.py:548
+msgid "Primary theme color (lighter version)"
+msgstr ""
+
+#: core/app_settings.py:551 core/app_settings.py:563
+msgid "Primary color of the theme (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:560
+msgid "Primary theme color (darker version)"
+msgstr ""
+
+#: core/app_settings.py:571
+#, fuzzy
+#| msgid "Secondary email"
+msgid "Secondary theme color"
+msgstr "次要電子郵件"
+
+#: core/app_settings.py:573
+msgid ""
+"Secondary color of the theme (hexadecimal code), used as the background "
+"color of some buttons for example"
+msgstr ""
+
+#: core/app_settings.py:581
+msgid "Labels theme color"
+msgstr ""
+
+#: core/app_settings.py:583
+msgid "Theme color for labels (hexadecimal code)"
+msgstr ""
+
+#: core/app_settings.py:595
msgid "Notifications"
msgstr "通知"
-#: core/app_settings.py:504
+#: core/app_settings.py:601
msgid "Sender address"
msgstr "伺服器位址"
-#: core/app_settings.py:506
+#: core/app_settings.py:603
msgid "Email address used to send notifications."
msgstr "郵件地址用於寄送通知。"
-#: core/app_settings.py:517
+#: core/app_settings.py:614
msgid "Public API"
msgstr "公用 API"
-#: core/app_settings.py:523
+#: core/app_settings.py:620
msgid "Enable communication"
msgstr "啟用通訊"
-#: core/app_settings.py:525 core/app_settings.py:535
+#: core/app_settings.py:622 core/app_settings.py:632
msgid "Automatically checks if a newer version is available"
msgstr "假如有新的版本就自動檢查"
-#: core/app_settings.py:532
+#: core/app_settings.py:629
msgid "Check new versions"
msgstr "檢查新的版本"
-#: core/app_settings.py:543
+#: core/app_settings.py:640
msgid "Send an email when new versions are found"
msgstr ""
-#: core/app_settings.py:547
+#: core/app_settings.py:644
msgid "Send an email to notify admins about new versions"
msgstr ""
-#: core/app_settings.py:554 sievefilters/constants.py:25
+#: core/app_settings.py:651 sievefilters/constants.py:25
msgid "Recipient"
msgstr ""
-#: core/app_settings.py:557
+#: core/app_settings.py:654
msgid "Recipient of new versions notification emails."
msgstr ""
-#: core/app_settings.py:564
+#: core/app_settings.py:661
msgid "Send statistics"
msgstr "寄送狀態"
-#: core/app_settings.py:567
+#: core/app_settings.py:664
msgid "Send statistics to Modoboa public API (counters and used extensions)"
msgstr "寄送狀態到 Modoboa 公用 API (計數器及已使用的外掛)"
-#: core/app_settings.py:586
+#: core/app_settings.py:683
#, fuzzy
#| msgid "Inactive account threshold"
msgid "Enable inactive account tracking"
msgstr "未啟用帳號上限"
-#: core/app_settings.py:589
+#: core/app_settings.py:686
msgid ""
"Allow the administrator to set a threshold (in days) beyond which an account "
"is considered inactive if the user hasn't logged in"
msgstr ""
-#: core/app_settings.py:598
+#: core/app_settings.py:695
msgid "Inactive account threshold"
msgstr "未啟用帳號上限"
-#: core/app_settings.py:601
+#: core/app_settings.py:698
msgid ""
"An account with a last login date greater than this threshold (in days) will "
"be considered as inactive"
msgstr "這個帳號最後一次登錄日期超過這個上限 (在幾天) 將考慮停用"
-#: core/app_settings.py:610
+#: core/app_settings.py:707
msgid "Top notifications check interval"
msgstr "檢查提醒間隔"
-#: core/app_settings.py:613
+#: core/app_settings.py:710
msgid "Interval between two top notification checks (in seconds)"
msgstr "兩次檢查提醒間隔 (在幾秒)"
-#: core/app_settings.py:620
+#: core/app_settings.py:717
msgid "Maximum log record age"
msgstr "最大日誌紀錄時間"
-#: core/app_settings.py:622
+#: core/app_settings.py:719
msgid "The maximum age in days of a log record"
msgstr ""
-#: core/app_settings.py:629
+#: core/app_settings.py:726
msgid "Items per page"
msgstr "每頁的條目數量"
-#: core/app_settings.py:631
+#: core/app_settings.py:728
msgid "Number of displayed items per page"
msgstr ""
-#: core/app_settings.py:638
+#: core/app_settings.py:735
msgid "Default top redirection"
msgstr ""
-#: core/app_settings.py:640
+#: core/app_settings.py:737
msgid "The default redirection used when no application is specified"
msgstr ""
-#: core/checks.py:13
+#: core/checks.py:15
msgid ""
"You have USE_TZ set to False, this may result in issues during transitions "
"between summer/winter time (ie the same local time occuring twice due to "
"clock change)."
msgstr ""
-#: core/checks.py:17
+#: core/checks.py:19
msgid "Set `USE_TZ = True` in settings.py"
msgstr ""
-#: core/checks.py:21
+#: core/checks.py:23
msgid "The password scheme you are using is deprecated."
msgstr ""
-#: core/checks.py:22
+#: core/checks.py:24
#, fuzzy
#| msgid "Default password scheme"
msgid "Upgrade your password scheme to a stronger one"
msgstr "預設密碼方案"
+#: core/checks.py:30
+msgid ""
+"Oauth2 application for dovecot has not been found. Webmail and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:34
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/dovecot."
+"html#dovecot-oauth2"
+msgstr ""
+
+#: core/checks.py:41
+msgid ""
+"Oauth2 application for radicale has not been found. Calendar and some other "
+"features won't be available."
+msgstr ""
+
+#: core/checks.py:45
+msgid ""
+"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
+"radicale.html#radicale-oauth2"
+msgstr ""
+
#: core/constants.py:6
msgid "Simple user"
msgstr "簡易用戶"
@@ -1618,61 +1720,61 @@ msgstr ""
msgid "[modoboa] Update(s) available"
msgstr "一個或多個可用的更新"
-#: core/models.py:72
+#: core/models.py:71
msgid "Allow mailboxes access"
msgstr "允許信箱存取"
-#: core/models.py:74
+#: core/models.py:73
msgid "Allow this administrator to access user mailboxes"
msgstr "允許這個管理者來存取使用者信箱"
-#: core/models.py:76
+#: core/models.py:75
msgid "password"
msgstr "密碼"
-#: core/models.py:79
+#: core/models.py:78
msgid "language"
msgstr "語言"
-#: core/models.py:83
+#: core/models.py:82
msgid "Prefered language to display pages."
msgstr "顯示頁面的預設語言"
-#: core/models.py:85
+#: core/models.py:84
msgid "Phone number"
msgstr "電話號碼"
-#: core/models.py:87
+#: core/models.py:86
msgid "Secondary email"
msgstr "次要電子郵件"
-#: core/models.py:92
+#: core/models.py:91
msgid "An alternative e-mail address, can be used for recovery needs."
msgstr "替代的電子郵件,可以使用在需要回復的時候。"
-#: core/models.py:151
+#: core/models.py:150
msgid "Failed to update password: LDAP module not installed"
msgstr "更新密碼失敗: LDAP 模組未安裝"
-#: core/models.py:186 policyd/core.py:117
+#: core/models.py:185 policyd/core.py:117
msgid "account"
msgstr "帳號"
-#: core/models.py:318
+#: core/models.py:317
msgid "Unknown"
msgstr "未知"
-#: core/models.py:361
+#: core/models.py:360
msgid "You can't import an account with a role greater than yours"
msgstr ""
-#: core/models.py:376
+#: core/models.py:375
#, fuzzy
#| msgid "Enter a valid email address."
msgid "The simple user '{}' must have a valid email address"
msgstr "輸入有效的電子郵件"
-#: core/models.py:384
+#: core/models.py:383
msgid "username and email fields must not differ for '{}'"
msgstr ""
@@ -2016,7 +2118,7 @@ msgstr ""
msgid "IMAP Migration"
msgstr ""
-#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:241
+#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
#, python-brace-format
msgid "Connection to IMAP server failed: {error}"
msgstr ""
@@ -2048,24 +2150,24 @@ msgstr ""
msgid "Failed to disable LDAP account: {}"
msgstr ""
-#: lib/api_client.py:35 lib/api_client.py:69 lib/api_client.py:83
-#: lib/api_client.py:87
+#: lib/api_client.py:35 lib/api_client.py:67 lib/api_client.py:81
+#: lib/api_client.py:85
#, fuzzy, python-format
#| msgid "Enable communication with Modoboa public API"
msgid "Failed to communicate with public API: %s"
msgstr "開啟 Modoboa 公用 API 的通訊"
-#: lib/email_utils.py:139 lib/email_utils.py:350
+#: lib/email_utils.py:140 lib/email_utils.py:351
msgid "unable to determine encoding of string"
msgstr ""
-#: lib/exceptions.py:85
+#: lib/exceptions.py:83
#, fuzzy
#| msgid "Permission denied: %s"
msgid "Permission denied: {}"
msgstr "權限不足: %s"
-#: lib/exceptions.py:86
+#: lib/exceptions.py:84
msgid "Permission denied"
msgstr "權限不足"
@@ -2812,11 +2914,11 @@ msgstr "已拒絕郵件"
msgid "Stop processing"
msgstr ""
-#: sievefilters/lib.py:51
+#: sievefilters/lib.py:49
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
-#: sievefilters/lib.py:78
+#: sievefilters/lib.py:76
#, fuzzy
#| msgid "Not enough resources"
msgid "Not enough space on server"
@@ -3155,7 +3257,7 @@ msgstr "簽名文字"
msgid "User defined email signature"
msgstr "使用者定義郵件簽名"
-#: webmail/lib/attachments.py:113
+#: webmail/lib/attachments.py:112
#, fuzzy
msgid "Failed to remove attachment: "
msgstr "移除附件失敗:"
@@ -3164,7 +3266,7 @@ msgstr "移除附件失敗:"
msgid "Date"
msgstr "日期"
-#: webmail/lib/imaputils.py:222
+#: webmail/lib/imaputils.py:221
msgid "Failed to retrieve hierarchy delimiter"
msgstr "無法檢查層次分隔"
@@ -3194,6 +3296,3 @@ msgstr "垃圾筒"
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr "附件太大 (限制: %s)"
-
-#~ msgid "Automatic reply timeout"
-#~ msgstr "自動答覆逾時"