From 7328022777c863b44f7e332671954aab448c03d2 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 30 Sep 2022 17:52:38 +0200 Subject: [PATCH] Added API key management to UI v2. --- frontend/locale/en/LC_MESSAGES/app.po | 888 ++++++++++++++++----- frontend/locale/fr/LC_MESSAGES/app.po | 912 +++++++++++++++++----- frontend/public/config.json | 3 +- frontend/src/api/account.js | 9 + frontend/src/components/layout/Navbar.vue | 7 + frontend/src/router/index.js | 10 + frontend/src/views/user/APISetup.vue | 114 +++ modoboa/core/api/v2/serializers.py | 6 + modoboa/core/api/v2/tests.py | 22 + modoboa/core/api/v2/viewsets.py | 45 +- 10 files changed, 1582 insertions(+), 434 deletions(-) create mode 100644 frontend/src/views/user/APISetup.vue diff --git a/frontend/locale/en/LC_MESSAGES/app.po b/frontend/locale/en/LC_MESSAGES/app.po index edb11e835..24e0c6dce 100644 --- a/frontend/locale/en/LC_MESSAGES/app.po +++ b/frontend/locale/en/LC_MESSAGES/app.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-06 16:14+0200\n" +"POT-Creation-Date: 2022-09-30 17:47+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en\n" @@ -12,23 +12,32 @@ msgstr "" "Generated-By: easygettext\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: src/components/domains/DomainList.vue:25 -#: src/components/domains/DomainList.vue:9 +#: src/components/domains/DomainList.vue:28 +#: src/components/domains/DomainList.vue:12 msgid "(disabled)" msgstr "" +#: src/views/user/APISetup.vue:29 +msgid "A documentation of the API is available" +msgstr "" + +#: src/components/domains/DNSDetail.vue:47 +#: src/components/domains/DNSDetail.vue:183 +msgid "A new key will be generated soon. Refresh the page in a moment to see it." +msgstr "" + #: src/components/identities/AccountRoleForm.vue:39 -#: src/components/identities/AccountRoleForm.vue:67 +#: src/components/identities/AccountRoleForm.vue:69 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 "" #: src/components/identities/AccountRoleForm.vue:34 -#: src/components/identities/AccountRoleForm.vue:62 +#: src/components/identities/AccountRoleForm.vue:64 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 "" #: src/components/identities/AccountRoleForm.vue:24 -#: src/components/identities/AccountRoleForm.vue:52 +#: src/components/identities/AccountRoleForm.vue:54 msgid "A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox." msgstr "" @@ -36,39 +45,41 @@ msgstr "" msgid "Absolute time range" msgstr "" -#: src/views/identities/Identities.vue:20 +#: src/views/identities/Account.vue:3 src/views/identities/Identities.vue:20 msgid "Account" msgstr "" -#: src/components/identities/AccountCreationForm.vue:127 -#: src/components/identities/AccountCreationForm.vue:177 +#: src/components/identities/AccountCreationForm.vue:131 +#: src/components/identities/AccountCreationForm.vue:181 msgid "Account created" msgstr "" #: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:134 +#: src/components/identities/IdentityList.vue:146 msgid "Account deleted" msgstr "" -#: src/components/identities/AccountForm.vue:49 -#: src/components/identities/AccountForm.vue:162 +#: src/components/identities/AccountForm.vue:65 +#: src/components/identities/AccountForm.vue:192 msgid "Account updated" msgstr "" -#: src/components/domains/DomainList.vue:34 +#: src/components/domains/DomainList.vue:29 +#: src/components/identities/IdentityList.vue:6 +#: src/components/identities/IdentityList.vue:2 #: src/components/identities/IdentityList.vue:19 -#: src/components/domains/DomainList.vue:157 -#: src/components/identities/IdentityList.vue:86 +#: src/components/identities/IdentityList.vue:98 +#: src/components/domains/DomainList.vue:171 msgid "Actions" msgstr "" #: src/components/domains/DomainAliasForm.vue:17 -#: src/components/domains/DomainAliasForm.vue:90 +#: src/components/domains/DomainAliasForm.vue:86 msgid "Add" msgstr "" #: src/components/domains/DomainAliasForm.vue:20 -#: src/components/domains/DomainAliasForm.vue:93 +#: src/components/domains/DomainAliasForm.vue:89 msgid "Add a new domain alias" msgstr "" @@ -76,10 +87,16 @@ msgstr "" msgid "Add administrator" msgstr "" -#: src/components/domains/DNSDetail.vue:14 +#: src/components/identities/AccountSenderAddresses.vue:24 +msgid "Add sender address" +msgstr "" + +#: src/components/domains/DNSDetail.vue:19 +#: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 -#: src/components/domains/DNSDetail.vue:132 #: src/components/identities/AliasCreationForm.vue:40 +#: src/components/identities/AccountSenderAddresses.vue:63 +#: src/components/domains/DNSDetail.vue:155 msgid "Address" msgstr "" @@ -87,9 +104,8 @@ msgstr "" msgid "Address:" msgstr "" -#: src/components/parameters/ParametersForm.vue:23 -#: src/components/parameters/ParametersForm.vue:100 -msgid "Administration" +#: src/components/identities/DomainAdminDomains.vue:3 +msgid "Administered domains" msgstr "" #: src/components/domains/AdministratorList.vue:53 @@ -98,7 +114,7 @@ msgid "Administrator added" msgstr "" #: src/components/domains/DomainCreationForm.vue:55 -#: src/components/domains/DomainCreationForm.vue:103 +#: src/components/domains/DomainCreationForm.vue:106 msgid "Administrator name" msgstr "" @@ -108,8 +124,8 @@ msgid "Administrator removed" msgstr "" #: src/components/domains/AdministratorList.vue:5 -#: src/components/domains/DomainList.vue:24 -#: src/components/domains/DomainList.vue:147 +#: src/components/domains/DomainList.vue:113 +#: src/components/domains/DomainList.vue:255 msgid "Administrators" msgstr "" @@ -117,7 +133,14 @@ msgstr "" msgid "Administrators of {{ domain.name }}" msgstr "" -#: src/views/domains/Domains.vue:23 src/views/identities/Identities.vue:23 +#: src/components/domains/DomainList.vue:119 +#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/domains/DomainList.vue:261 +msgid "Alarms" +msgstr "" + +#: src/views/domains/Domains.vue:23 src/views/identities/Alias.vue:3 +#: src/views/identities/Identities.vue:23 msgid "Alias" msgstr "" @@ -127,7 +150,7 @@ msgid "Alias created" msgstr "" #: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:124 msgid "Alias deleted" msgstr "" @@ -141,63 +164,95 @@ msgstr "" msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" -#: src/components/domains/DomainList.vue:30 +#: src/components/domains/DomainList.vue:25 #: src/components/domains/DomainSummary.vue:31 +#: src/components/identities/AccountAliases.vue:3 #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 -#: src/components/domains/DomainList.vue:153 #: src/components/identities/AccountCreationForm.vue:112 #: src/components/identities/AccountCreationForm.vue:115 #: src/components/identities/AccountCreationForm.vue:143 +#: src/components/domains/DomainList.vue:167 msgid "Aliases" msgstr "" +#: src/components/layout/Navbar.vue:93 src/components/layout/Navbar.vue:208 +msgid "API" +msgstr "" + +#: src/views/user/APISetup.vue:3 +msgid "API access" +msgstr "" + +#: src/views/user/APISetup.vue:24 src/views/user/APISetup.vue:65 +msgid "API token copied to your clipboard" +msgstr "" + +#: src/views/user/APISetup.vue:33 src/views/user/APISetup.vue:74 +msgid "API token created" +msgstr "" + +#: src/views/user/APISetup.vue:55 src/views/user/APISetup.vue:96 +msgid "API token deleted" +msgstr "" + #: src/components/tools/TimeSerieChart.vue:19 msgid "Apply" msgstr "" -#: src/components/layout/Navbar.vue:56 src/views/logs/AuditTrail.vue:3 -#: src/components/layout/Navbar.vue:168 +#: src/components/layout/Navbar.vue:73 src/views/logs/AuditTrail.vue:3 +#: src/components/layout/Navbar.vue:188 msgid "Audit trail" msgstr "" -#: src/components/domains/DNSDetail.vue:34 +#: src/components/domains/DNSDetail.vue:38 msgid "Authentication" msgstr "" #: src/components/domains/DNSDetail.vue:15 +#: src/components/domains/DomainDNSConfig.vue:31 msgid "Auto configuration" msgstr "" -#: src/components/domains/DNSDetail.vue:22 +#: src/components/domains/DNSDetail.vue:24 msgid "autoconfig record (Mozilla) not found" msgstr "" #: src/components/domains/DNSDetail.vue:19 -msgid "autoconfig record (Mozilla): {{ detail.autoconfig_record.value }}" +msgid "autoconfig record (Mozilla): %{ value }" msgstr "" -#: src/components/domains/DNSDetail.vue:30 +#: src/components/domains/DNSDetail.vue:34 msgid "autodiscover record (Microsoft) not found" msgstr "" -#: src/components/domains/DNSDetail.vue:27 -msgid "autodiscover record (Microsoft): {{ detail.autodiscover_record.value }}" +#: src/components/domains/DNSDetail.vue:29 +msgid "autodiscover record (Microsoft): %{ value }" msgstr "" #: src/components/tools/CreationForm.vue:24 msgid "Back" msgstr "" -#: src/components/domains/DomainForm.vue:88 -#: src/components/identities/AccountForm.vue:82 +#: src/components/domains/DomainDKIMKey.vue:14 +msgid "Bind/named format. Click to copy" +msgstr "" + +#: src/components/domains/DomainForm.vue:122 +#: src/components/identities/AccountForm.vue:94 #: src/components/identities/AliasForm.vue:55 -#: src/components/layout/ConfirmDialog.vue:14 +#: src/components/layout/ConfirmDialog.vue:14 src/views/user/APISetup.vue:46 +#: src/components/layout/ConfirmDialog.vue:53 src/views/user/APISetup.vue:87 msgid "Cancel" msgstr "" +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 +msgid "Check this option if passwords contained in your file are not crypted" +msgstr "" + #: src/components/domains/DomainAliasForm.vue:56 +#: src/components/domains/DomainAliasForm.vue:26 msgid "Choose a domain" msgstr "" @@ -207,7 +262,10 @@ msgstr "" #: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 -#: src/components/domains/DomainDNSConfig.vue:36 +#: src/components/domains/DomainDKIMKey.vue:22 +#: src/components/domains/DomainDNSConfig.vue:40 +#: src/components/tools/ImportForm.vue:26 +#: src/components/user/RecoveryCodesResetDialog.vue:23 msgid "Close" msgstr "" @@ -215,32 +273,46 @@ msgstr "" msgid "Confirm and create" msgstr "" -#: src/components/identities/AccountGeneralForm.vue:122 +#: src/components/identities/AccountPasswordForm.vue:108 +#: src/components/identities/AccountPasswordForm.vue:58 msgid "Confirmation" msgstr "" +#: src/components/user/TwoFactorAuthForm.vue:34 +#: src/components/user/TwoFactorAuthForm.vue:2 +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." +msgstr "" + #: src/views/Login.vue:21 msgid "Connect" msgstr "" +#: src/components/tools/ImportForm.vue:19 +msgid "Continue on error" +msgstr "" + #: src/components/domains/DomainGeneralForm.vue:8 msgid "Control if this domain will be allowed to send and receive messages" msgstr "" -#: src/components/domains/DomainCreationForm.vue:24 +#: src/components/domains/DomainCreationForm.vue:27 #: src/components/domains/DomainCreationForm.vue:10 #: src/components/domains/DomainCreationForm.vue:9 #: src/components/identities/AccountCreationForm.vue:26 #: src/components/identities/AccountCreationForm.vue:12 #: src/components/identities/AccountCreationForm.vue:11 -#: src/components/identities/AccountGeneralForm.vue:15 -#: src/components/identities/AccountGeneralForm.vue:3 +#: src/components/identities/AccountPasswordForm.vue:13 +#: src/components/identities/AccountPasswordForm.vue:3 msgid "Copy to clipboard" msgstr "" -#: src/components/domains/DomainCreationForm.vue:46 +#: src/views/user/APISetup.vue:20 +msgid "Copy token to clipboard" +msgstr "" + +#: src/components/domains/DomainCreationForm.vue:54 #: src/components/domains/DomainOptionsForm.vue:2 -#: src/components/domains/DomainCreationForm.vue:94 +#: src/components/domains/DomainCreationForm.vue:105 msgid "Create a domain administrator" msgstr "" @@ -250,7 +322,7 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:68 #: src/components/domains/DomainOptionsForm.vue:8 -#: src/components/domains/DomainCreationForm.vue:116 +#: src/components/domains/DomainCreationForm.vue:119 msgid "Create aliases" msgstr "" @@ -259,10 +331,22 @@ msgid "Create standard aliases for the domain." msgstr "" #: src/components/domains/DomainSummary.vue:7 +#: src/components/identities/AccountSummary.vue:7 +#: src/components/identities/AliasSummary.vue:7 msgid "Creation date" msgstr "" -#: src/components/identities/AccountMailboxForm.vue:41 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 +msgid "Crypt passwords" +msgstr "" + +#: src/components/identities/AccountPasswordForm.vue:29 +#: src/components/identities/AccountPasswordForm.vue:11 +msgid "Current password" +msgstr "" + +#: src/components/identities/AccountMailboxForm.vue:43 +#: src/components/identities/AccountMailboxForm.vue:26 msgid "Daily message sending limit" msgstr "" @@ -270,26 +354,27 @@ msgstr "" msgid "Daily sending limit" msgstr "" -#: src/components/layout/Navbar.vue:33 src/components/layout/Navbar.vue:145 +#: src/components/layout/Navbar.vue:45 src/components/layout/Navbar.vue:160 msgid "Dashboard" msgstr "" +#: src/components/alarms/AlarmList.vue:8 #: src/components/logs/AuditTrailList.vue:8 -#: src/components/logs/MessageList.vue:9 +#: src/components/logs/MessageList.vue:9 src/components/alarms/AlarmList.vue:48 #: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:42 msgid "Date" msgstr "" -#: src/components/tools/TimeSerieChart.vue:57 -#: src/components/tools/TimeSerieChart.vue:115 +#: src/components/tools/TimeSerieChart.vue:51 +#: src/components/tools/TimeSerieChart.vue:109 msgid "Day" msgstr "" -#: src/components/domains/DomainCreationForm.vue:39 +#: src/components/domains/DomainCreationForm.vue:41 #: src/components/domains/DomainLimitationsForm.vue:6 #: src/components/domains/DomainSummary.vue:19 -#: src/components/domains/DomainCreationForm.vue:87 +#: src/components/domains/DomainCreationForm.vue:92 msgid "Default mailbox quota" msgstr "" @@ -298,48 +383,67 @@ msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) msgstr "" #: src/components/domains/DomainAliasForm.vue:24 -#: src/components/domains/DomainList.vue:26 +#: src/components/domains/DomainList.vue:115 #: src/components/identities/IdentityList.vue:89 #: src/components/identities/IdentityList.vue:92 -#: src/components/domains/DomainList.vue:149 -#: src/components/identities/IdentityList.vue:156 -#: src/components/identities/IdentityList.vue:159 +#: src/components/identities/IdentityList.vue:168 +#: src/components/identities/IdentityList.vue:171 +#: src/components/domains/DomainList.vue:257 msgid "Delete" msgstr "" +#: src/views/user/APISetup.vue:23 +msgid "Delete token" +msgstr "" + #: src/components/identities/AliasCreationForm.vue:31 -#: src/components/identities/AliasGeneralForm.vue:82 -#: src/components/identities/AliasGeneralForm.vue:51 +#: src/components/identities/AliasGeneralForm.vue:87 +#: src/components/identities/AliasSummary.vue:19 #: src/components/identities/AliasCreationForm.vue:51 +#: src/components/identities/AliasGeneralForm.vue:56 msgid "Description" msgstr "" +#: src/components/user/TwoFactorAuthForm.vue:57 +#: src/components/user/TwoFactorAuthForm.vue:5 +msgid "Disable 2FA" +msgstr "" + #: src/components/domains/DNSStatusChip.vue:6 #: src/components/domains/DNSStatusChip.vue:13 msgid "Disabled" msgstr "" -#: src/components/domains/DNSDetail.vue:62 +#: src/components/domains/DNSDetail.vue:66 msgid "DKIM key" msgstr "" -#: src/components/domains/DomainCreationForm.vue:52 +#: src/components/domains/DomainCreationForm.vue:48 #: src/components/domains/DomainDNSForm.vue:5 -#: src/components/domains/DomainCreationForm.vue:100 +#: src/components/domains/DomainCreationForm.vue:99 msgid "DKIM key length" msgstr "" -#: src/components/domains/DomainCreationForm.vue:51 +#: src/components/domains/DomainCreationForm.vue:47 #: src/components/domains/DomainDNSForm.vue:4 -#: src/components/domains/DomainCreationForm.vue:99 +#: src/components/domains/DomainCreationForm.vue:98 msgid "DKIM key selector" msgstr "" -#: src/components/domains/DNSDetail.vue:46 +#: src/components/domains/DNSDetail.vue:30 +#: src/components/domains/DNSDetail.vue:167 +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" +msgstr "" + +#: src/components/domains/DomainDKIMKey.vue:4 +msgid "DKIM public key for" +msgstr "" + +#: src/components/domains/DNSDetail.vue:50 msgid "DKIM record found" msgstr "" -#: src/components/domains/DNSDetail.vue:49 +#: src/components/domains/DNSDetail.vue:53 msgid "DKIM record not found" msgstr "" @@ -347,19 +451,21 @@ msgstr "" msgid "DKIM signing" msgstr "" -#: src/components/domains/DNSDetail.vue:54 +#: src/components/domains/DNSDetail.vue:58 msgid "DMARC record found" msgstr "" -#: src/components/domains/DNSDetail.vue:57 +#: src/components/domains/DNSDetail.vue:61 msgid "DMARC record not found" msgstr "" -#: src/components/domains/DomainCreationForm.vue:29 -#: src/components/domains/DomainCreationForm.vue:85 +#: src/components/domains/DomainCreationForm.vue:31 +#: src/components/domains/DomainCreationForm.vue:109 +#: src/components/domains/DomainCreationForm.vue:115 #: src/components/domains/DomainForm.vue:32 -#: src/components/domains/DomainCreationForm.vue:77 -#: src/components/domains/DomainCreationForm.vue:133 +#: src/components/domains/DomainCreationForm.vue:82 +#: src/components/domains/DomainCreationForm.vue:160 +#: src/components/domains/DomainCreationForm.vue:166 msgid "DNS" msgstr "" @@ -375,51 +481,54 @@ msgstr "" msgid "DNS configuration help" msgstr "" -#: src/components/domains/DomainList.vue:31 -#: src/components/domains/DomainList.vue:154 +#: src/components/domains/DomainList.vue:26 +#: src/components/domains/DomainList.vue:168 msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:37 +#: src/components/identities/IdentityList.vue:49 msgid "Do not delete account folder" msgstr "" -#: src/components/domains/DomainList.vue:69 +#: src/components/domains/DomainList.vue:77 msgid "Do not delete domain folder" msgstr "" #: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:99 +#: src/components/identities/IdentityList.vue:111 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" -#: src/components/identities/AliasGeneralForm.vue:54 +#: src/components/alarms/AlarmList.vue:9 +#: src/components/identities/AliasGeneralForm.vue:56 #: src/views/domains/Domain.vue:3 src/views/domains/Domains.vue:20 +#: src/components/identities/AliasGeneralForm.vue:31 +#: src/components/alarms/AlarmList.vue:49 msgid "Domain" msgstr "" #: src/components/identities/AccountRoleForm.vue:22 -#: src/components/identities/AccountRoleForm.vue:50 +#: src/components/identities/AccountRoleForm.vue:52 msgid "Domain administrator" msgstr "" #: src/components/domains/DomainAliasForm.vue:51 -#: src/components/domains/DomainAliasForm.vue:124 +#: src/components/domains/DomainAliasForm.vue:120 msgid "Domain alias created" msgstr "" #: src/components/domains/DomainAliasForm.vue:40 -#: src/components/domains/DomainAliasForm.vue:113 +#: src/components/domains/DomainAliasForm.vue:109 msgid "Domain alias deleted" msgstr "" #: src/components/domains/DomainAliasForm.vue:59 -#: src/components/domains/DomainAliasForm.vue:132 +#: src/components/domains/DomainAliasForm.vue:128 msgid "Domain alias updated" msgstr "" -#: src/components/domains/DomainCreationForm.vue:138 -#: src/components/domains/DomainCreationForm.vue:186 +#: src/components/domains/DomainCreationForm.vue:174 +#: src/components/domains/DomainCreationForm.vue:225 msgid "Domain created" msgstr "" @@ -428,8 +537,8 @@ msgstr "" msgid "Domain default value" msgstr "" -#: src/components/domains/DomainList.vue:75 -#: src/components/domains/DomainList.vue:198 +#: src/components/domains/DomainList.vue:70 +#: src/components/domains/DomainList.vue:212 msgid "Domain deleted" msgstr "" @@ -437,8 +546,8 @@ msgstr "" msgid "Domain name (ex: domain.tld)" msgstr "" -#: src/components/domains/DomainForm.vue:28 -#: src/components/domains/DomainForm.vue:147 +#: src/components/domains/DomainForm.vue:53 +#: src/components/domains/DomainForm.vue:215 msgid "Domain updated" msgstr "" @@ -447,17 +556,21 @@ msgstr "" msgid "domain's default value" msgstr "" -#: src/components/layout/Navbar.vue:39 src/views/domains/Domains.vue:3 -#: src/components/layout/Navbar.vue:151 +#: src/components/layout/Navbar.vue:51 src/views/domains/Domains.vue:3 +#: src/components/layout/Navbar.vue:166 msgid "Domains" msgstr "" -#: src/components/domains/DomainList.vue:25 +#: src/components/tools/ImportForm.vue:19 +msgid "Don't treat duplicated objects as errors" +msgstr "" + +#: src/components/domains/DomainList.vue:114 #: src/components/identities/IdentityList.vue:88 #: src/components/identities/IdentityList.vue:91 -#: src/components/domains/DomainList.vue:148 -#: src/components/identities/IdentityList.vue:155 -#: src/components/identities/IdentityList.vue:158 +#: src/components/identities/IdentityList.vue:167 +#: src/components/identities/IdentityList.vue:170 +#: src/components/domains/DomainList.vue:256 msgid "Edit" msgstr "" @@ -474,7 +587,7 @@ msgid "Edit domain" msgstr "" #: src/components/domains/DomainAliasForm.vue:20 -#: src/components/domains/DomainAliasForm.vue:93 +#: src/components/domains/DomainAliasForm.vue:89 msgid "Edit domain alias" msgstr "" @@ -483,49 +596,64 @@ msgstr "" msgid "Email" msgstr "" -#: src/components/identities/AliasGeneralForm.vue:34 +#: src/components/identities/AliasGeneralForm.vue:35 +#: src/components/identities/AliasGeneralForm.vue:15 msgid "Email address" msgstr "" #: src/components/tools/CreationSummary.vue:5 +#: src/components/tools/CreationSummary.vue:32 msgid "Empty" msgstr "" -#: src/components/domains/DomainCreationForm.vue:32 +#: src/components/user/TwoFactorAuthForm.vue:68 +#: src/components/user/TwoFactorAuthForm.vue:5 +msgid "Enable 2FA" +msgstr "" + +#: src/components/user/APIAccessForm.vue:4 +msgid "Enable API access" +msgstr "" + +#: src/components/domains/DomainCreationForm.vue:34 #: src/components/domains/DomainDNSForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:80 +#: src/components/domains/DomainCreationForm.vue:85 msgid "Enable DKIM signing" msgstr "" -#: src/components/domains/DomainCreationForm.vue:31 +#: src/components/domains/DomainCreationForm.vue:33 #: src/components/domains/DomainDNSForm.vue:2 -#: src/components/domains/DomainCreationForm.vue:79 +#: src/components/domains/DomainCreationForm.vue:84 msgid "Enable DNS checks" msgstr "" -#: src/components/domains/DomainCreationForm.vue:25 +#: src/components/user/APIAccessForm.vue:4 +msgid "Enable to generate an API access token you will use with your requests" +msgstr "" + +#: src/components/domains/DomainCreationForm.vue:27 #: src/components/domains/DomainGeneralForm.vue:8 #: src/components/identities/AccountCreationForm.vue:39 #: src/components/identities/AccountForm.vue:39 -#: src/components/identities/AccountGeneralForm.vue:29 +#: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/domains/DomainCreationForm.vue:73 #: src/components/identities/AccountCreationForm.vue:89 +#: src/components/domains/DomainCreationForm.vue:78 msgid "Enabled" msgstr "" -#: src/components/identities/AccountGeneralForm.vue:21 -#: src/components/identities/AccountGeneralForm.vue:105 +#: src/components/identities/AccountGeneralForm.vue:20 +#: src/components/identities/AccountGeneralForm.vue:70 msgid "Enter a simple username or an email address" msgstr "" -#: src/components/identities/AccountGeneralForm.vue:19 -#: src/components/identities/AccountGeneralForm.vue:103 +#: src/components/identities/AccountGeneralForm.vue:18 +#: src/components/identities/AccountGeneralForm.vue:68 msgid "Enter an email address" msgstr "" -#: src/views/TwoFA.vue:10 +#: src/views/TwoFA.vue:12 msgid "Enter the code from the two-factor app on your mobile device. If you have lost your device, you may enter one of your recovery codes." msgstr "" @@ -534,14 +662,27 @@ msgid "Ex: 10MB. Leave empty for no limit" msgstr "" #: src/components/identities/AliasCreationForm.vue:26 -#: src/components/identities/AliasGeneralForm.vue:75 +#: src/components/identities/AliasGeneralForm.vue:79 +#: src/components/identities/AliasSummary.vue:15 #: src/components/identities/AliasCreationForm.vue:46 +#: src/components/identities/AliasGeneralForm.vue:49 msgid "Expire at" msgstr "" +#: src/views/identities/Identities.vue:8 +msgid "Export accounts and aliases to CSV" +msgstr "" + +#: src/views/domains/Domains.vue:8 +msgid "Export domains and aliases to CSV" +msgstr "" + #: src/components/identities/AccountCreationForm.vue:30 -#: src/components/identities/AccountGeneralForm.vue:43 +#: src/components/identities/AccountGeneralForm.vue:32 +#: src/components/user/ProfileForm.vue:45 #: src/components/identities/AccountCreationForm.vue:80 +#: src/components/identities/AccountGeneralForm.vue:17 +#: src/components/user/ProfileForm.vue:9 msgid "First name" msgstr "" @@ -549,47 +690,85 @@ msgstr "" msgid "Forgot password?" msgstr "" +#: src/components/layout/Navbar.vue:117 src/views/user/Forward.vue:3 +#: src/components/layout/Navbar.vue:232 +msgid "Forward" +msgstr "" + +#: src/components/user/ForwardForm.vue:6 +msgid "Forward messages and store copies into your local mailbox" +msgstr "" + +#: src/components/user/APIAccessForm.vue:19 +#: src/components/user/ForwardForm.vue:19 +#: src/components/user/APIAccessForm.vue:44 +#: src/components/user/ForwardForm.vue:52 +msgid "Forward updated" +msgstr "" + #: src/components/logs/MessageList.vue:12 #: src/components/tools/TimeSerieChart.vue:17 #: src/components/logs/MessageList.vue:45 msgid "From" msgstr "" +#: src/components/identities/AccountSummary.vue:16 +msgid "Full name" +msgstr "" + #: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:84 +#: src/components/identities/IdentityList.vue:96 msgid "Fullname/recipient" msgstr "" -#: src/components/domains/DomainCreationForm.vue:21 -#: src/components/domains/DomainCreationForm.vue:84 +#: src/components/domains/DomainCreationForm.vue:23 +#: src/components/domains/DomainCreationForm.vue:108 +#: src/components/domains/DomainCreationForm.vue:114 #: src/components/domains/DomainForm.vue:7 #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 -#: src/components/parameters/ParametersForm.vue:21 -#: src/components/domains/DomainCreationForm.vue:69 -#: src/components/domains/DomainCreationForm.vue:132 -#: src/components/parameters/ParametersForm.vue:98 #: src/components/identities/AliasCreationForm.vue:37 #: src/components/identities/AliasCreationForm.vue:69 +#: src/components/domains/DomainCreationForm.vue:74 +#: src/components/domains/DomainCreationForm.vue:159 +#: src/components/domains/DomainCreationForm.vue:165 msgid "General" msgstr "" #: src/components/domains/DomainSummary.vue:3 +#: src/components/identities/AccountSummary.vue:3 +#: src/components/identities/AliasSummary.vue:3 msgid "General information" msgstr "" +#: src/components/user/ProfileForm.vue:3 +msgid "General settings" +msgstr "" + +#: src/views/user/APISetup.vue:12 +msgid "Generate" +msgstr "" + +#: src/components/domains/DNSDetail.vue:72 +msgid "Generate a new DKIM key" +msgstr "" + #: src/components/domains/DomainOptionsForm.vue:6 msgid "Generate a random password for the administrator." msgstr "" #: src/components/identities/AccountRoleForm.vue:29 -#: src/components/identities/AccountRoleForm.vue:57 +#: src/components/identities/AccountRoleForm.vue:59 msgid "help" msgstr "" -#: src/components/domains/DomainDNSConfig.vue:29 -#: src/components/domains/DomainDNSConfig.vue:30 +#: src/components/domains/DomainDNSConfig.vue:8 +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." +msgstr "" + +#: src/components/domains/DomainDNSConfig.vue:33 +#: src/components/domains/DomainDNSConfig.vue:34 msgid "hostname of your automx server" msgstr "" @@ -601,8 +780,8 @@ msgstr "" msgid "Identification" msgstr "" -#: src/components/layout/Navbar.vue:45 src/views/identities/Identities.vue:3 -#: src/components/layout/Navbar.vue:157 +#: src/components/layout/Navbar.vue:57 src/views/identities/Identities.vue:3 +#: src/components/layout/Navbar.vue:172 msgid "Identities" msgstr "" @@ -611,6 +790,38 @@ msgstr "" msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" +#: src/components/tools/ImportForm.vue:29 +msgid "Import" +msgstr "" + +#: src/views/identities/Identities.vue:5 +msgid "Import accounts and aliases from CSV file" +msgstr "" + +#: src/views/domains/Domains.vue:37 +msgid "Import domains" +msgstr "" + +#: src/views/domains/Domains.vue:5 +msgid "Import domains and aliases from CSV file" +msgstr "" + +#: src/views/identities/Identities.vue:37 +msgid "Import identities" +msgstr "" + +#: src/components/user/ForwardForm.vue:5 +msgid "Indicate one or more recipients separated by a comma (,)" +msgstr "" + +#: src/components/user/TwoFactorAuthForm.vue:14 +#: src/components/user/TwoFactorAuthForm.vue:7 +msgid "" +"Install a soft token authenticator like FreeOTP or Google\n" +" Authenticator from your application repository and use that\n" +" app to scan this QR code." +msgstr "" + #: src/views/Login.vue:35 src/views/Login.vue:93 msgid "Invalid username and/or password" msgstr "" @@ -625,14 +836,29 @@ msgid "" " some useful information about the product." msgstr "" +#: src/components/user/ForwardForm.vue:6 +msgid "Keep local copies" +msgstr "" + +#: src/components/user/ProfileForm.vue:59 +#: src/components/user/ProfileForm.vue:21 +msgid "Language" +msgstr "" + +#: src/components/identities/AccountSummary.vue:11 +msgid "Last login date" +msgstr "" + #: src/components/domains/DomainSummary.vue:11 msgid "Last modification date" msgstr "" #: src/components/identities/AccountCreationForm.vue:31 -#: src/components/identities/AccountGeneralForm.vue:50 +#: src/components/identities/AccountGeneralForm.vue:41 +#: src/components/user/ProfileForm.vue:52 #: src/components/identities/AccountCreationForm.vue:81 #: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/user/ProfileForm.vue:15 msgid "Last name" msgstr "" @@ -645,13 +871,13 @@ msgstr "" msgid "Level" msgstr "" -#: src/components/domains/DomainCreationForm.vue:36 -#: src/components/domains/DomainCreationForm.vue:86 +#: src/components/domains/DomainCreationForm.vue:38 +#: src/components/domains/DomainCreationForm.vue:110 +#: src/components/domains/DomainCreationForm.vue:116 #: src/components/domains/DomainForm.vue:61 -#: src/components/parameters/ParametersForm.vue:25 -#: src/components/domains/DomainCreationForm.vue:84 -#: src/components/domains/DomainCreationForm.vue:134 -#: src/components/parameters/ParametersForm.vue:102 +#: src/components/domains/DomainCreationForm.vue:89 +#: src/components/domains/DomainCreationForm.vue:161 +#: src/components/domains/DomainCreationForm.vue:167 msgid "Limitations" msgstr "" @@ -660,20 +886,22 @@ msgstr "" msgid "Logger" msgstr "" -#: src/components/layout/Navbar.vue:77 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:189 src/components/layout/Topbar.vue:53 +#: src/components/layout/Navbar.vue:133 src/components/layout/Topbar.vue:6 +#: src/components/layout/Navbar.vue:248 src/components/layout/Topbar.vue:53 msgid "Logout" msgstr "" -#: src/components/layout/Navbar.vue:52 src/components/layout/Navbar.vue:164 +#: src/components/layout/Navbar.vue:69 src/components/layout/Navbar.vue:184 msgid "Logs" msgstr "" +#: src/components/alarms/AlarmList.vue:10 #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 +#: src/components/alarms/AlarmList.vue:50 msgid "Mailbox" msgstr "" @@ -681,7 +909,9 @@ msgstr "" msgid "Mailboxes" msgstr "" +#: src/components/alarms/AlarmList.vue:11 #: src/components/logs/AuditTrailList.vue:11 +#: src/components/alarms/AlarmList.vue:51 #: src/components/logs/AuditTrailList.vue:43 msgid "Message" msgstr "" @@ -690,11 +920,11 @@ msgstr "" msgid "Message history" msgstr "" -#: src/components/domains/DomainCreationForm.vue:40 +#: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/domains/DomainCreationForm.vue:88 #: src/components/identities/AccountCreationForm.vue:106 +#: src/components/domains/DomainCreationForm.vue:93 msgid "Message sending limit" msgstr "" @@ -702,16 +932,20 @@ msgstr "" msgid "messages" msgstr "" -#: src/components/layout/Navbar.vue:61 src/components/layout/Navbar.vue:173 +#: src/components/layout/Navbar.vue:78 src/components/layout/Navbar.vue:193 msgid "Messages" msgstr "" +#: src/components/identities/AliasSummary.vue:11 +msgid "Modified" +msgstr "" + #: src/components/tools/CreationSummary.vue:5 msgid "Modify" msgstr "" -#: src/components/tools/TimeSerieChart.vue:59 -#: src/components/tools/TimeSerieChart.vue:117 +#: src/components/tools/TimeSerieChart.vue:53 +#: src/components/tools/TimeSerieChart.vue:111 msgid "Month" msgstr "" @@ -720,18 +954,18 @@ msgid "MX records" msgstr "" #: src/components/domains/AdministratorList.vue:19 -#: src/components/domains/DNSDetail.vue:13 +#: src/components/domains/DNSDetail.vue:18 #: src/components/domains/DomainAliasForm.vue:40 -#: src/components/domains/DomainCreationForm.vue:23 -#: src/components/domains/DomainList.vue:29 +#: src/components/domains/DomainCreationForm.vue:25 +#: src/components/domains/DomainList.vue:24 #: src/components/domains/DomainOptionsForm.vue:4 #: src/components/identities/IdentityList.vue:16 -#: src/components/domains/DomainCreationForm.vue:71 -#: src/components/domains/AdministratorList.vue:87 -#: src/components/domains/DNSDetail.vue:131 -#: src/components/domains/DomainList.vue:152 +#: src/components/identities/IdentityList.vue:95 +#: src/components/domains/DNSDetail.vue:154 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/identities/IdentityList.vue:83 +#: src/components/domains/DomainCreationForm.vue:76 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainList.vue:166 msgid "Name" msgstr "" @@ -743,6 +977,10 @@ msgstr "" msgid "Name:" msgstr "" +#: src/components/identities/AccountSummary.vue:13 +msgid "Never logged-in" +msgstr "" + #: src/views/domains/Domains.vue:15 src/views/domains/Domains.vue:3 #: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" @@ -760,26 +998,36 @@ msgstr "" msgid "New domain" msgstr "" +#: src/components/user/RecoveryCodesResetDialog.vue:3 +msgid "New recovery codes" +msgstr "" + #: src/components/tools/CreationForm.vue:27 msgid "Next" msgstr "" -#: src/components/domains/DomainList.vue:66 +#: src/components/domains/DNSDetail.vue:35 +#: src/components/domains/DomainList.vue:61 #: src/components/identities/IdentityList.vue:37 #: src/components/identities/IdentityList.vue:58 #: src/components/tools/CreationForm.vue:30 -#: src/components/domains/DomainList.vue:189 #: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:104 -#: src/components/identities/IdentityList.vue:125 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:137 +#: src/components/domains/DNSDetail.vue:171 +#: src/components/domains/DomainList.vue:203 msgid "No" msgstr "" +#: src/components/identities/AccountSenderAddresses.vue:6 +msgid "No sender address defined for this account" +msgstr "" + #: src/components/domains/DomainForm.vue:74 msgid "No sending limit" msgstr "" -#: src/components/domains/DNSDetail.vue:70 +#: src/components/domains/DNSDetail.vue:76 msgid "Not generated" msgstr "" @@ -792,35 +1040,46 @@ msgid "Number of messages this mailbox can send per day. Leave empty for no limi msgstr "" #: src/components/layout/ConfirmDialog.vue:15 +#: src/components/layout/ConfirmDialog.vue:54 msgid "OK" msgstr "" -#: src/components/domains/DomainCreationForm.vue:44 -#: src/components/domains/DomainCreationForm.vue:87 -#: src/components/domains/DomainCreationForm.vue:92 -#: src/components/domains/DomainCreationForm.vue:135 +#: src/views/alarms/Alarms.vue:3 +msgid "Opened alarms" +msgstr "" + +#: src/components/domains/DomainCreationForm.vue:52 +#: src/components/domains/DomainCreationForm.vue:111 +#: src/components/domains/DomainCreationForm.vue:103 +#: src/components/domains/DomainCreationForm.vue:162 msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:66 -#: src/components/parameters/ParametersForm.vue:143 +#: src/components/parameters/ParametersForm.vue:60 +#: src/components/parameters/ParametersForm.vue:137 msgid "Parameters updated" msgstr "" -#: src/components/identities/AccountGeneralForm.vue:103 src/views/Login.vue:13 -#: src/components/identities/AccountGeneralForm.vue:53 +#: src/components/identities/AccountPasswordForm.vue:88 +#: src/components/user/ProfileForm.vue:21 src/views/Login.vue:13 +#: src/components/identities/AccountPasswordForm.vue:42 msgid "Password" msgstr "" -#: src/components/domains/DomainCreationForm.vue:97 +#: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 -#: src/components/identities/AccountGeneralForm.vue:30 -#: src/components/domains/DomainCreationForm.vue:145 +#: src/components/identities/AccountPasswordForm.vue:32 #: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountGeneralForm.vue:114 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/domains/DomainCreationForm.vue:178 msgid "Password copied to clipboard" msgstr "" +#: src/components/user/ProfileForm.vue:42 +#: src/components/user/ProfileForm.vue:112 +msgid "Password updated" +msgstr "" + #: src/components/domains/DNSStatusChip.vue:9 #: src/components/domains/DNSStatusChip.vue:16 msgid "Pending" @@ -831,25 +1090,56 @@ msgstr "" msgid "Period" msgstr "" +#: src/components/identities/AccountSummary.vue:28 +#: src/components/user/ProfileForm.vue:12 +#: src/components/user/ProfileForm.vue:69 +#: src/components/user/ProfileForm.vue:30 +msgid "Phone number" +msgstr "" + +#: src/components/user/TwoFactorAuthForm.vue:20 +#: src/components/user/TwoFactorAuthForm.vue:13 +msgid "Pin code" +msgstr "" + #: src/components/domains/DNSStatusChip.vue:12 #: src/components/domains/DNSStatusChip.vue:19 msgid "Problem" msgstr "" +#: src/views/user/APISetup.vue:47 src/views/user/APISetup.vue:88 +msgid "Proceed" +msgstr "" + +#: src/components/layout/Navbar.vue:100 src/components/layout/Navbar.vue:127 +#: src/views/user/Profile.vue:3 src/components/layout/Navbar.vue:215 +#: src/components/layout/Navbar.vue:242 +msgid "Profile" +msgstr "" + +#: src/components/user/ProfileForm.vue:33 +#: src/components/user/ProfileForm.vue:103 +msgid "Profile updated" +msgstr "" + +#: src/components/tools/ImportForm.vue:7 +msgid "Provide a CSV file where lines respect one of the following formats:" +msgstr "" + #: src/components/logs/MessageList.vue:8 src/components/logs/MessageList.vue:41 msgid "Queue ID" msgstr "" -#: src/components/domains/DomainCreationForm.vue:38 +#: src/components/domains/DomainCreationForm.vue:40 #: src/components/domains/DomainLimitationsForm.vue:3 -#: src/components/domains/DomainList.vue:33 +#: src/components/domains/DomainList.vue:28 #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/domains/DomainCreationForm.vue:86 -#: src/components/domains/DomainList.vue:156 -#: src/components/identities/AccountMailboxForm.vue:3 #: src/components/identities/AccountCreationForm.vue:100 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/domains/DomainList.vue:170 msgid "Quota" msgstr "" @@ -878,52 +1168,91 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:58 #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 -#: src/components/identities/AccountGeneralForm.vue:11 -#: src/components/domains/DomainCreationForm.vue:106 +#: src/components/identities/AccountPasswordForm.vue:9 #: src/components/identities/AccountCreationForm.vue:84 +#: src/components/domains/DomainCreationForm.vue:109 msgid "Random password" msgstr "" +#: src/components/domains/DomainDKIMKey.vue:8 +msgid "Raw format. Click to copy" +msgstr "" + +#: src/components/user/ForwardForm.vue:4 +msgid "Recipient(s)" +msgstr "" + #: src/components/identities/AliasCreationForm.vue:35 #: src/components/identities/AliasCreationForm.vue:37 #: src/components/identities/AliasCreationForm.vue:53 #: src/components/identities/AliasForm.vue:34 +#: src/components/identities/AliasRecipients.vue:3 #: src/components/identities/AliasCreationForm.vue:55 #: src/components/identities/AliasCreationForm.vue:57 #: src/components/identities/AliasCreationForm.vue:73 msgid "Recipients" msgstr "" +#: src/components/user/TwoFactorAuthForm.vue:27 +#: src/components/user/TwoFactorAuthForm.vue:20 +msgid "Register" +msgstr "" + #: src/components/tools/TimeSerieChart.vue:22 msgid "Relative time ranges" msgstr "" +#: src/components/domains/DomainList.vue:26 +#: src/components/domains/DomainList.vue:10 +msgid "Relay" +msgstr "" + #: src/views/Login.vue:17 msgid "Remember me" msgstr "" +#: src/components/identities/AccountSenderAddresses.vue:18 +#: src/components/identities/AccountSenderAddresses.vue:1 +msgid "Remove this address" +msgstr "" + #: src/components/domains/AdministratorList.vue:24 #: src/components/domains/AdministratorList.vue:1 msgid "Remove this administrator" msgstr "" #: src/components/identities/AccountRoleForm.vue:27 -#: src/components/identities/AccountRoleForm.vue:55 +#: src/components/identities/AccountRoleForm.vue:57 msgid "Reseller" msgstr "" +#: src/components/user/TwoFactorAuthForm.vue:60 +#: src/components/user/TwoFactorAuthForm.vue:8 +msgid "Reset recovery codes" +msgstr "" + +#: src/components/domains/DomainForm.vue:111 +#: src/components/identities/AccountForm.vue:83 +msgid "Resources" +msgstr "" + +#: src/components/tools/Resources.vue:3 +msgid "Resources usage" +msgstr "" + #: src/components/identities/AccountCreationForm.vue:21 #: src/components/identities/AccountCreationForm.vue:23 #: src/components/identities/AccountCreationForm.vue:81 #: src/components/identities/AccountForm.vue:7 +#: src/components/identities/AccountSummary.vue:20 #: src/components/identities/AccountCreationForm.vue:71 #: src/components/identities/AccountCreationForm.vue:73 #: src/components/identities/AccountCreationForm.vue:131 msgid "Role" msgstr "" -#: src/components/domains/DomainForm.vue:91 -#: src/components/identities/AccountForm.vue:85 +#: src/components/domains/DomainForm.vue:125 +#: src/components/identities/AccountForm.vue:97 #: src/components/identities/AliasForm.vue:58 msgid "Save" msgstr "" @@ -933,13 +1262,42 @@ msgstr "" msgid "Search" msgstr "" +#: src/components/identities/AccountSummary.vue:24 +#: src/components/user/ProfileForm.vue:77 +#: src/components/user/ProfileForm.vue:37 +msgid "Secondary email" +msgstr "" + +#: src/components/layout/Navbar.vue:106 src/views/user/Security.vue:3 +#: src/components/layout/Navbar.vue:221 +msgid "Security" +msgstr "" + #: src/components/domains/AdministratorList.vue:12 #: src/components/domains/AdministratorList.vue:2 msgid "Select an account" msgstr "" -#: src/components/domains/DomainList.vue:32 -#: src/components/domains/DomainList.vue:155 +#: src/components/tools/ImportForm.vue:14 +msgid "Select file" +msgstr "" + +#: src/components/identities/AccountSenderAddresses.vue:38 +#: src/components/identities/AccountSenderAddresses.vue:89 +msgid "Sender address added" +msgstr "" + +#: src/components/identities/AccountSenderAddresses.vue:44 +#: src/components/identities/AccountSenderAddresses.vue:95 +msgid "Sender address deleted" +msgstr "" + +#: src/components/identities/AccountSenderAddresses.vue:3 +msgid "Sender addresses" +msgstr "" + +#: src/components/domains/DomainList.vue:27 +#: src/components/domains/DomainList.vue:169 msgid "Sending limit" msgstr "" @@ -947,29 +1305,47 @@ msgstr "" msgid "Sending limit:" msgstr "" -#: src/components/layout/Navbar.vue:69 src/components/layout/Navbar.vue:181 +#: src/components/tools/ImportForm.vue:17 +msgid "Separator" +msgstr "" + +#: src/components/domains/DomainCreationForm.vue:79 +#: src/components/domains/DomainTransportForm.vue:3 +#: src/components/domains/DomainCreationForm.vue:130 +msgid "Service" +msgstr "" + +#: src/components/domains/DomainForm.vue:96 +msgid "Service:" +msgstr "" + +#: src/components/layout/Navbar.vue:86 src/components/layout/Navbar.vue:201 msgid "Settings" msgstr "" -#: src/components/parameters/ParametersForm.vue:19 -#: src/components/parameters/ParametersForm.vue:96 -msgid "Settings: " +#: src/components/parameters/ParametersForm.vue:20 +msgid "Settings: thislabel" msgstr "" -#: src/components/domains/DNSDetail.vue:66 +#: src/components/domains/DNSDetail.vue:70 msgid "Show key" msgstr "" #: src/components/identities/AccountRoleForm.vue:32 -#: src/components/identities/AccountRoleForm.vue:60 +#: src/components/identities/AccountRoleForm.vue:62 msgid "Simple user" msgstr "" -#: src/components/domains/DNSDetail.vue:38 +#: src/components/identities/AccountSenderAddresses.vue:9 +#: src/components/identities/AccountSenderAddresses.vue:2 +msgid "Specify an email address" +msgstr "" + +#: src/components/domains/DNSDetail.vue:42 msgid "SPF record found" msgstr "" -#: src/components/domains/DNSDetail.vue:41 +#: src/components/domains/DNSDetail.vue:45 msgid "SPF record not found" msgstr "" @@ -989,15 +1365,36 @@ msgid "Summary" msgstr "" #: src/components/identities/AccountRoleForm.vue:37 -#: src/components/identities/AccountRoleForm.vue:65 +#: src/components/identities/AccountRoleForm.vue:67 msgid "Super administrator" msgstr "" #: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:85 +#: src/components/identities/IdentityList.vue:97 msgid "Tags" msgstr "" +#: src/components/tools/ImportForm.vue:9 +msgid "The first element of each line is mandatory and must be equal to one of the previous values." +msgstr "" + +#: src/components/user/TwoFactorAuthForm.vue:39 +#: src/components/user/TwoFactorAuthForm.vue:7 +msgid "" +"The following recovery codes can be used one time each to\n" +" let you regain access to your account, in case you lose your\n" +" phone for example. Make sure to save them in a safe place,\n" +" otherwise you won't be able to access your account anymore." +msgstr "" + +#: src/components/user/RecoveryCodesResetDialog.vue:7 +msgid "" +"The following recovery codes can be used one time each to let\n" +" you regain access to your account, in case you lose your phone\n" +" for example. Make sure to save them in a safe place, otherwise\n" +" you won't be able to access your account anymore." +msgstr "" + #: src/views/Dashboard.vue:6 msgid "This page is still under construction." msgstr "" @@ -1008,13 +1405,30 @@ msgstr "" msgid "To" msgstr "" -#: src/views/TwoFA.vue:9 +#: src/components/domains/DomainCreationForm.vue:77 +#: src/components/domains/DomainCreationForm.vue:117 +#: src/components/domains/DomainForm.vue:89 +#: src/components/domains/DomainCreationForm.vue:128 +#: src/components/domains/DomainCreationForm.vue:168 +msgid "Transport" +msgstr "" + +#: src/components/user/TwoFactorAuthForm.vue:4 +msgid "Two factor authentication" +msgstr "" + +#: src/components/user/TwoFactorAuthForm.vue:64 +#: src/components/user/TwoFactorAuthForm.vue:1 +msgid "Two-Factor Authentication (2FA) is not yet activated for your account. Enabling this feature will increase your account's security." +msgstr "" + +#: src/views/TwoFA.vue:11 msgid "Two-factor authentication code" msgstr "" -#: src/components/domains/DomainCreationForm.vue:24 +#: src/components/domains/DomainCreationForm.vue:26 #: src/components/domains/DomainGeneralForm.vue:6 -#: src/components/domains/DomainCreationForm.vue:72 +#: src/components/domains/DomainCreationForm.vue:77 msgid "Type" msgstr "" @@ -1027,32 +1441,42 @@ msgstr "" msgid "Unknown" msgstr "" -#: src/components/identities/AccountMailboxForm.vue:23 -#: src/components/identities/AccountMailboxForm.vue:59 +#: src/components/identities/AccountMailboxForm.vue:30 +#: src/components/identities/AccountMailboxForm.vue:69 msgid "unlimited" msgstr "" #: src/components/domains/DomainAliasForm.vue:17 -#: src/components/domains/DomainAliasForm.vue:90 +#: src/components/user/APIAccessForm.vue:8 +#: src/components/user/ForwardForm.vue:10 +#: src/components/domains/DomainAliasForm.vue:86 msgid "Update" msgstr "" -#: src/components/domains/DNSDetail.vue:15 -#: src/components/domains/DNSDetail.vue:133 +#: src/components/user/ProfileForm.vue:25 +msgid "Update Password" +msgstr "" + +#: src/components/user/ProfileForm.vue:16 +msgid "Update settings" +msgstr "" + +#: src/components/domains/DNSDetail.vue:20 +#: src/components/domains/DNSDetail.vue:156 msgid "Updated" msgstr "" -#: src/components/identities/AccountMailboxForm.vue:20 -#: src/components/identities/AccountMailboxForm.vue:56 +#: src/components/identities/AccountMailboxForm.vue:27 +#: src/components/identities/AccountMailboxForm.vue:66 msgid "Use domain default value" msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 -#: src/components/identities/AccountGeneralForm.vue:29 src/views/Login.vue:9 -#: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 #: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:8 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/domains/AdministratorList.vue:86 msgid "Username" msgstr "" @@ -1069,23 +1493,25 @@ msgstr "" msgid "Verification" msgstr "" -#: src/views/TwoFA.vue:15 +#: src/views/TwoFA.vue:19 msgid "Verify code" msgstr "" -#: src/components/domains/DomainList.vue:59 +#: src/components/domains/DNSDetail.vue:29 +#: src/components/domains/DomainList.vue:54 #: src/components/identities/IdentityList.vue:30 #: src/components/identities/IdentityList.vue:51 -#: src/components/tools/CreationForm.vue:25 -#: src/components/domains/DomainList.vue:182 +#: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 #: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:97 -#: src/components/identities/IdentityList.vue:118 +#: src/components/identities/IdentityList.vue:109 +#: src/components/identities/IdentityList.vue:130 +#: src/components/domains/DNSDetail.vue:165 +#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" -#: src/components/tools/TimeSerieChart.vue:58 -#: src/components/tools/TimeSerieChart.vue:116 +#: src/components/tools/TimeSerieChart.vue:52 +#: src/components/tools/TimeSerieChart.vue:110 msgid "Week" msgstr "" @@ -1098,26 +1524,44 @@ msgid "With a mailbox" msgstr "" #: src/components/domains/DomainCreationForm.vue:63 -#: src/components/domains/DomainCreationForm.vue:111 +#: src/components/domains/DomainCreationForm.vue:114 msgid "With mailbox" msgstr "" -#: src/components/tools/TimeSerieChart.vue:60 -#: src/components/tools/TimeSerieChart.vue:118 +#: src/components/tools/TimeSerieChart.vue:54 +#: src/components/tools/TimeSerieChart.vue:112 msgid "Year" msgstr "" -#: src/components/domains/DomainList.vue:67 +#: src/components/domains/DNSDetail.vue:36 +#: src/components/domains/DomainList.vue:62 #: src/components/identities/IdentityList.vue:38 #: src/components/identities/IdentityList.vue:59 #: src/components/tools/CreationForm.vue:29 -#: src/components/domains/DomainList.vue:190 #: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:105 -#: src/components/identities/IdentityList.vue:126 +#: src/components/identities/IdentityList.vue:117 +#: src/components/identities/IdentityList.vue:138 +#: src/components/domains/DNSDetail.vue:172 +#: src/components/domains/DomainList.vue:204 msgid "Yes" msgstr "" +#: src/views/user/APISetup.vue:41 src/views/user/APISetup.vue:83 +msgid "You are about to delete your API access token" +msgstr "" + +#: src/components/tools/ImportForm.vue:10 +msgid "You can use a different character as separator." +msgstr "" + +#: src/views/user/APISetup.vue:8 +msgid "Your API token has not been generated yet." +msgstr "" + +#: src/views/user/APISetup.vue:18 +msgid "Your API token is:" +msgstr "" + #: src/filters/index.js:7 msgid "yes" msgstr "" @@ -1126,10 +1570,22 @@ msgstr "" msgid "no" msgstr "" -#: src/plugins/vee-validate.js:11 +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + +#: src/plugins/vee-validate.js:12 +msgid "Passwords mismatch" +msgstr "" + +#: src/plugins/vee-validate.js:16 msgid "This field must be a valid number" msgstr "" -#: src/plugins/vee-validate.js:15 +#: src/plugins/vee-validate.js:20 msgid "This field is required" msgstr "" + +#: src/plugins/vee-validate.js:33 +msgid "Invalid password" +msgstr "" diff --git a/frontend/locale/fr/LC_MESSAGES/app.po b/frontend/locale/fr/LC_MESSAGES/app.po index 4e62fdc7f..1467c61e3 100644 --- a/frontend/locale/fr/LC_MESSAGES/app.po +++ b/frontend/locale/fr/LC_MESSAGES/app.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa 0.1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-06 16:14+0200\n" +"POT-Creation-Date: 2022-09-30 17:47+0200\n" "PO-Revision-Date: 2021-07-01 16:15+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -17,23 +17,32 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: src/components/domains/DomainList.vue:25 -#: src/components/domains/DomainList.vue:9 +#: src/components/domains/DomainList.vue:28 +#: src/components/domains/DomainList.vue:12 msgid "(disabled)" msgstr "(désactivé)" +#: src/views/user/APISetup.vue:29 +msgid "A documentation of the API is available" +msgstr "" + +#: src/components/domains/DNSDetail.vue:47 +#: src/components/domains/DNSDetail.vue:183 +msgid "A new key will be generated soon. Refresh the page in a moment to see it." +msgstr "" + #: src/components/identities/AccountRoleForm.vue:39 -#: src/components/identities/AccountRoleForm.vue:67 +#: src/components/identities/AccountRoleForm.vue:69 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 "" #: src/components/identities/AccountRoleForm.vue:34 -#: src/components/identities/AccountRoleForm.vue:62 +#: src/components/identities/AccountRoleForm.vue:64 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 "" #: src/components/identities/AccountRoleForm.vue:24 -#: src/components/identities/AccountRoleForm.vue:52 +#: src/components/identities/AccountRoleForm.vue:54 msgid "A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox." msgstr "" @@ -41,39 +50,41 @@ msgstr "" msgid "Absolute time range" msgstr "" -#: src/views/identities/Identities.vue:20 +#: src/views/identities/Account.vue:3 src/views/identities/Identities.vue:20 msgid "Account" msgstr "Compte" -#: src/components/identities/AccountCreationForm.vue:127 -#: src/components/identities/AccountCreationForm.vue:177 +#: src/components/identities/AccountCreationForm.vue:131 +#: src/components/identities/AccountCreationForm.vue:181 msgid "Account created" msgstr "Compte créé" #: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:134 +#: src/components/identities/IdentityList.vue:146 msgid "Account deleted" msgstr "" -#: src/components/identities/AccountForm.vue:49 -#: src/components/identities/AccountForm.vue:162 +#: src/components/identities/AccountForm.vue:65 +#: src/components/identities/AccountForm.vue:192 msgid "Account updated" msgstr "Compte mis à jour" -#: src/components/domains/DomainList.vue:34 +#: src/components/domains/DomainList.vue:29 +#: src/components/identities/IdentityList.vue:6 +#: src/components/identities/IdentityList.vue:2 #: src/components/identities/IdentityList.vue:19 -#: src/components/domains/DomainList.vue:157 -#: src/components/identities/IdentityList.vue:86 +#: src/components/identities/IdentityList.vue:98 +#: src/components/domains/DomainList.vue:171 msgid "Actions" msgstr "Actions" #: src/components/domains/DomainAliasForm.vue:17 -#: src/components/domains/DomainAliasForm.vue:90 +#: src/components/domains/DomainAliasForm.vue:86 msgid "Add" msgstr "Ajouter" #: src/components/domains/DomainAliasForm.vue:20 -#: src/components/domains/DomainAliasForm.vue:93 +#: src/components/domains/DomainAliasForm.vue:89 msgid "Add a new domain alias" msgstr "" @@ -81,10 +92,17 @@ msgstr "" msgid "Add administrator" msgstr "" -#: src/components/domains/DNSDetail.vue:14 +#: src/components/identities/AccountSenderAddresses.vue:24 +#, fuzzy +msgid "Add sender address" +msgstr "Adresse aléatoire" + +#: src/components/domains/DNSDetail.vue:19 +#: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 -#: src/components/domains/DNSDetail.vue:132 #: src/components/identities/AliasCreationForm.vue:40 +#: src/components/identities/AccountSenderAddresses.vue:63 +#: src/components/domains/DNSDetail.vue:155 msgid "Address" msgstr "Adresse" @@ -92,9 +110,9 @@ msgstr "Adresse" msgid "Address:" msgstr "" -#: src/components/parameters/ParametersForm.vue:23 -#: src/components/parameters/ParametersForm.vue:100 -msgid "Administration" +#: src/components/identities/DomainAdminDomains.vue:3 +#, fuzzy +msgid "Administered domains" msgstr "Administration" #: src/components/domains/AdministratorList.vue:53 @@ -103,7 +121,7 @@ msgid "Administrator added" msgstr "" #: src/components/domains/DomainCreationForm.vue:55 -#: src/components/domains/DomainCreationForm.vue:103 +#: src/components/domains/DomainCreationForm.vue:106 msgid "Administrator name" msgstr "" @@ -113,8 +131,8 @@ msgid "Administrator removed" msgstr "" #: src/components/domains/AdministratorList.vue:5 -#: src/components/domains/DomainList.vue:24 -#: src/components/domains/DomainList.vue:147 +#: src/components/domains/DomainList.vue:113 +#: src/components/domains/DomainList.vue:255 msgid "Administrators" msgstr "Administrateurs" @@ -122,7 +140,14 @@ msgstr "Administrateurs" msgid "Administrators of {{ domain.name }}" msgstr "" -#: src/views/domains/Domains.vue:23 src/views/identities/Identities.vue:23 +#: src/components/domains/DomainList.vue:119 +#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/domains/DomainList.vue:261 +msgid "Alarms" +msgstr "" + +#: src/views/domains/Domains.vue:23 src/views/identities/Alias.vue:3 +#: src/views/identities/Identities.vue:23 msgid "Alias" msgstr "Alias" @@ -132,7 +157,7 @@ msgid "Alias created" msgstr "Alias créé" #: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:124 msgid "Alias deleted" msgstr "" @@ -146,63 +171,96 @@ msgstr "" msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" -#: src/components/domains/DomainList.vue:30 +#: src/components/domains/DomainList.vue:25 #: src/components/domains/DomainSummary.vue:31 +#: src/components/identities/AccountAliases.vue:3 #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 -#: src/components/domains/DomainList.vue:153 #: src/components/identities/AccountCreationForm.vue:112 #: src/components/identities/AccountCreationForm.vue:115 #: src/components/identities/AccountCreationForm.vue:143 +#: src/components/domains/DomainList.vue:167 msgid "Aliases" msgstr "Alias" +#: src/components/layout/Navbar.vue:93 src/components/layout/Navbar.vue:208 +msgid "API" +msgstr "" + +#: src/views/user/APISetup.vue:3 +msgid "API access" +msgstr "" + +#: src/views/user/APISetup.vue:24 src/views/user/APISetup.vue:65 +msgid "API token copied to your clipboard" +msgstr "" + +#: src/views/user/APISetup.vue:33 src/views/user/APISetup.vue:74 +#, fuzzy +msgid "API token created" +msgstr "Compte créé" + +#: src/views/user/APISetup.vue:55 src/views/user/APISetup.vue:96 +msgid "API token deleted" +msgstr "" + #: src/components/tools/TimeSerieChart.vue:19 msgid "Apply" msgstr "Appliquer" -#: src/components/layout/Navbar.vue:56 src/views/logs/AuditTrail.vue:3 -#: src/components/layout/Navbar.vue:168 +#: src/components/layout/Navbar.vue:73 src/views/logs/AuditTrail.vue:3 +#: src/components/layout/Navbar.vue:188 msgid "Audit trail" msgstr "" -#: src/components/domains/DNSDetail.vue:34 +#: src/components/domains/DNSDetail.vue:38 msgid "Authentication" msgstr "Authentification" #: src/components/domains/DNSDetail.vue:15 +#: src/components/domains/DomainDNSConfig.vue:31 msgid "Auto configuration" msgstr "Configuration automatique" -#: src/components/domains/DNSDetail.vue:22 +#: src/components/domains/DNSDetail.vue:24 msgid "autoconfig record (Mozilla) not found" msgstr "" #: src/components/domains/DNSDetail.vue:19 -msgid "autoconfig record (Mozilla): {{ detail.autoconfig_record.value }}" +msgid "autoconfig record (Mozilla): %{ value }" msgstr "" -#: src/components/domains/DNSDetail.vue:30 +#: src/components/domains/DNSDetail.vue:34 msgid "autodiscover record (Microsoft) not found" msgstr "" -#: src/components/domains/DNSDetail.vue:27 -msgid "autodiscover record (Microsoft): {{ detail.autodiscover_record.value }}" +#: src/components/domains/DNSDetail.vue:29 +msgid "autodiscover record (Microsoft): %{ value }" msgstr "" #: src/components/tools/CreationForm.vue:24 msgid "Back" msgstr "" -#: src/components/domains/DomainForm.vue:88 -#: src/components/identities/AccountForm.vue:82 +#: src/components/domains/DomainDKIMKey.vue:14 +msgid "Bind/named format. Click to copy" +msgstr "" + +#: src/components/domains/DomainForm.vue:122 +#: src/components/identities/AccountForm.vue:94 #: src/components/identities/AliasForm.vue:55 -#: src/components/layout/ConfirmDialog.vue:14 +#: src/components/layout/ConfirmDialog.vue:14 src/views/user/APISetup.vue:46 +#: src/components/layout/ConfirmDialog.vue:53 src/views/user/APISetup.vue:87 msgid "Cancel" msgstr "" +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 +msgid "Check this option if passwords contained in your file are not crypted" +msgstr "" + #: src/components/domains/DomainAliasForm.vue:56 +#: src/components/domains/DomainAliasForm.vue:26 msgid "Choose a domain" msgstr "" @@ -212,7 +270,10 @@ msgstr "" #: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 -#: src/components/domains/DomainDNSConfig.vue:36 +#: src/components/domains/DomainDKIMKey.vue:22 +#: src/components/domains/DomainDNSConfig.vue:40 +#: src/components/tools/ImportForm.vue:26 +#: src/components/user/RecoveryCodesResetDialog.vue:23 msgid "Close" msgstr "Fermer" @@ -220,32 +281,46 @@ msgstr "Fermer" msgid "Confirm and create" msgstr "" -#: src/components/identities/AccountGeneralForm.vue:122 +#: src/components/identities/AccountPasswordForm.vue:108 +#: src/components/identities/AccountPasswordForm.vue:58 msgid "Confirmation" msgstr "Confirmation" +#: src/components/user/TwoFactorAuthForm.vue:34 +#: src/components/user/TwoFactorAuthForm.vue:2 +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." +msgstr "" + #: src/views/Login.vue:21 msgid "Connect" msgstr "" +#: src/components/tools/ImportForm.vue:19 +msgid "Continue on error" +msgstr "" + #: src/components/domains/DomainGeneralForm.vue:8 msgid "Control if this domain will be allowed to send and receive messages" msgstr "" -#: src/components/domains/DomainCreationForm.vue:24 +#: src/components/domains/DomainCreationForm.vue:27 #: src/components/domains/DomainCreationForm.vue:10 #: src/components/domains/DomainCreationForm.vue:9 #: src/components/identities/AccountCreationForm.vue:26 #: src/components/identities/AccountCreationForm.vue:12 #: src/components/identities/AccountCreationForm.vue:11 -#: src/components/identities/AccountGeneralForm.vue:15 -#: src/components/identities/AccountGeneralForm.vue:3 +#: src/components/identities/AccountPasswordForm.vue:13 +#: src/components/identities/AccountPasswordForm.vue:3 msgid "Copy to clipboard" msgstr "" -#: src/components/domains/DomainCreationForm.vue:46 +#: src/views/user/APISetup.vue:20 +msgid "Copy token to clipboard" +msgstr "" + +#: src/components/domains/DomainCreationForm.vue:54 #: src/components/domains/DomainOptionsForm.vue:2 -#: src/components/domains/DomainCreationForm.vue:94 +#: src/components/domains/DomainCreationForm.vue:105 msgid "Create a domain administrator" msgstr "Créer un administrateur de domaine" @@ -255,7 +330,7 @@ msgstr "Créer une boite aux lettres pour l'administrateur" #: src/components/domains/DomainCreationForm.vue:68 #: src/components/domains/DomainOptionsForm.vue:8 -#: src/components/domains/DomainCreationForm.vue:116 +#: src/components/domains/DomainCreationForm.vue:119 msgid "Create aliases" msgstr "Créer des alias" @@ -264,10 +339,24 @@ msgid "Create standard aliases for the domain." msgstr "" #: src/components/domains/DomainSummary.vue:7 +#: src/components/identities/AccountSummary.vue:7 +#: src/components/identities/AliasSummary.vue:7 msgid "Creation date" msgstr "Date de création" -#: src/components/identities/AccountMailboxForm.vue:41 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 +#, fuzzy +msgid "Crypt passwords" +msgstr "Mot de passe oublié ?" + +#: src/components/identities/AccountPasswordForm.vue:29 +#: src/components/identities/AccountPasswordForm.vue:11 +#, fuzzy +msgid "Current password" +msgstr "Mot de passe oublié ?" + +#: src/components/identities/AccountMailboxForm.vue:43 +#: src/components/identities/AccountMailboxForm.vue:26 msgid "Daily message sending limit" msgstr "" @@ -275,26 +364,27 @@ msgstr "" msgid "Daily sending limit" msgstr "" -#: src/components/layout/Navbar.vue:33 src/components/layout/Navbar.vue:145 +#: src/components/layout/Navbar.vue:45 src/components/layout/Navbar.vue:160 msgid "Dashboard" msgstr "Tableau de bord" +#: src/components/alarms/AlarmList.vue:8 #: src/components/logs/AuditTrailList.vue:8 -#: src/components/logs/MessageList.vue:9 +#: src/components/logs/MessageList.vue:9 src/components/alarms/AlarmList.vue:48 #: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:42 msgid "Date" msgstr "Date" -#: src/components/tools/TimeSerieChart.vue:57 -#: src/components/tools/TimeSerieChart.vue:115 +#: src/components/tools/TimeSerieChart.vue:51 +#: src/components/tools/TimeSerieChart.vue:109 msgid "Day" msgstr "Jour" -#: src/components/domains/DomainCreationForm.vue:39 +#: src/components/domains/DomainCreationForm.vue:41 #: src/components/domains/DomainLimitationsForm.vue:6 #: src/components/domains/DomainSummary.vue:19 -#: src/components/domains/DomainCreationForm.vue:87 +#: src/components/domains/DomainCreationForm.vue:92 msgid "Default mailbox quota" msgstr "Quota par défaut pour une boîte aux lettres" @@ -303,48 +393,68 @@ msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) msgstr "Quota par défaut appliqué aux boîtes aux lettres. Peut être exprimé en Ko, Mo (défaut) ou Go. Une valeur à 0 signifie pas de quota." #: src/components/domains/DomainAliasForm.vue:24 -#: src/components/domains/DomainList.vue:26 +#: src/components/domains/DomainList.vue:115 #: src/components/identities/IdentityList.vue:89 #: src/components/identities/IdentityList.vue:92 -#: src/components/domains/DomainList.vue:149 -#: src/components/identities/IdentityList.vue:156 -#: src/components/identities/IdentityList.vue:159 +#: src/components/identities/IdentityList.vue:168 +#: src/components/identities/IdentityList.vue:171 +#: src/components/domains/DomainList.vue:257 msgid "Delete" msgstr "" +#: src/views/user/APISetup.vue:23 +msgid "Delete token" +msgstr "" + #: src/components/identities/AliasCreationForm.vue:31 -#: src/components/identities/AliasGeneralForm.vue:82 -#: src/components/identities/AliasGeneralForm.vue:51 +#: src/components/identities/AliasGeneralForm.vue:87 +#: src/components/identities/AliasSummary.vue:19 #: src/components/identities/AliasCreationForm.vue:51 +#: src/components/identities/AliasGeneralForm.vue:56 msgid "Description" msgstr "Description" +#: src/components/user/TwoFactorAuthForm.vue:57 +#: src/components/user/TwoFactorAuthForm.vue:5 +#, fuzzy +msgid "Disable 2FA" +msgstr "Désactivés" + #: src/components/domains/DNSStatusChip.vue:6 #: src/components/domains/DNSStatusChip.vue:13 msgid "Disabled" msgstr "Désactivés" -#: src/components/domains/DNSDetail.vue:62 +#: src/components/domains/DNSDetail.vue:66 msgid "DKIM key" msgstr "Clé DKIM" -#: src/components/domains/DomainCreationForm.vue:52 +#: src/components/domains/DomainCreationForm.vue:48 #: src/components/domains/DomainDNSForm.vue:5 -#: src/components/domains/DomainCreationForm.vue:100 +#: src/components/domains/DomainCreationForm.vue:99 msgid "DKIM key length" msgstr "" -#: src/components/domains/DomainCreationForm.vue:51 +#: src/components/domains/DomainCreationForm.vue:47 #: src/components/domains/DomainDNSForm.vue:4 -#: src/components/domains/DomainCreationForm.vue:99 +#: src/components/domains/DomainCreationForm.vue:98 msgid "DKIM key selector" msgstr "" -#: src/components/domains/DNSDetail.vue:46 +#: src/components/domains/DNSDetail.vue:30 +#: src/components/domains/DNSDetail.vue:167 +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" +msgstr "" + +#: src/components/domains/DomainDKIMKey.vue:4 +msgid "DKIM public key for" +msgstr "" + +#: src/components/domains/DNSDetail.vue:50 msgid "DKIM record found" msgstr "" -#: src/components/domains/DNSDetail.vue:49 +#: src/components/domains/DNSDetail.vue:53 msgid "DKIM record not found" msgstr "" @@ -352,19 +462,21 @@ msgstr "" msgid "DKIM signing" msgstr "" -#: src/components/domains/DNSDetail.vue:54 +#: src/components/domains/DNSDetail.vue:58 msgid "DMARC record found" msgstr "" -#: src/components/domains/DNSDetail.vue:57 +#: src/components/domains/DNSDetail.vue:61 msgid "DMARC record not found" msgstr "" -#: src/components/domains/DomainCreationForm.vue:29 -#: src/components/domains/DomainCreationForm.vue:85 +#: src/components/domains/DomainCreationForm.vue:31 +#: src/components/domains/DomainCreationForm.vue:109 +#: src/components/domains/DomainCreationForm.vue:115 #: src/components/domains/DomainForm.vue:32 -#: src/components/domains/DomainCreationForm.vue:77 -#: src/components/domains/DomainCreationForm.vue:133 +#: src/components/domains/DomainCreationForm.vue:82 +#: src/components/domains/DomainCreationForm.vue:160 +#: src/components/domains/DomainCreationForm.vue:166 msgid "DNS" msgstr "DNS" @@ -380,51 +492,54 @@ msgstr "" msgid "DNS configuration help" msgstr "" -#: src/components/domains/DomainList.vue:31 -#: src/components/domains/DomainList.vue:154 +#: src/components/domains/DomainList.vue:26 +#: src/components/domains/DomainList.vue:168 msgid "DNS status" msgstr "Statut DNS" -#: src/components/identities/IdentityList.vue:37 +#: src/components/identities/IdentityList.vue:49 msgid "Do not delete account folder" msgstr "" -#: src/components/domains/DomainList.vue:69 +#: src/components/domains/DomainList.vue:77 msgid "Do not delete domain folder" msgstr "" #: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:99 +#: src/components/identities/IdentityList.vue:111 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" -#: src/components/identities/AliasGeneralForm.vue:54 +#: src/components/alarms/AlarmList.vue:9 +#: src/components/identities/AliasGeneralForm.vue:56 #: src/views/domains/Domain.vue:3 src/views/domains/Domains.vue:20 +#: src/components/identities/AliasGeneralForm.vue:31 +#: src/components/alarms/AlarmList.vue:49 msgid "Domain" msgstr "Domaine" #: src/components/identities/AccountRoleForm.vue:22 -#: src/components/identities/AccountRoleForm.vue:50 +#: src/components/identities/AccountRoleForm.vue:52 msgid "Domain administrator" msgstr "Administrateur de domaine" #: src/components/domains/DomainAliasForm.vue:51 -#: src/components/domains/DomainAliasForm.vue:124 +#: src/components/domains/DomainAliasForm.vue:120 msgid "Domain alias created" msgstr "" #: src/components/domains/DomainAliasForm.vue:40 -#: src/components/domains/DomainAliasForm.vue:113 +#: src/components/domains/DomainAliasForm.vue:109 msgid "Domain alias deleted" msgstr "" #: src/components/domains/DomainAliasForm.vue:59 -#: src/components/domains/DomainAliasForm.vue:132 +#: src/components/domains/DomainAliasForm.vue:128 msgid "Domain alias updated" msgstr "" -#: src/components/domains/DomainCreationForm.vue:138 -#: src/components/domains/DomainCreationForm.vue:186 +#: src/components/domains/DomainCreationForm.vue:174 +#: src/components/domains/DomainCreationForm.vue:225 msgid "Domain created" msgstr "Domaine créé" @@ -433,8 +548,8 @@ msgstr "Domaine créé" msgid "Domain default value" msgstr "" -#: src/components/domains/DomainList.vue:75 -#: src/components/domains/DomainList.vue:198 +#: src/components/domains/DomainList.vue:70 +#: src/components/domains/DomainList.vue:212 msgid "Domain deleted" msgstr "" @@ -442,8 +557,8 @@ msgstr "" msgid "Domain name (ex: domain.tld)" msgstr "" -#: src/components/domains/DomainForm.vue:28 -#: src/components/domains/DomainForm.vue:147 +#: src/components/domains/DomainForm.vue:53 +#: src/components/domains/DomainForm.vue:215 msgid "Domain updated" msgstr "" @@ -452,17 +567,21 @@ msgstr "" msgid "domain's default value" msgstr "" -#: src/components/layout/Navbar.vue:39 src/views/domains/Domains.vue:3 -#: src/components/layout/Navbar.vue:151 +#: src/components/layout/Navbar.vue:51 src/views/domains/Domains.vue:3 +#: src/components/layout/Navbar.vue:166 msgid "Domains" msgstr "Domaines" -#: src/components/domains/DomainList.vue:25 +#: src/components/tools/ImportForm.vue:19 +msgid "Don't treat duplicated objects as errors" +msgstr "" + +#: src/components/domains/DomainList.vue:114 #: src/components/identities/IdentityList.vue:88 #: src/components/identities/IdentityList.vue:91 -#: src/components/domains/DomainList.vue:148 -#: src/components/identities/IdentityList.vue:155 -#: src/components/identities/IdentityList.vue:158 +#: src/components/identities/IdentityList.vue:167 +#: src/components/identities/IdentityList.vue:170 +#: src/components/domains/DomainList.vue:256 msgid "Edit" msgstr "" @@ -479,7 +598,7 @@ msgid "Edit domain" msgstr "" #: src/components/domains/DomainAliasForm.vue:20 -#: src/components/domains/DomainAliasForm.vue:93 +#: src/components/domains/DomainAliasForm.vue:89 msgid "Edit domain alias" msgstr "" @@ -488,49 +607,66 @@ msgstr "" msgid "Email" msgstr "" -#: src/components/identities/AliasGeneralForm.vue:34 +#: src/components/identities/AliasGeneralForm.vue:35 +#: src/components/identities/AliasGeneralForm.vue:15 msgid "Email address" msgstr "Adresse email" #: src/components/tools/CreationSummary.vue:5 +#: src/components/tools/CreationSummary.vue:32 msgid "Empty" msgstr "" -#: src/components/domains/DomainCreationForm.vue:32 +#: src/components/user/TwoFactorAuthForm.vue:68 +#: src/components/user/TwoFactorAuthForm.vue:5 +#, fuzzy +msgid "Enable 2FA" +msgstr "Activé" + +#: src/components/user/APIAccessForm.vue:4 +#, fuzzy +msgid "Enable API access" +msgstr "Activer les tests DNS" + +#: src/components/domains/DomainCreationForm.vue:34 #: src/components/domains/DomainDNSForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:80 +#: src/components/domains/DomainCreationForm.vue:85 msgid "Enable DKIM signing" msgstr "Activer la signature DKIM" -#: src/components/domains/DomainCreationForm.vue:31 +#: src/components/domains/DomainCreationForm.vue:33 #: src/components/domains/DomainDNSForm.vue:2 -#: src/components/domains/DomainCreationForm.vue:79 +#: src/components/domains/DomainCreationForm.vue:84 msgid "Enable DNS checks" msgstr "Activer les tests DNS" -#: src/components/domains/DomainCreationForm.vue:25 +#: src/components/user/APIAccessForm.vue:4 +msgid "Enable to generate an API access token you will use with your requests" +msgstr "" + +#: src/components/domains/DomainCreationForm.vue:27 #: src/components/domains/DomainGeneralForm.vue:8 #: src/components/identities/AccountCreationForm.vue:39 #: src/components/identities/AccountForm.vue:39 -#: src/components/identities/AccountGeneralForm.vue:29 +#: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/domains/DomainCreationForm.vue:73 #: src/components/identities/AccountCreationForm.vue:89 +#: src/components/domains/DomainCreationForm.vue:78 msgid "Enabled" msgstr "Activé" -#: src/components/identities/AccountGeneralForm.vue:21 -#: src/components/identities/AccountGeneralForm.vue:105 +#: src/components/identities/AccountGeneralForm.vue:20 +#: src/components/identities/AccountGeneralForm.vue:70 msgid "Enter a simple username or an email address" msgstr "" -#: src/components/identities/AccountGeneralForm.vue:19 -#: src/components/identities/AccountGeneralForm.vue:103 +#: src/components/identities/AccountGeneralForm.vue:18 +#: src/components/identities/AccountGeneralForm.vue:68 msgid "Enter an email address" msgstr "" -#: src/views/TwoFA.vue:10 +#: src/views/TwoFA.vue:12 msgid "Enter the code from the two-factor app on your mobile device. If you have lost your device, you may enter one of your recovery codes." msgstr "" @@ -539,14 +675,27 @@ msgid "Ex: 10MB. Leave empty for no limit" msgstr "" #: src/components/identities/AliasCreationForm.vue:26 -#: src/components/identities/AliasGeneralForm.vue:75 +#: src/components/identities/AliasGeneralForm.vue:79 +#: src/components/identities/AliasSummary.vue:15 #: src/components/identities/AliasCreationForm.vue:46 +#: src/components/identities/AliasGeneralForm.vue:49 msgid "Expire at" msgstr "Expire le" +#: src/views/identities/Identities.vue:8 +msgid "Export accounts and aliases to CSV" +msgstr "" + +#: src/views/domains/Domains.vue:8 +msgid "Export domains and aliases to CSV" +msgstr "" + #: src/components/identities/AccountCreationForm.vue:30 -#: src/components/identities/AccountGeneralForm.vue:43 +#: src/components/identities/AccountGeneralForm.vue:32 +#: src/components/user/ProfileForm.vue:45 #: src/components/identities/AccountCreationForm.vue:80 +#: src/components/identities/AccountGeneralForm.vue:17 +#: src/components/user/ProfileForm.vue:9 msgid "First name" msgstr "" @@ -554,47 +703,88 @@ msgstr "" msgid "Forgot password?" msgstr "Mot de passe oublié ?" +#: src/components/layout/Navbar.vue:117 src/views/user/Forward.vue:3 +#: src/components/layout/Navbar.vue:232 +msgid "Forward" +msgstr "" + +#: src/components/user/ForwardForm.vue:6 +msgid "Forward messages and store copies into your local mailbox" +msgstr "" + +#: src/components/user/APIAccessForm.vue:19 +#: src/components/user/ForwardForm.vue:19 +#: src/components/user/APIAccessForm.vue:44 +#: src/components/user/ForwardForm.vue:52 +#, fuzzy +msgid "Forward updated" +msgstr "Compte mis à jour" + #: src/components/logs/MessageList.vue:12 #: src/components/tools/TimeSerieChart.vue:17 #: src/components/logs/MessageList.vue:45 msgid "From" msgstr "De" +#: src/components/identities/AccountSummary.vue:16 +msgid "Full name" +msgstr "" + #: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:84 +#: src/components/identities/IdentityList.vue:96 msgid "Fullname/recipient" msgstr "" -#: src/components/domains/DomainCreationForm.vue:21 -#: src/components/domains/DomainCreationForm.vue:84 +#: src/components/domains/DomainCreationForm.vue:23 +#: src/components/domains/DomainCreationForm.vue:108 +#: src/components/domains/DomainCreationForm.vue:114 #: src/components/domains/DomainForm.vue:7 #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 -#: src/components/parameters/ParametersForm.vue:21 -#: src/components/domains/DomainCreationForm.vue:69 -#: src/components/domains/DomainCreationForm.vue:132 -#: src/components/parameters/ParametersForm.vue:98 #: src/components/identities/AliasCreationForm.vue:37 #: src/components/identities/AliasCreationForm.vue:69 +#: src/components/domains/DomainCreationForm.vue:74 +#: src/components/domains/DomainCreationForm.vue:159 +#: src/components/domains/DomainCreationForm.vue:165 msgid "General" msgstr "Général" #: src/components/domains/DomainSummary.vue:3 +#: src/components/identities/AccountSummary.vue:3 +#: src/components/identities/AliasSummary.vue:3 msgid "General information" msgstr "" +#: src/components/user/ProfileForm.vue:3 +#, fuzzy +msgid "General settings" +msgstr "Général" + +#: src/views/user/APISetup.vue:12 +#, fuzzy +msgid "Generate" +msgstr "Général" + +#: src/components/domains/DNSDetail.vue:72 +msgid "Generate a new DKIM key" +msgstr "" + #: src/components/domains/DomainOptionsForm.vue:6 msgid "Generate a random password for the administrator." msgstr "Générer un mot de passe aléatoire pour cet administrateur." #: src/components/identities/AccountRoleForm.vue:29 -#: src/components/identities/AccountRoleForm.vue:57 +#: src/components/identities/AccountRoleForm.vue:59 msgid "help" msgstr "" -#: src/components/domains/DomainDNSConfig.vue:29 -#: src/components/domains/DomainDNSConfig.vue:30 +#: src/components/domains/DomainDNSConfig.vue:8 +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." +msgstr "" + +#: src/components/domains/DomainDNSConfig.vue:33 +#: src/components/domains/DomainDNSConfig.vue:34 msgid "hostname of your automx server" msgstr "Nom d'hôte de votre serveur automx" @@ -606,8 +796,8 @@ msgstr "Nom d'hôte de votre serveur automx" msgid "Identification" msgstr "" -#: src/components/layout/Navbar.vue:45 src/views/identities/Identities.vue:3 -#: src/components/layout/Navbar.vue:157 +#: src/components/layout/Navbar.vue:57 src/views/identities/Identities.vue:3 +#: src/components/layout/Navbar.vue:172 msgid "Identities" msgstr "Identités" @@ -616,6 +806,39 @@ msgstr "Identités" msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" +#: src/components/tools/ImportForm.vue:29 +msgid "Import" +msgstr "" + +#: src/views/identities/Identities.vue:5 +msgid "Import accounts and aliases from CSV file" +msgstr "" + +#: src/views/domains/Domains.vue:37 +msgid "Import domains" +msgstr "" + +#: src/views/domains/Domains.vue:5 +msgid "Import domains and aliases from CSV file" +msgstr "" + +#: src/views/identities/Identities.vue:37 +#, fuzzy +msgid "Import identities" +msgstr "Identités" + +#: src/components/user/ForwardForm.vue:5 +msgid "Indicate one or more recipients separated by a comma (,)" +msgstr "" + +#: src/components/user/TwoFactorAuthForm.vue:14 +#: src/components/user/TwoFactorAuthForm.vue:7 +msgid "" +"Install a soft token authenticator like FreeOTP or Google\n" +" Authenticator from your application repository and use that\n" +" app to scan this QR code." +msgstr "" + #: src/views/Login.vue:35 src/views/Login.vue:93 msgid "Invalid username and/or password" msgstr "" @@ -630,14 +853,30 @@ msgid "" " some useful information about the product." msgstr "" +#: src/components/user/ForwardForm.vue:6 +msgid "Keep local copies" +msgstr "" + +#: src/components/user/ProfileForm.vue:59 +#: src/components/user/ProfileForm.vue:21 +msgid "Language" +msgstr "" + +#: src/components/identities/AccountSummary.vue:11 +#, fuzzy +msgid "Last login date" +msgstr "Date de dernière modification" + #: src/components/domains/DomainSummary.vue:11 msgid "Last modification date" msgstr "Date de dernière modification" #: src/components/identities/AccountCreationForm.vue:31 -#: src/components/identities/AccountGeneralForm.vue:50 +#: src/components/identities/AccountGeneralForm.vue:41 +#: src/components/user/ProfileForm.vue:52 #: src/components/identities/AccountCreationForm.vue:81 #: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/user/ProfileForm.vue:15 msgid "Last name" msgstr "" @@ -650,13 +889,13 @@ msgstr "" msgid "Level" msgstr "Niveau" -#: src/components/domains/DomainCreationForm.vue:36 -#: src/components/domains/DomainCreationForm.vue:86 +#: src/components/domains/DomainCreationForm.vue:38 +#: src/components/domains/DomainCreationForm.vue:110 +#: src/components/domains/DomainCreationForm.vue:116 #: src/components/domains/DomainForm.vue:61 -#: src/components/parameters/ParametersForm.vue:25 -#: src/components/domains/DomainCreationForm.vue:84 -#: src/components/domains/DomainCreationForm.vue:134 -#: src/components/parameters/ParametersForm.vue:102 +#: src/components/domains/DomainCreationForm.vue:89 +#: src/components/domains/DomainCreationForm.vue:161 +#: src/components/domains/DomainCreationForm.vue:167 msgid "Limitations" msgstr "" @@ -665,20 +904,22 @@ msgstr "" msgid "Logger" msgstr "Logger" -#: src/components/layout/Navbar.vue:77 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:189 src/components/layout/Topbar.vue:53 +#: src/components/layout/Navbar.vue:133 src/components/layout/Topbar.vue:6 +#: src/components/layout/Navbar.vue:248 src/components/layout/Topbar.vue:53 msgid "Logout" msgstr "Déconnexion" -#: src/components/layout/Navbar.vue:52 src/components/layout/Navbar.vue:164 +#: src/components/layout/Navbar.vue:69 src/components/layout/Navbar.vue:184 msgid "Logs" msgstr "Journaux" +#: src/components/alarms/AlarmList.vue:10 #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 +#: src/components/alarms/AlarmList.vue:50 msgid "Mailbox" msgstr "Boîte aux lettres" @@ -686,7 +927,9 @@ msgstr "Boîte aux lettres" msgid "Mailboxes" msgstr "Boites" +#: src/components/alarms/AlarmList.vue:11 #: src/components/logs/AuditTrailList.vue:11 +#: src/components/alarms/AlarmList.vue:51 #: src/components/logs/AuditTrailList.vue:43 msgid "Message" msgstr "Message" @@ -695,11 +938,11 @@ msgstr "Message" msgid "Message history" msgstr "" -#: src/components/domains/DomainCreationForm.vue:40 +#: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/domains/DomainCreationForm.vue:88 #: src/components/identities/AccountCreationForm.vue:106 +#: src/components/domains/DomainCreationForm.vue:93 msgid "Message sending limit" msgstr "Limite d'envoi des messages" @@ -707,16 +950,20 @@ msgstr "Limite d'envoi des messages" msgid "messages" msgstr "" -#: src/components/layout/Navbar.vue:61 src/components/layout/Navbar.vue:173 +#: src/components/layout/Navbar.vue:78 src/components/layout/Navbar.vue:193 msgid "Messages" msgstr "" +#: src/components/identities/AliasSummary.vue:11 +msgid "Modified" +msgstr "" + #: src/components/tools/CreationSummary.vue:5 msgid "Modify" msgstr "" -#: src/components/tools/TimeSerieChart.vue:59 -#: src/components/tools/TimeSerieChart.vue:117 +#: src/components/tools/TimeSerieChart.vue:53 +#: src/components/tools/TimeSerieChart.vue:111 msgid "Month" msgstr "Mois" @@ -725,18 +972,18 @@ msgid "MX records" msgstr "" #: src/components/domains/AdministratorList.vue:19 -#: src/components/domains/DNSDetail.vue:13 +#: src/components/domains/DNSDetail.vue:18 #: src/components/domains/DomainAliasForm.vue:40 -#: src/components/domains/DomainCreationForm.vue:23 -#: src/components/domains/DomainList.vue:29 +#: src/components/domains/DomainCreationForm.vue:25 +#: src/components/domains/DomainList.vue:24 #: src/components/domains/DomainOptionsForm.vue:4 #: src/components/identities/IdentityList.vue:16 -#: src/components/domains/DomainCreationForm.vue:71 -#: src/components/domains/AdministratorList.vue:87 -#: src/components/domains/DNSDetail.vue:131 -#: src/components/domains/DomainList.vue:152 +#: src/components/identities/IdentityList.vue:95 +#: src/components/domains/DNSDetail.vue:154 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/identities/IdentityList.vue:83 +#: src/components/domains/DomainCreationForm.vue:76 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainList.vue:166 msgid "Name" msgstr "Nom" @@ -748,6 +995,10 @@ msgstr "" msgid "Name:" msgstr "" +#: src/components/identities/AccountSummary.vue:13 +msgid "Never logged-in" +msgstr "" + #: src/views/domains/Domains.vue:15 src/views/domains/Domains.vue:3 #: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" @@ -765,26 +1016,36 @@ msgstr "Nouvel alias" msgid "New domain" msgstr "Nouveau domaine" +#: src/components/user/RecoveryCodesResetDialog.vue:3 +msgid "New recovery codes" +msgstr "" + #: src/components/tools/CreationForm.vue:27 msgid "Next" msgstr "Suivant" -#: src/components/domains/DomainList.vue:66 +#: src/components/domains/DNSDetail.vue:35 +#: src/components/domains/DomainList.vue:61 #: src/components/identities/IdentityList.vue:37 #: src/components/identities/IdentityList.vue:58 #: src/components/tools/CreationForm.vue:30 -#: src/components/domains/DomainList.vue:189 #: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:104 -#: src/components/identities/IdentityList.vue:125 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:137 +#: src/components/domains/DNSDetail.vue:171 +#: src/components/domains/DomainList.vue:203 msgid "No" msgstr "Non" +#: src/components/identities/AccountSenderAddresses.vue:6 +msgid "No sender address defined for this account" +msgstr "" + #: src/components/domains/DomainForm.vue:74 msgid "No sending limit" msgstr "" -#: src/components/domains/DNSDetail.vue:70 +#: src/components/domains/DNSDetail.vue:76 msgid "Not generated" msgstr "Non générée" @@ -797,35 +1058,47 @@ msgid "Number of messages this mailbox can send per day. Leave empty for no limi msgstr "" #: src/components/layout/ConfirmDialog.vue:15 +#: src/components/layout/ConfirmDialog.vue:54 msgid "OK" msgstr "" -#: src/components/domains/DomainCreationForm.vue:44 -#: src/components/domains/DomainCreationForm.vue:87 -#: src/components/domains/DomainCreationForm.vue:92 -#: src/components/domains/DomainCreationForm.vue:135 +#: src/views/alarms/Alarms.vue:3 +msgid "Opened alarms" +msgstr "" + +#: src/components/domains/DomainCreationForm.vue:52 +#: src/components/domains/DomainCreationForm.vue:111 +#: src/components/domains/DomainCreationForm.vue:103 +#: src/components/domains/DomainCreationForm.vue:162 msgid "Options" msgstr "Options" -#: src/components/parameters/ParametersForm.vue:66 -#: src/components/parameters/ParametersForm.vue:143 +#: src/components/parameters/ParametersForm.vue:60 +#: src/components/parameters/ParametersForm.vue:137 msgid "Parameters updated" msgstr "" -#: src/components/identities/AccountGeneralForm.vue:103 src/views/Login.vue:13 -#: src/components/identities/AccountGeneralForm.vue:53 +#: src/components/identities/AccountPasswordForm.vue:88 +#: src/components/user/ProfileForm.vue:21 src/views/Login.vue:13 +#: src/components/identities/AccountPasswordForm.vue:42 msgid "Password" msgstr "Mot de passe" -#: src/components/domains/DomainCreationForm.vue:97 +#: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 -#: src/components/identities/AccountGeneralForm.vue:30 -#: src/components/domains/DomainCreationForm.vue:145 +#: src/components/identities/AccountPasswordForm.vue:32 #: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountGeneralForm.vue:114 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/domains/DomainCreationForm.vue:178 msgid "Password copied to clipboard" msgstr "" +#: src/components/user/ProfileForm.vue:42 +#: src/components/user/ProfileForm.vue:112 +#, fuzzy +msgid "Password updated" +msgstr "Mot de passe" + #: src/components/domains/DNSStatusChip.vue:9 #: src/components/domains/DNSStatusChip.vue:16 msgid "Pending" @@ -836,25 +1109,57 @@ msgstr "" msgid "Period" msgstr "" +#: src/components/identities/AccountSummary.vue:28 +#: src/components/user/ProfileForm.vue:12 +#: src/components/user/ProfileForm.vue:69 +#: src/components/user/ProfileForm.vue:30 +msgid "Phone number" +msgstr "" + +#: src/components/user/TwoFactorAuthForm.vue:20 +#: src/components/user/TwoFactorAuthForm.vue:13 +msgid "Pin code" +msgstr "" + #: src/components/domains/DNSStatusChip.vue:12 #: src/components/domains/DNSStatusChip.vue:19 msgid "Problem" msgstr "" +#: src/views/user/APISetup.vue:47 src/views/user/APISetup.vue:88 +msgid "Proceed" +msgstr "" + +#: src/components/layout/Navbar.vue:100 src/components/layout/Navbar.vue:127 +#: src/views/user/Profile.vue:3 src/components/layout/Navbar.vue:215 +#: src/components/layout/Navbar.vue:242 +msgid "Profile" +msgstr "" + +#: src/components/user/ProfileForm.vue:33 +#: src/components/user/ProfileForm.vue:103 +#, fuzzy +msgid "Profile updated" +msgstr "Compte mis à jour" + +#: src/components/tools/ImportForm.vue:7 +msgid "Provide a CSV file where lines respect one of the following formats:" +msgstr "" + #: src/components/logs/MessageList.vue:8 src/components/logs/MessageList.vue:41 msgid "Queue ID" msgstr "ID de file" -#: src/components/domains/DomainCreationForm.vue:38 +#: src/components/domains/DomainCreationForm.vue:40 #: src/components/domains/DomainLimitationsForm.vue:3 -#: src/components/domains/DomainList.vue:33 +#: src/components/domains/DomainList.vue:28 #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/domains/DomainCreationForm.vue:86 -#: src/components/domains/DomainList.vue:156 -#: src/components/identities/AccountMailboxForm.vue:3 #: src/components/identities/AccountCreationForm.vue:100 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/domains/DomainList.vue:170 msgid "Quota" msgstr "Quota" @@ -883,52 +1188,93 @@ msgstr "Adresse aléatoire" #: src/components/domains/DomainCreationForm.vue:58 #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 -#: src/components/identities/AccountGeneralForm.vue:11 -#: src/components/domains/DomainCreationForm.vue:106 +#: src/components/identities/AccountPasswordForm.vue:9 #: src/components/identities/AccountCreationForm.vue:84 +#: src/components/domains/DomainCreationForm.vue:109 msgid "Random password" msgstr "Mot de passe aléatoire" +#: src/components/domains/DomainDKIMKey.vue:8 +msgid "Raw format. Click to copy" +msgstr "" + +#: src/components/user/ForwardForm.vue:4 +#, fuzzy +msgid "Recipient(s)" +msgstr "Destinataires" + #: src/components/identities/AliasCreationForm.vue:35 #: src/components/identities/AliasCreationForm.vue:37 #: src/components/identities/AliasCreationForm.vue:53 #: src/components/identities/AliasForm.vue:34 +#: src/components/identities/AliasRecipients.vue:3 #: src/components/identities/AliasCreationForm.vue:55 #: src/components/identities/AliasCreationForm.vue:57 #: src/components/identities/AliasCreationForm.vue:73 msgid "Recipients" msgstr "Destinataires" +#: src/components/user/TwoFactorAuthForm.vue:27 +#: src/components/user/TwoFactorAuthForm.vue:20 +msgid "Register" +msgstr "" + #: src/components/tools/TimeSerieChart.vue:22 msgid "Relative time ranges" msgstr "" +#: src/components/domains/DomainList.vue:26 +#: src/components/domains/DomainList.vue:10 +msgid "Relay" +msgstr "" + #: src/views/Login.vue:17 msgid "Remember me" msgstr "Se souvenir de moi" +#: src/components/identities/AccountSenderAddresses.vue:18 +#: src/components/identities/AccountSenderAddresses.vue:1 +#, fuzzy +msgid "Remove this address" +msgstr "Adresse email" + #: src/components/domains/AdministratorList.vue:24 #: src/components/domains/AdministratorList.vue:1 msgid "Remove this administrator" msgstr "" #: src/components/identities/AccountRoleForm.vue:27 -#: src/components/identities/AccountRoleForm.vue:55 +#: src/components/identities/AccountRoleForm.vue:57 msgid "Reseller" msgstr "Revendeur" +#: src/components/user/TwoFactorAuthForm.vue:60 +#: src/components/user/TwoFactorAuthForm.vue:8 +msgid "Reset recovery codes" +msgstr "" + +#: src/components/domains/DomainForm.vue:111 +#: src/components/identities/AccountForm.vue:83 +msgid "Resources" +msgstr "" + +#: src/components/tools/Resources.vue:3 +msgid "Resources usage" +msgstr "" + #: src/components/identities/AccountCreationForm.vue:21 #: src/components/identities/AccountCreationForm.vue:23 #: src/components/identities/AccountCreationForm.vue:81 #: src/components/identities/AccountForm.vue:7 +#: src/components/identities/AccountSummary.vue:20 #: src/components/identities/AccountCreationForm.vue:71 #: src/components/identities/AccountCreationForm.vue:73 #: src/components/identities/AccountCreationForm.vue:131 msgid "Role" msgstr "Rôle" -#: src/components/domains/DomainForm.vue:91 -#: src/components/identities/AccountForm.vue:85 +#: src/components/domains/DomainForm.vue:125 +#: src/components/identities/AccountForm.vue:97 #: src/components/identities/AliasForm.vue:58 msgid "Save" msgstr "Enregistrer" @@ -938,13 +1284,43 @@ msgstr "Enregistrer" msgid "Search" msgstr "Chercher" +#: src/components/identities/AccountSummary.vue:24 +#: src/components/user/ProfileForm.vue:77 +#: src/components/user/ProfileForm.vue:37 +msgid "Secondary email" +msgstr "" + +#: src/components/layout/Navbar.vue:106 src/views/user/Security.vue:3 +#: src/components/layout/Navbar.vue:221 +msgid "Security" +msgstr "" + #: src/components/domains/AdministratorList.vue:12 #: src/components/domains/AdministratorList.vue:2 msgid "Select an account" msgstr "" -#: src/components/domains/DomainList.vue:32 -#: src/components/domains/DomainList.vue:155 +#: src/components/tools/ImportForm.vue:14 +msgid "Select file" +msgstr "" + +#: src/components/identities/AccountSenderAddresses.vue:38 +#: src/components/identities/AccountSenderAddresses.vue:89 +msgid "Sender address added" +msgstr "" + +#: src/components/identities/AccountSenderAddresses.vue:44 +#: src/components/identities/AccountSenderAddresses.vue:95 +msgid "Sender address deleted" +msgstr "" + +#: src/components/identities/AccountSenderAddresses.vue:3 +#, fuzzy +msgid "Sender addresses" +msgstr "Adresse aléatoire" + +#: src/components/domains/DomainList.vue:27 +#: src/components/domains/DomainList.vue:169 msgid "Sending limit" msgstr "" @@ -952,29 +1328,48 @@ msgstr "" msgid "Sending limit:" msgstr "" -#: src/components/layout/Navbar.vue:69 src/components/layout/Navbar.vue:181 +#: src/components/tools/ImportForm.vue:17 +msgid "Separator" +msgstr "" + +#: src/components/domains/DomainCreationForm.vue:79 +#: src/components/domains/DomainTransportForm.vue:3 +#: src/components/domains/DomainCreationForm.vue:130 +msgid "Service" +msgstr "" + +#: src/components/domains/DomainForm.vue:96 +msgid "Service:" +msgstr "" + +#: src/components/layout/Navbar.vue:86 src/components/layout/Navbar.vue:201 msgid "Settings" msgstr "Configuration" -#: src/components/parameters/ParametersForm.vue:19 -#: src/components/parameters/ParametersForm.vue:96 -msgid "Settings: " +#: src/components/parameters/ParametersForm.vue:20 +msgid "Settings: thislabel" msgstr "" -#: src/components/domains/DNSDetail.vue:66 +#: src/components/domains/DNSDetail.vue:70 msgid "Show key" msgstr "Afficher la clé" #: src/components/identities/AccountRoleForm.vue:32 -#: src/components/identities/AccountRoleForm.vue:60 +#: src/components/identities/AccountRoleForm.vue:62 msgid "Simple user" msgstr "Utilisateur simple" -#: src/components/domains/DNSDetail.vue:38 +#: src/components/identities/AccountSenderAddresses.vue:9 +#: src/components/identities/AccountSenderAddresses.vue:2 +#, fuzzy +msgid "Specify an email address" +msgstr "Adresse email" + +#: src/components/domains/DNSDetail.vue:42 msgid "SPF record found" msgstr "" -#: src/components/domains/DNSDetail.vue:41 +#: src/components/domains/DNSDetail.vue:45 msgid "SPF record not found" msgstr "" @@ -994,15 +1389,36 @@ msgid "Summary" msgstr "Résumé" #: src/components/identities/AccountRoleForm.vue:37 -#: src/components/identities/AccountRoleForm.vue:65 +#: src/components/identities/AccountRoleForm.vue:67 msgid "Super administrator" msgstr "Super administrateur" #: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:85 +#: src/components/identities/IdentityList.vue:97 msgid "Tags" msgstr "Tags" +#: src/components/tools/ImportForm.vue:9 +msgid "The first element of each line is mandatory and must be equal to one of the previous values." +msgstr "" + +#: src/components/user/TwoFactorAuthForm.vue:39 +#: src/components/user/TwoFactorAuthForm.vue:7 +msgid "" +"The following recovery codes can be used one time each to\n" +" let you regain access to your account, in case you lose your\n" +" phone for example. Make sure to save them in a safe place,\n" +" otherwise you won't be able to access your account anymore." +msgstr "" + +#: src/components/user/RecoveryCodesResetDialog.vue:7 +msgid "" +"The following recovery codes can be used one time each to let\n" +" you regain access to your account, in case you lose your phone\n" +" for example. Make sure to save them in a safe place, otherwise\n" +" you won't be able to access your account anymore." +msgstr "" + #: src/views/Dashboard.vue:6 msgid "This page is still under construction." msgstr "" @@ -1013,13 +1429,31 @@ msgstr "" msgid "To" msgstr "A" -#: src/views/TwoFA.vue:9 +#: src/components/domains/DomainCreationForm.vue:77 +#: src/components/domains/DomainCreationForm.vue:117 +#: src/components/domains/DomainForm.vue:89 +#: src/components/domains/DomainCreationForm.vue:128 +#: src/components/domains/DomainCreationForm.vue:168 +msgid "Transport" +msgstr "" + +#: src/components/user/TwoFactorAuthForm.vue:4 +#, fuzzy +msgid "Two factor authentication" +msgstr "Authentification" + +#: src/components/user/TwoFactorAuthForm.vue:64 +#: src/components/user/TwoFactorAuthForm.vue:1 +msgid "Two-Factor Authentication (2FA) is not yet activated for your account. Enabling this feature will increase your account's security." +msgstr "" + +#: src/views/TwoFA.vue:11 msgid "Two-factor authentication code" msgstr "" -#: src/components/domains/DomainCreationForm.vue:24 +#: src/components/domains/DomainCreationForm.vue:26 #: src/components/domains/DomainGeneralForm.vue:6 -#: src/components/domains/DomainCreationForm.vue:72 +#: src/components/domains/DomainCreationForm.vue:77 msgid "Type" msgstr "Type" @@ -1032,32 +1466,44 @@ msgstr "" msgid "Unknown" msgstr "Inconnu" -#: src/components/identities/AccountMailboxForm.vue:23 -#: src/components/identities/AccountMailboxForm.vue:59 +#: src/components/identities/AccountMailboxForm.vue:30 +#: src/components/identities/AccountMailboxForm.vue:69 msgid "unlimited" msgstr "illimité" #: src/components/domains/DomainAliasForm.vue:17 -#: src/components/domains/DomainAliasForm.vue:90 +#: src/components/user/APIAccessForm.vue:8 +#: src/components/user/ForwardForm.vue:10 +#: src/components/domains/DomainAliasForm.vue:86 msgid "Update" msgstr "Mettre à jour" -#: src/components/domains/DNSDetail.vue:15 -#: src/components/domains/DNSDetail.vue:133 +#: src/components/user/ProfileForm.vue:25 +#, fuzzy +msgid "Update Password" +msgstr "Mot de passe" + +#: src/components/user/ProfileForm.vue:16 +#, fuzzy +msgid "Update settings" +msgstr "Configuration" + +#: src/components/domains/DNSDetail.vue:20 +#: src/components/domains/DNSDetail.vue:156 msgid "Updated" msgstr "Mis à jour" -#: src/components/identities/AccountMailboxForm.vue:20 -#: src/components/identities/AccountMailboxForm.vue:56 +#: src/components/identities/AccountMailboxForm.vue:27 +#: src/components/identities/AccountMailboxForm.vue:66 msgid "Use domain default value" msgstr "Utiliser la valeur par défaut du domaine" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 -#: src/components/identities/AccountGeneralForm.vue:29 src/views/Login.vue:9 -#: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 #: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:8 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/domains/AdministratorList.vue:86 msgid "Username" msgstr "Nom d'utilisateur" @@ -1074,23 +1520,25 @@ msgstr "" msgid "Verification" msgstr "" -#: src/views/TwoFA.vue:15 +#: src/views/TwoFA.vue:19 msgid "Verify code" msgstr "" -#: src/components/domains/DomainList.vue:59 +#: src/components/domains/DNSDetail.vue:29 +#: src/components/domains/DomainList.vue:54 #: src/components/identities/IdentityList.vue:30 #: src/components/identities/IdentityList.vue:51 -#: src/components/tools/CreationForm.vue:25 -#: src/components/domains/DomainList.vue:182 +#: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 #: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:97 -#: src/components/identities/IdentityList.vue:118 +#: src/components/identities/IdentityList.vue:109 +#: src/components/identities/IdentityList.vue:130 +#: src/components/domains/DNSDetail.vue:165 +#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" -#: src/components/tools/TimeSerieChart.vue:58 -#: src/components/tools/TimeSerieChart.vue:116 +#: src/components/tools/TimeSerieChart.vue:52 +#: src/components/tools/TimeSerieChart.vue:110 msgid "Week" msgstr "Semaine" @@ -1103,26 +1551,44 @@ msgid "With a mailbox" msgstr "Avec une boite aux lettres" #: src/components/domains/DomainCreationForm.vue:63 -#: src/components/domains/DomainCreationForm.vue:111 +#: src/components/domains/DomainCreationForm.vue:114 msgid "With mailbox" msgstr "" -#: src/components/tools/TimeSerieChart.vue:60 -#: src/components/tools/TimeSerieChart.vue:118 +#: src/components/tools/TimeSerieChart.vue:54 +#: src/components/tools/TimeSerieChart.vue:112 msgid "Year" msgstr "Année" -#: src/components/domains/DomainList.vue:67 +#: src/components/domains/DNSDetail.vue:36 +#: src/components/domains/DomainList.vue:62 #: src/components/identities/IdentityList.vue:38 #: src/components/identities/IdentityList.vue:59 #: src/components/tools/CreationForm.vue:29 -#: src/components/domains/DomainList.vue:190 #: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:105 -#: src/components/identities/IdentityList.vue:126 +#: src/components/identities/IdentityList.vue:117 +#: src/components/identities/IdentityList.vue:138 +#: src/components/domains/DNSDetail.vue:172 +#: src/components/domains/DomainList.vue:204 msgid "Yes" msgstr "Oui" +#: src/views/user/APISetup.vue:41 src/views/user/APISetup.vue:83 +msgid "You are about to delete your API access token" +msgstr "" + +#: src/components/tools/ImportForm.vue:10 +msgid "You can use a different character as separator." +msgstr "" + +#: src/views/user/APISetup.vue:8 +msgid "Your API token has not been generated yet." +msgstr "" + +#: src/views/user/APISetup.vue:18 +msgid "Your API token is:" +msgstr "" + #: src/filters/index.js:7 msgid "yes" msgstr "" @@ -1131,10 +1597,24 @@ msgstr "" msgid "no" msgstr "" -#: src/plugins/vee-validate.js:11 +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + +#: src/plugins/vee-validate.js:12 +#, fuzzy +msgid "Passwords mismatch" +msgstr "Mot de passe" + +#: src/plugins/vee-validate.js:16 msgid "This field must be a valid number" msgstr "" -#: src/plugins/vee-validate.js:15 +#: src/plugins/vee-validate.js:20 msgid "This field is required" msgstr "Ce champ est requis" + +#: src/plugins/vee-validate.js:33 +#, fuzzy +msgid "Invalid password" +msgstr "Mot de passe aléatoire" diff --git a/frontend/public/config.json b/frontend/public/config.json index 36a1f84be..6015de042 100644 --- a/frontend/public/config.json +++ b/frontend/public/config.json @@ -1,3 +1,4 @@ { - "API_BASE_URL": "/api/v2/" + "API_BASE_URL": "/api/v2/", + "API_DOC_URL": "/api/schema-v2/swagger/" } diff --git a/frontend/src/api/account.js b/frontend/src/api/account.js index e194857ce..07e631b57 100644 --- a/frontend/src/api/account.js +++ b/frontend/src/api/account.js @@ -34,5 +34,14 @@ export default { }, setForward (data) { return repository.post(`${resource}/forward/`, data) + }, + getAPIToken () { + return repository.get(`${resource}/api_token/`) + }, + createAPIToken () { + return repository.post(`${resource}/api_token/`) + }, + deleteAPIToken () { + return repository.delete(`${resource}/api_token/`) } } diff --git a/frontend/src/components/layout/Navbar.vue b/frontend/src/components/layout/Navbar.vue index 5a82f5353..c7c54c5e9 100644 --- a/frontend/src/components/layout/Navbar.vue +++ b/frontend/src/components/layout/Navbar.vue @@ -204,6 +204,13 @@ export default { } ], userSettingsMenuItems: [ + { + text: this.$gettext('API'), + roles: ['SuperAdmins'], + to: { name: 'APISetup' }, + icon: 'mdi-api', + exact: true + }, { text: this.$gettext('Profile'), to: { name: 'UserProfile' }, diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 42bd0cc0f..6b53339c5 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -136,6 +136,16 @@ const routes = [ allowedRoles: ['DomainAdmins', 'SuperAdmins'] } }, + { + path: '/user/api', + name: 'APISetup', + component: () => import('../views/user/APISetup.vue'), + meta: { + requiresAuth: true, + allowedRoles: ['SuperAdmins'], + layout: 'user' + } + }, { path: '/user/profile', name: 'UserProfile', diff --git a/frontend/src/views/user/APISetup.vue b/frontend/src/views/user/APISetup.vue new file mode 100644 index 000000000..ff00afd3b --- /dev/null +++ b/frontend/src/views/user/APISetup.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/modoboa/core/api/v2/serializers.py b/modoboa/core/api/v2/serializers.py index 3e99e6d96..470defbf2 100644 --- a/modoboa/core/api/v2/serializers.py +++ b/modoboa/core/api/v2/serializers.py @@ -236,3 +236,9 @@ class CheckPasswordSerializer(serializers.Serializer): if not user.check_password(value): raise serializers.ValidationError(_("Invalid password")) return value + + +class UserAPITokenSerializer(serializers.Serializer): + """Serializer used by API access routes.""" + + token = serializers.CharField() diff --git a/modoboa/core/api/v2/tests.py b/modoboa/core/api/v2/tests.py index d8d06c75b..84d45be94 100644 --- a/modoboa/core/api/v2/tests.py +++ b/modoboa/core/api/v2/tests.py @@ -177,6 +177,28 @@ class AccountViewSetTestCase(ModoAPITestCase): resp = self.client.post(url, data, format="json") self.assertEqual(resp.status_code, 400) + def test_api_token(self): + # 1. Obtain a JWT token so we can safely play with basic token + url = reverse("v2:token_obtain_pair") + data = { + "username": "admin", + "password": "password" + } + resp = self.client.post(url, data, format="json") + self.assertEqual(resp.status_code, 200) + self.client.credentials( + HTTP_AUTHORIZATION="Bearer {}".format(resp.json()["access"]) + ) + + url = reverse("v2:account-manage-api-token") + resp = self.client.get(url) + self.assertEqual(resp.status_code, 200) + self.assertEqual(resp.json()["token"], self.token.key) + resp = self.client.delete(url) + self.assertEqual(resp.status_code, 204) + resp = self.client.post(url) + self.assertEqual(resp.status_code, 201) + class AuthenticationTestCase(ModoAPITestCase): diff --git a/modoboa/core/api/v2/viewsets.py b/modoboa/core/api/v2/viewsets.py index e67e611c5..ef8c7b998 100644 --- a/modoboa/core/api/v2/viewsets.py +++ b/modoboa/core/api/v2/viewsets.py @@ -8,7 +8,9 @@ import qrcode.image.svg from django_otp.plugins.otp_static.models import StaticDevice, StaticToken from drf_spectacular.utils import extend_schema from rest_framework import filters, permissions, response, viewsets +from rest_framework.authtoken.models import Token from rest_framework.decorators import action +from rest_framework.exceptions import PermissionDenied from rest_framework_simplejwt.tokens import RefreshToken from modoboa.admin.api.v1 import serializers as admin_v1_serializers @@ -24,8 +26,8 @@ from . import serializers class AccountViewSet(core_v1_viewsets.AccountViewSet): """Account viewset.""" - @action(methods=["get"], detail=False) @extend_schema(responses=admin_v1_serializers.AccountSerializer) + @action(methods=["get"], detail=False) def me(self, request): """Return information about connected user.""" serializer = admin_v1_serializers.AccountSerializer(request.user) @@ -44,6 +46,47 @@ class AccountViewSet(core_v1_viewsets.AccountViewSet): serializer.is_valid(raise_exception=True) return response.Response() + @extend_schema( + description="Get current API token", + responses={200: serializers.UserAPITokenSerializer}, + methods=["GET"] + ) + @extend_schema( + description="Generate new API token", + responses={201: serializers.UserAPITokenSerializer}, + methods=["POST"] + ) + @extend_schema( + description="Delete current API token", + methods=["DELETE"] + ) + @action( + methods=["get", "post", "delete"], + detail=False, + url_path="api_token", + ) + def manage_api_token(self, request): + """Manage API token.""" + if not request.user.is_superuser: + raise PermissionDenied( + "Only super administrators can have API tokens" + ) + if request.method == "DELETE": + Token.objects.filter(user=request.user).delete() + return response.Response(status=204) + status = 200 + if request.method == "POST": + token, created = Token.objects.get_or_create(user=request.user) + if created: + status = 201 + else: + if hasattr(request.user, "auth_token"): + token = request.user.auth_token + else: + token = "" + serializer = serializers.UserAPITokenSerializer({"token": str(token)}) + return response.Response(serializer.data, status=status) + @action(methods=["post"], detail=False, url_path="tfa/verify") def tfa_verify_code(self, request): """Verify given code validity."""