From 29c11593391e13bd4b347f7725f1572da51272ee Mon Sep 17 00:00:00 2001 From: Spitap Date: Fri, 17 Feb 2023 18:09:11 +0100 Subject: [PATCH 01/25] added pdfcredential native support --- .../components/identities/IdentityList.vue | 11 + modoboa/admin/api/v2/serializers.py | 30 ++- modoboa/admin/signals.py | 1 + modoboa/core/app_settings.py | 4 +- .../core/commands/templates/settings.py.tpl | 1 + modoboa/pdfcredentials/__init__.py | 3 + modoboa/pdfcredentials/api/v2/__init__.py | 0 modoboa/pdfcredentials/api/v2/handlers.py | 32 +++ modoboa/pdfcredentials/api/v2/serializers.py | 65 +++++ modoboa/pdfcredentials/api/v2/tests.py | 153 +++++++++++ modoboa/pdfcredentials/api/v2/urls.py | 11 + modoboa/pdfcredentials/api/v2/views.py | 39 +++ modoboa/pdfcredentials/app_settings.py | 243 ++++++++++++++++++ modoboa/pdfcredentials/apps.py | 35 +++ modoboa/pdfcredentials/constants.py | 10 + modoboa/pdfcredentials/documents.py | 131 ++++++++++ modoboa/pdfcredentials/forms.py | 146 +++++++++++ modoboa/pdfcredentials/handlers.py | 53 ++++ modoboa/pdfcredentials/lib.py | 101 ++++++++ .../locale/cs_CZ/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/de/LC_MESSAGES/django.po | 212 +++++++++++++++ .../locale/el_GR/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/en/LC_MESSAGES/django.po | 209 +++++++++++++++ .../locale/fr/LC_MESSAGES/django.po | 210 +++++++++++++++ .../locale/it/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/ja_JP/LC_MESSAGES/django.po | 210 +++++++++++++++ .../locale/nl_NL/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/pl_PL/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/pt_BR/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/pt_PT/LC_MESSAGES/django.po | 209 +++++++++++++++ .../locale/sv/LC_MESSAGES/django.po | 211 +++++++++++++++ modoboa/pdfcredentials/models.py | 3 + modoboa/pdfcredentials/rfc6266.py | 109 ++++++++ modoboa/pdfcredentials/tests.py | 147 +++++++++++ modoboa/pdfcredentials/urls.py | 10 + modoboa/pdfcredentials/views.py | 37 +++ modoboa/urls.py | 1 + modoboa/urls_api_v2.py | 1 + requirements.txt | 3 + test_project/test_project/settings.py | 1 + 40 files changed, 3904 insertions(+), 4 deletions(-) create mode 100644 modoboa/pdfcredentials/__init__.py create mode 100644 modoboa/pdfcredentials/api/v2/__init__.py create mode 100644 modoboa/pdfcredentials/api/v2/handlers.py create mode 100644 modoboa/pdfcredentials/api/v2/serializers.py create mode 100644 modoboa/pdfcredentials/api/v2/tests.py create mode 100644 modoboa/pdfcredentials/api/v2/urls.py create mode 100644 modoboa/pdfcredentials/api/v2/views.py create mode 100644 modoboa/pdfcredentials/app_settings.py create mode 100644 modoboa/pdfcredentials/apps.py create mode 100644 modoboa/pdfcredentials/constants.py create mode 100644 modoboa/pdfcredentials/documents.py create mode 100644 modoboa/pdfcredentials/forms.py create mode 100644 modoboa/pdfcredentials/handlers.py create mode 100644 modoboa/pdfcredentials/lib.py create mode 100644 modoboa/pdfcredentials/locale/cs_CZ/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/de/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/el_GR/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/en/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/fr/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/it/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/ja_JP/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/nl_NL/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/pl_PL/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/pt_BR/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/pt_PT/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/sv/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/models.py create mode 100644 modoboa/pdfcredentials/rfc6266.py create mode 100644 modoboa/pdfcredentials/tests.py create mode 100644 modoboa/pdfcredentials/urls.py create mode 100644 modoboa/pdfcredentials/views.py diff --git a/frontend/src/components/identities/IdentityList.vue b/frontend/src/components/identities/IdentityList.vue index 1a10fb245..991fba2fc 100644 --- a/frontend/src/components/identities/IdentityList.vue +++ b/frontend/src/components/identities/IdentityList.vue @@ -164,6 +164,17 @@ export default { getMenuItems (item) { const result = [] if (item.type === 'account') { + item.possible_actions.forEach(element => { + result.push({ + label: this.$gettext(element.label), + icon: element.icon, + link: element.url, + onClick: () => { + window.open(element.url) + this.fetchIdentities() + } + }) + }) result.push({ label: this.$gettext('Edit'), icon: 'mdi-circle-edit-outline', onClick: this.editAccount }) result.push({ label: this.$gettext('Delete'), icon: 'mdi-delete-outline', onClick: this.deleteAccount, color: 'red' }) } else if (item.type === 'alias') { diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py index 84bccec49..a6d2c0e06 100644 --- a/modoboa/admin/api/v2/serializers.py +++ b/modoboa/admin/api/v2/serializers.py @@ -14,6 +14,7 @@ from django.contrib.auth import password_validation from rest_framework import serializers +from modoboa.admin import signals as admin_signals from modoboa.admin.api.v1 import serializers as v1_serializers from modoboa.core import models as core_models, signals as core_signals from modoboa.lib import email_utils @@ -284,6 +285,15 @@ class TagSerializer(serializers.Serializer): type = serializers.CharField() +class IdPossibleActionsSerializer(serializers.Serializer): + """Serialiser used to get possible actions related to identities.""" + + name = serializers.CharField() + icon = serializers.CharField() + label = serializers.CharField() + url = serializers.URLField() + + class IdentitySerializer(serializers.Serializer): """Serializer used for identities.""" @@ -293,6 +303,24 @@ class IdentitySerializer(serializers.Serializer): name_or_rcpt = serializers.CharField() tags = TagSerializer(many=True) + def __init__(self, instance=None, data=..., **kwargs): + super().__init__(instance, data, **kwargs) + self.fields["possible_actions"] = serializers.SerializerMethodField() + + def get_possible_actions(self, identity): + if not isinstance(identity, core_models.User): + # Return empty action list if identity type is an alias (not used for now) + return [] + actions = admin_signals.extra_account_identities_actions.send( + self.__class__, account=identity) + cleaned_actions = [] + for action in actions: + try : + serialized_data = IdPossibleActionsSerializer(action[1]).data + cleaned_actions.append(serialized_data) + except (ValidationError, AttributeError): + continue + return cleaned_actions class AccountResourceSerializer(serializers.ModelSerializer): """Serializer for user resource.""" @@ -512,7 +540,7 @@ class WritableAccountSerializer(v1_serializers.WritableAccountSerializer): instance.set_password(password) if mailbox_data: creator = self.context["request"].user - if hasattr(instance, "mailbox"): + if hasattr(instance, "mailbox") and "mailbox" in validated_data: if "username" in validated_data: mailbox_data["email"] = validated_data["username"] instance.email = validated_data["username"] diff --git a/modoboa/admin/signals.py b/modoboa/admin/signals.py index d7e59ba9b..9610ec7bd 100644 --- a/modoboa/admin/signals.py +++ b/modoboa/admin/signals.py @@ -29,3 +29,4 @@ get_domain_form_instances = django.dispatch.Signal( import_object = django.dispatch.Signal(providing_args=["objtype"]) use_external_recipients = django.dispatch.Signal(providing_args=["recipients"]) new_dkim_keys = django.dispatch.Signal(providing_args=["domains"]) +extra_account_identities_actions = django.dispatch.Signal(providing_args=["account"]) \ No newline at end of file diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py index 7b4aaeee1..5a1fcdc5a 100644 --- a/modoboa/core/app_settings.py +++ b/modoboa/core/app_settings.py @@ -1,7 +1,5 @@ """Core settings.""" -from collections import OrderedDict - import collections from django import forms @@ -536,7 +534,7 @@ class GeneralParametersForm(param_forms.AdminParametersForm): ] def _add_dynamic_fields(self): - new_fields = OrderedDict() + new_fields = collections.OrderedDict() for field, value in self.fields.items(): new_fields[field] = value if field == "sms_provider": diff --git a/modoboa/core/commands/templates/settings.py.tpl b/modoboa/core/commands/templates/settings.py.tpl index 22bf058ee..f81ac84cb 100644 --- a/modoboa/core/commands/templates/settings.py.tpl +++ b/modoboa/core/commands/templates/settings.py.tpl @@ -87,6 +87,7 @@ MODOBOA_APPS = ( 'modoboa.dnstools', 'modoboa.policyd', 'modoboa.maillog', + 'modoboa.pdfcredentials', # Modoboa extensions here. {% for extension in extensions %} '{{ extension }}', {% endfor %} diff --git a/modoboa/pdfcredentials/__init__.py b/modoboa/pdfcredentials/__init__.py new file mode 100644 index 000000000..7e1dfa1a8 --- /dev/null +++ b/modoboa/pdfcredentials/__init__.py @@ -0,0 +1,3 @@ +"""Generate PDF documents containing user credentials.""" + +default_app_config = "modoboa.pdfcredentials.apps.PDFCredentialsConfig" diff --git a/modoboa/pdfcredentials/api/v2/__init__.py b/modoboa/pdfcredentials/api/v2/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modoboa/pdfcredentials/api/v2/handlers.py b/modoboa/pdfcredentials/api/v2/handlers.py new file mode 100644 index 000000000..453136216 --- /dev/null +++ b/modoboa/pdfcredentials/api/v2/handlers.py @@ -0,0 +1,32 @@ +"""Handlers for PDF credientials api v2.""" + +import os + +from django.urls import reverse +from django.dispatch import receiver +from django.utils.translation import ugettext as _ + +from modoboa.admin import signals as admin_signals +from modoboa.parameters import tools as param_tools + +from ...lib import get_creds_filename + + +@receiver(admin_signals.extra_account_identities_actions) +def extra_identities_actions(sender, account, **kwargs): + """ + Add download credential action for identity. + Used for api v2. + """ + if not param_tools.get_global_parameter("enabled_pdfcredentials"): + return [] + fname = get_creds_filename(account) + if not os.path.exists(fname): + return [] + return { + "name": "get_credentials", + "url": reverse("v2:get-credentials", + args=[account.id]), + "icon": "mdi-file-download-outline", + "label": _("Download PDF credentials.") + } diff --git a/modoboa/pdfcredentials/api/v2/serializers.py b/modoboa/pdfcredentials/api/v2/serializers.py new file mode 100644 index 000000000..fba0a7809 --- /dev/null +++ b/modoboa/pdfcredentials/api/v2/serializers.py @@ -0,0 +1,65 @@ +"""Limits serializers for API v2.""" + +import os + +from django.utils.translation import ugettext_lazy as _ + +from rest_framework import serializers, status +from rest_framework.exceptions import PermissionDenied, APIException + + +from modoboa.core.models import User +from modoboa.parameters import tools as param_tools +from ...lib import decrypt_file, get_creds_filename + +from ...constants import CONNECTION_SECURITY_MODES + + +class PDFCredentialsSettingsSerializer(serializers.Serializer): + """A serializer for global parameters.""" + + # General + enabled_pdfcredentials = serializers.BooleanField(default=True) + + # Document storage + storage_dir = serializers.CharField(default="/var/lib/modoboa/pdf_credentials") + + # Security options + delete_first_dl = serializers.BooleanField(default=True) + generate_at_creation = serializers.BooleanField(default=True) + + # Customization options + title = serializers.CharField(default=_("Personal account information")) + webpanel_url = serializers.URLField() + custom_message = serializers.CharField(required=False, allow_blank=True) + include_connection_settings = serializers.BooleanField(default=False) + smtp_server_address = serializers.CharField() + smtp_server_port = serializers.IntegerField(default=587) + smtp_connection_security = serializers.ChoiceField(choices=CONNECTION_SECURITY_MODES, default="starttls") + imap_server_address = serializers.CharField() + imap_server_port = serializers.IntegerField(default=143) + imap_connection_security = serializers.ChoiceField(choices=CONNECTION_SECURITY_MODES, default="starttls") + + +class GetAccountCredentialsSerializer(serializers.Serializer): + """A serializer for get account credential view.""" + + account_id = serializers.IntegerField() + + def validate(self, data): + request = self.context["request"] + account = User.objects.get(pk=data["account_id"]) + if not request.user.can_access(account): + raise PermissionDenied() + self.context["account"] = account + return data + + + def save(self): + fname = get_creds_filename(self.context["account"]) + if not os.path.exists(fname): + raise APIException( _("No document available for this user"), status.HTTP_400_BAD_REQUEST) + self.context["content"] = decrypt_file(fname) + if param_tools.get_global_parameter("delete_first_dl"): + os.remove(fname) + self.context["fname"] = fname \ No newline at end of file diff --git a/modoboa/pdfcredentials/api/v2/tests.py b/modoboa/pdfcredentials/api/v2/tests.py new file mode 100644 index 000000000..c970eaf9a --- /dev/null +++ b/modoboa/pdfcredentials/api/v2/tests.py @@ -0,0 +1,153 @@ +"""API v2 tests.""" + +import tempfile +import shutil +import os + +from django.test import override_settings +from django.urls import reverse + +from modoboa.admin import factories +from modoboa.core import models as core_models +from modoboa.lib.tests import ModoAPITestCase + + +class PDFCredentialViewTestCase(ModoAPITestCase): + + @classmethod + def setUpTestData(cls): # NOQA:N802 + """Create test data.""" + super().setUpTestData() + factories.populate_database() + + def setUp(self): + """Create temp. directory to store files.""" + super().setUp() + self.workdir = tempfile.mkdtemp() + self.set_global_parameter("storage_dir", self.workdir) + + def tearDown(self): + """Reset test env.""" + shutil.rmtree(self.workdir) + + def _create_account(self, username, expected_status=201): + url = reverse("v2:account-list") + data = { + "username": f"{username}", + "role": "SimpleUsers", + "mailbox": { + "use_domain_quota": True + }, + "password": "Toto12345", + "language": "fr", + } + resp = self.client.post(url, data, format="json") + self.assertEqual(resp.status_code, expected_status) + return data + + def test_password_updated(self): + """Check that document is generated at account creation/update.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + + # Check if link is present in listing page + response = self.client.get(reverse("v2:identities-list"), format="json") + assert_action_in_response = False + for res_dict in response.json(): + for action in res_dict["possible_actions"]: + try: + if action.get("icon") == "mdi-file-download-outline": + assert_action_in_response = True + break + except KeyError: + continue + self.assertEqual(assert_action_in_response, True) + + # Try to download the file + response = self.client.get( + reverse("v2:get-credentials", + args=[account.pk])) + self.assertEqual(response.status_code, 200) + self.assertEqual(response["Content-Type"], "application/pdf") + + # File have been deleted? + self.assertFalse(os.path.exists(fname)) + + # Try to download a second time + response = self.client.get( + reverse("v2:get-credentials", + args=[account.pk])) + self.assertEqual(response.json()["detail"], "No document available for this user") + + # Update account + values.update({"language": "en"}) + self.client.patch( + reverse("v2:account-detail", args=[account.pk]), values, format='json' + ) + self.assertFalse(os.path.exists(fname)) + + self.set_global_parameter("generate_at_creation", False) + self.client.patch( + reverse("v2:account-detail", args=[account.pk]), values, format='json' + ) + self.assertTrue(os.path.exists(fname)) + + def test_with_connection_settings(self): + """Add connection settings to documents.""" + self.set_global_parameter("include_connection_settings", True) + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_with_custom_message(self): + """Add custom message to documents.""" + self.set_global_parameter("custom_message", "This is a test message.") + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_account_delete(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + url = reverse("v2:account-delete", args=[account.pk]) + self.client.post(url) + self.assertFalse(os.path.exists(fname)) + + @override_settings(MODOBOA_LOGO="modoboa.png") + def test_with_custom_logo(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_download_and_delete_account(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + + # Try to download the file + response = self.client.get( + reverse("v2:get-credentials", + args=[account.pk])) + self.assertEqual(response.status_code, 200) + self.assertEqual(response["Content-Type"], "application/pdf") + + # File have been deleted? + self.assertFalse(os.path.exists(fname)) + + # Delete account + url = reverse("v2:account-delete", args=[account.pk]) + self.client.post(url) + self.assertFalse(os.path.exists(fname)) + + def test_storage_dir_creation(self): + """Test storage directory creation.""" + self.set_global_parameter("storage_dir", "/nonexistentdir") + self._create_account("leon@test.com", expected_status=500) diff --git a/modoboa/pdfcredentials/api/v2/urls.py b/modoboa/pdfcredentials/api/v2/urls.py new file mode 100644 index 000000000..4b62a3ea0 --- /dev/null +++ b/modoboa/pdfcredentials/api/v2/urls.py @@ -0,0 +1,11 @@ +"""PDF Credentials API urls.""" + +from django.urls import path + + +from . import views + +urlpatterns = [ + path('credentials//', views.PDFCredentialView.as_view(), + name="get-credentials"), +] diff --git a/modoboa/pdfcredentials/api/v2/views.py b/modoboa/pdfcredentials/api/v2/views.py new file mode 100644 index 000000000..eb8b844eb --- /dev/null +++ b/modoboa/pdfcredentials/api/v2/views.py @@ -0,0 +1,39 @@ +"""PDF Credentials API v2 views.""" + +from django.utils.translation import ugettext as _ +from django.http import HttpResponse + +from rest_framework import permissions +from rest_framework.views import APIView + +from modoboa.admin.models import Domain + +from .serializers import GetAccountCredentialsSerializer + + +class PDFCredentialView(APIView): + + permission_classes = ( + permissions.IsAuthenticated, permissions.DjangoModelPermissions, + ) + + serializer_class = GetAccountCredentialsSerializer + + def get_queryset(self): + """Filter queryset based on current user.""" + return Domain.objects.get_for_admin(self.request.user) + + def get(self, request, *args, **kwargs): + """View to download a document.""" + data = {"account_id": kwargs["account_id"]} + serializer = GetAccountCredentialsSerializer(data=data, context={'request': request}) + serializer.is_valid(raise_exception=True) + serializer.save() + + content = serializer.context["content"] + fname = serializer.context["fname"] + resp = HttpResponse(content) + resp["Content-Type"] = "application/pdf" + resp["Content-Length"] = len(content) + resp["Content-Disposition"] = f"attachment; filename={fname};" + return resp diff --git a/modoboa/pdfcredentials/app_settings.py b/modoboa/pdfcredentials/app_settings.py new file mode 100644 index 000000000..b5bd958ba --- /dev/null +++ b/modoboa/pdfcredentials/app_settings.py @@ -0,0 +1,243 @@ +"""PDF Credentials forms.""" + +import collections + +from django import forms +from django.conf import settings +from django.utils.functional import cached_property +from django.utils.translation import ugettext_lazy as _ + +from django.contrib.sites import models as sites_models + +from modoboa.lib import form_utils +from modoboa.parameters import forms as param_forms + +from . import constants + + +PDF_CREDENTIALS_PARAMETERS_STRUCT = collections.OrderedDict([ + ("general", { + "label": _("General"), + "params": collections.OrderedDict([ + ("enabled_pdfcredentials", { + "label": _("Enable PDF credentials"), + "help_text": _( + "Enabled PDF credentials document generation on account creation."), + }) + ]) + }), + ("docstore", { + "label": _("Documents storage"), + "params": collections.OrderedDict([ + ("storage_dir", { + "label": _("Directory to save documents into"), + "help_text": _( + "Path to a directory where PDF documents will be saved"), + }), + ]) + }), + ("security", { + "label": _("Security options"), + "params": collections.OrderedDict([ + ("delete_first_dl", { + "label": _("Delete documents after the first download"), + "help_text": _( + "Automatically delete a document just after its first download " + "from this interface" + ) + }), + ("generate_at_creation", { + "label": _("Generate documents only at account creation"), + "help_text": _( + "Generate a new document only when a new account is created. " + "If set to no, a new document will be created each time a " + "password is updated." + ) + }) + ]) + }), + ("customization", { + "label": _("Customization options"), + "params": collections.OrderedDict([ + ("title", { + "label": _("Title"), + "help_text": _("The document's title") + }), + ("webpanel_url", { + "label": _("Web panel url"), + "help_text": _("URL of the Modoboa web panel") + }), + ("custom_message", { + "label": _("Custom message"), + "help_text": _( + "A custom message that will appear at the end of documents" + ) + }), + ("include_connection_settings", { + "label": _("Include mail client connection settings"), + "help_text": _( + "Include required SMTP and IMAP connection information to " + "configure a mail client, a tablet or a phone" + ) + }), + ("smtp_server_address", { + "label": _("SMTP server address"), + "help_text": _("Address of the SMTP server (hostname or IP)") + }), + ("smtp_server_port", { + "label": _("SMTP server port"), + "help_port": _("Listening port of the SMTP server") + }), + ("smtp_connection_security", { + "label": _("SMTP connection security"), + "help_text": _("Connection security mechanism") + }), + ("imap_server_address", { + "label": _("IMAP server address"), + "help_text": _("Address of the IMAP server (hostname or IP)") + }), + ("imap_server_port", { + "label": _("IMAP server port"), + "help_text": _("Listening port of the IMAP server") + }), + ("imap_connection_security", { + "label": _("IMAP connection security"), + "help_text": _("Connection security mechanism") + }) + ]) + }) +]) + + + +class ParametersForm(param_forms.AdminParametersForm): + """Admin parameters form.""" + + app = "pdfcredentials" + + general = form_utils.SeparatorField(label=_("General")) + + enabled_pdfcredentials = form_utils.YesNoField( + label= _("Enable PDF credentials"), + initial=True, + help_text=_("Enabled PDF credentials document generation on account creation.") + ) + + docstore = form_utils.SeparatorField(label=_("Documents storage")) + + storage_dir = forms.CharField( + label=_("Directory to save documents into"), + initial="/var/lib/modoboa/pdf_credentials", + help_text=_("Path to a directory where PDF documents will be saved"), + ) + + security = form_utils.SeparatorField(label=_("Security options")) + + delete_first_dl = form_utils.YesNoField( + label=_("Delete documents after the first download"), + initial=True, + help_text=_( + "Automatically delete a document just after its first download " + "from this interface" + ) + ) + + generate_at_creation = form_utils.YesNoField( + label=_("Generate documents only at account creation"), + initial=True, + help_text=_( + "Generate a new document only when a new account is created. " + "If set to no, a new document will be created each time a " + "password is updated." + ) + ) + + customization = form_utils.SeparatorField(label=_("Customization options")) + + title = forms.CharField( + label=_("Title"), + initial=_("Personal account information"), + help_text=_("The document's title") + ) + + webpanel_url = forms.URLField( + label=_("Web panel url"), + help_text=_("URL of the Modoboa web panel") + ) + + custom_message = forms.CharField( + label=_("Custom message"), + help_text=_( + "A custom message that will appear at the end of documents"), + required=False + ) + + include_connection_settings = form_utils.YesNoField( + label=_("Include mail client connection settings"), + initial=False, + help_text=_( + "Include required SMTP and IMAP connection information to " + "configure a mail client, a tablet or a phone" + ) + ) + + smtp_server_address = forms.CharField( + label=_("SMTP server address"), + help_text=_("Address of the SMTP server (hostname or IP)") + ) + + smtp_server_port = forms.IntegerField( + label=_("SMTP server port"), + initial=587, + help_text=_("Listening port of the SMTP server") + ) + + smtp_connection_security = forms.ChoiceField( + label=_("SMTP connection security"), + choices=constants.CONNECTION_SECURITY_MODES, + initial="starttls", + help_text=_("Connection security mechanism") + ) + + imap_server_address = forms.CharField( + label=_("IMAP server address"), + help_text=_("Address of the IMAP server (hostname or IP)") + ) + + imap_server_port = forms.IntegerField( + label=_("IMAP server port"), + initial=143, + help_text=_("Listening port of the IMAP server") + ) + + imap_connection_security = forms.ChoiceField( + label=_("IMAP connection security"), + choices=constants.CONNECTION_SECURITY_MODES, + initial="starttls", + help_text=_("Connection security mechanism") + ) + + visibility_rules = { + "smtp_server_address": "include_connection_settings=True", + "smtp_server_port": "include_connection_settings=True", + "smtp_connection_security": "include_connection_settings=True", + "imap_server_address": "include_connection_settings=True", + "imap_server_port": "include_connection_settings=True", + "imap_connection_security": "include_connection_settings=True", + } + + @cached_property + def hostname(self): + """Return local hostname.""" + return sites_models.Site.objects.get_current().domain + + def __init__(self, *args, **kwargs): + """Set initial values.""" + super(ParametersForm, self).__init__(*args, **kwargs) + if not self.fields["webpanel_url"].initial: + url = "https://{}{}".format(self.hostname, settings.LOGIN_URL) + self.fields["webpanel_url"].initial = url + if not self.fields["smtp_server_address"].initial: + self.fields["smtp_server_address"].initial = self.hostname + if not self.fields["imap_server_address"].initial: + self.fields["imap_server_address"].initial = self.hostname diff --git a/modoboa/pdfcredentials/apps.py b/modoboa/pdfcredentials/apps.py new file mode 100644 index 000000000..761eb4fe1 --- /dev/null +++ b/modoboa/pdfcredentials/apps.py @@ -0,0 +1,35 @@ +"""AppConfig for PDF credentials.""" + +from django.apps import AppConfig + +from django.utils.translation import ugettext_lazy + + +def load_pdfcredential_settings(): + """Load core settings. + + This function must be manually called (see :file:`urls.py`) in + order to load base settings. + """ + from modoboa.parameters import tools as param_tools + from . import app_settings + from .api.v2 import serializers + + param_tools.registry.add( + "global", app_settings.ParametersForm, ugettext_lazy("PDF credentials")) + param_tools.registry.add2( + "global", "pdfcredentials", ugettext_lazy("PDF Credentials"), + app_settings.PDF_CREDENTIALS_PARAMETERS_STRUCT, + serializers.PDFCredentialsSettingsSerializer) + + +class PDFCredentialsConfig(AppConfig): + """App configuration.""" + + name = "modoboa.pdfcredentials" + verbose_name = "PDF credentials for Modoboa" + + def ready(self): + from . import handlers + from .api.v2 import handlers + load_pdfcredential_settings() diff --git a/modoboa/pdfcredentials/constants.py b/modoboa/pdfcredentials/constants.py new file mode 100644 index 000000000..c0a407a9c --- /dev/null +++ b/modoboa/pdfcredentials/constants.py @@ -0,0 +1,10 @@ +"""PDF credentials constants.""" + +from django.utils.translation import ugettext_lazy + + +CONNECTION_SECURITY_MODES = [ + ("none", ugettext_lazy("None")), + ("starttls", "STARTTLS"), + ("tls", "TLS") +] diff --git a/modoboa/pdfcredentials/documents.py b/modoboa/pdfcredentials/documents.py new file mode 100644 index 000000000..21399a6d6 --- /dev/null +++ b/modoboa/pdfcredentials/documents.py @@ -0,0 +1,131 @@ +"""The code used to generate PDF files (based on Reportlab).""" + +from io import BytesIO + +from reportlab.lib import colors +from reportlab.lib.pagesizes import A4 +from reportlab.lib.units import cm +from reportlab.lib.enums import TA_CENTER +from reportlab.lib import utils +from reportlab.platypus import ( + SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Frame, + Image +) +from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle + +from django.utils.translation import ugettext as _ + +from modoboa.parameters import tools as param_tools + +from . import lib + +styles = getSampleStyleSheet() +styles.add(ParagraphStyle( + name="Footer", alignment=TA_CENTER, fontName="Helvetica-Oblique", + textColor=colors.lightgrey +)) +styles.add(ParagraphStyle( + name="Warning", fontName="Helvetica-Oblique", + textColor=colors.red, fontSize=12 +)) +styles.add(ParagraphStyle( + name="Link", + textColor=colors.blue +)) +styles.add(ParagraphStyle( + name="Greeting", alignment=TA_CENTER, fontName="Helvetica-Oblique", + fontSize=14 +)) + + +def resized_image(path, width=1*cm): + img = utils.ImageReader(path) + iw, ih = img.getSize() + aspect = ih / float(iw) + return Image(path, width=width, height=(width * aspect)) + + +def credentials(account, password): + """Generate a PDF document containing account credentials.""" + + def page_template(canvas, doc): + canvas.setTitle(_("Personal account information")) + canvas.setAuthor(account.fullname) + canvas.setCreator("Modoboa") + footer = [Paragraph(_("Powered by Modoboa - Mail hosting made simple"), + styles["Footer"])] + Frame(0, 0, 21 * cm, 2 * cm).addFromList(footer, canvas) + + conf = dict( + param_tools.get_global_parameters("pdfcredentials")) + filename = lib.get_creds_filename(account) + buff = BytesIO() + doc = SimpleDocTemplate(buff, pagesize=A4) + story = [] + story.append(resized_image(lib.get_document_logo(), 8*cm)) + story.append(Spacer(1, 1 * cm)) + story.append(Paragraph(conf["title"], styles["Title"])) + story.append(Spacer(1, 1 * cm)) + story.append(Paragraph(_(""" +Dear %s, this document contains the credentials you will need +to connect to Modoboa. Learn the content and destroy +the document as soon as possible. +""") % account.fullname, styles["Normal"])) + story.append(Spacer(1, 0.2 * cm)) + story.append(Paragraph(_("Web panel:"), styles["h3"])) + data = [ + ["URL", conf["webpanel_url"]], + [_("Username"), account.username], + [_("Password"), password] + ] + table = Table(data) + table.setStyle(TableStyle([ + ('TEXTCOLOR', (1, 0), (1, 0), colors.blue), + ('GRID', (0, 0), (-1, -1), 1, colors.black), + ('BACKGROUND', (0, 0), (0, -1), colors.lightgrey), + ])) + story.append(table) + story.append(Spacer(1, 0.5 * cm)) + story.append(Paragraph(_(""" +Here you can view your emails anytime online, create filters or manage +your contacts. +"""), styles["Normal"])) + + story.append(Spacer(1, 0.2 * cm)) + story.append(Paragraph( + _("Please change your password!"), + styles["Warning"])) + + if conf["include_connection_settings"]: + story.append(Spacer(1, 1 * cm)) + story.append(Paragraph( + _("PC/Tablet/Smartphone configuration:"), styles["h3"])) + story.append(Spacer(1, 0.2 * cm)) + data = [ + [_("SMTP server address"), conf["smtp_server_address"]], + [_("SMTP server port"), conf["smtp_server_port"]], + [_("SMTP connection security"), conf["smtp_connection_security"]], + [_("IMAP server address"), conf["imap_server_address"]], + [_("IMAP server port"), conf["imap_server_port"]], + [_("IMAP connection security"), conf["imap_connection_security"]], + ] + table = Table(data) + table.setStyle(TableStyle([ + ('GRID', (0, 0), (-1, -1), 1, colors.black), + ('BACKGROUND', (0, 0), (0, -1), colors.lightgrey), + ])) + story.append(table) + story.append(Spacer(1, 0.5 * cm)) + story.append(Paragraph( + _("Use those settings for your computer, tablet or phone."), + styles["Normal"]) + ) + + if conf["custom_message"]: + story.append(Spacer(1, 2 * cm)) + story.append(Paragraph(conf["custom_message"], styles["Greeting"])) + + doc.build(story, onFirstPage=page_template, onLaterPages=page_template) + length = len(buff.getvalue()) + buff.seek(0) + lib.crypt_and_save_to_file(buff, filename, length) diff --git a/modoboa/pdfcredentials/forms.py b/modoboa/pdfcredentials/forms.py new file mode 100644 index 000000000..8546a25f5 --- /dev/null +++ b/modoboa/pdfcredentials/forms.py @@ -0,0 +1,146 @@ +"""PDF credentials forms.""" + +from django import forms +from django.conf import settings +from django.utils.functional import cached_property +from django.utils.translation import ugettext_lazy as _ + +from django.contrib.sites import models as sites_models + +from modoboa.lib import form_utils +from modoboa.parameters import forms as param_forms + +from . import constants + + +class ParametersForm(param_forms.AdminParametersForm): + """Admin parameters form.""" + + app = "pdfcredentials" + + docstore = form_utils.SeparatorField(label=_("Documents storage")) + + storage_dir = forms.CharField( + label=_("Directory to save documents into"), + initial="/var/lib/modoboa/pdf_credentials", + help_text=_("Path to a directory where PDF documents will be saved"), + ) + + security = form_utils.SeparatorField(label=_("Security options")) + + delete_first_dl = form_utils.YesNoField( + label=_("Delete documents after the first download"), + initial=True, + help_text=_( + "Automatically delete a document just after its first download " + "from this interface" + ) + ) + + generate_at_creation = form_utils.YesNoField( + label=_("Generate documents only at account creation"), + initial=True, + help_text=_( + "Generate a new document only when a new account is created. " + "If set to no, a new document will be created each time a " + "password is updated." + ) + ) + + customization = form_utils.SeparatorField(label=_("Customization options")) + + title = forms.CharField( + label=_("Title"), + initial=_("Personal account information"), + help_text=_("The document's title") + ) + + webpanel_url = forms.URLField( + label=_("Web panel url"), + help_text=_("URL of the Modoboa web panel") + ) + + custom_message = forms.CharField( + label=_("Custom message"), + help_text=_( + "A custom message that will appear at the end of documents"), + required=False + ) + + include_connection_settings = form_utils.YesNoField( + label=_("Include mail client connection settings"), + initial=False, + help_text=_( + "Include required SMTP and IMAP connection information to " + "configure a mail client, a tablet or a phone" + ) + ) + + smtp_server_address = forms.CharField( + label=_("SMTP server address"), + help_text=_("Address of the SMTP server (hostname or IP)") + ) + + smtp_server_port = forms.IntegerField( + label=_("SMTP server port"), + initial=587, + help_text=_("Listening port of the SMTP server") + ) + + smtp_connection_security = forms.ChoiceField( + label=_("SMTP connection security"), + choices=constants.CONNECTION_SECURITY_MODES, + initial="starttls", + help_text=_("Connection security mechanism") + ) + + imap_server_address = forms.CharField( + label=_("IMAP server address"), + help_text=_("Address of the IMAP server (hostname or IP)") + ) + + imap_server_port = forms.IntegerField( + label=_("IMAP server port"), + initial=143, + help_text=_("Listening port of the IMAP server") + ) + + imap_connection_security = forms.ChoiceField( + label=_("IMAP connection security"), + choices=constants.CONNECTION_SECURITY_MODES, + initial="starttls", + help_text=_("Connection security mechanism") + ) + + visibility_rules = { + "smtp_server_address": "include_connection_settings=True", + "smtp_server_port": "include_connection_settings=True", + "smtp_connection_security": "include_connection_settings=True", + "imap_server_address": "include_connection_settings=True", + "imap_server_port": "include_connection_settings=True", + "imap_connection_security": "include_connection_settings=True", + } + + @cached_property + def hostname(self): + """Return local hostname.""" + return sites_models.Site.objects.get_current().domain + + def __init__(self, *args, **kwargs): + """Set initial values.""" + super(ParametersForm, self).__init__(*args, **kwargs) + if not self.fields["webpanel_url"].initial: + url = "https://{}{}".format(self.hostname, settings.LOGIN_URL) + self.fields["webpanel_url"].initial = url + if not self.fields["smtp_server_address"].initial: + self.fields["smtp_server_address"].initial = self.hostname + if not self.fields["imap_server_address"].initial: + self.fields["imap_server_address"].initial = self.hostname + + +def load_settings(): + """Load app settings.""" + from modoboa.parameters import tools as param_tools + + param_tools.registry.add( + "global", ParametersForm, _("PDF credentials")) \ No newline at end of file diff --git a/modoboa/pdfcredentials/handlers.py b/modoboa/pdfcredentials/handlers.py new file mode 100644 index 000000000..448cea6bd --- /dev/null +++ b/modoboa/pdfcredentials/handlers.py @@ -0,0 +1,53 @@ +"""PDF credentials handlers.""" + +import os + +from django.urls import reverse +from django.db.models import signals +from django.dispatch import receiver +from django.utils.translation import ugettext as _ + +from modoboa.core import models as core_models +from modoboa.core import signals as core_signals +from modoboa.parameters import tools as param_tools + +from .documents import credentials +from .lib import init_storage_dir, delete_credentials, get_creds_filename + + +@receiver(core_signals.account_password_updated) +def password_updated(sender, account, password, created, **kwargs): + """Create or update document.""" + if not param_tools.get_global_parameter("enabled_pdfcredentials"): + return + generate_at_creation = param_tools.get_global_parameter( + "generate_at_creation") + if (generate_at_creation and not created) or account.is_superuser: + return + init_storage_dir() + credentials(account, password) + + +@receiver(signals.pre_delete, sender=core_models.User) +def account_deleted(sender, instance, **kwargs): + """Remove document.""" + delete_credentials(instance) + + +@receiver(core_signals.extra_account_actions) +def extra_account_actions(sender, account, **kwargs): + """Add link to download document.""" + if not param_tools.get_global_parameter("enabled_pdfcredentials"): + return [] + fname = get_creds_filename(account) + if not os.path.exists(fname): + return [] + return [{ + "name": "get_credentials", + "url": reverse("pdfcredentials:account_credentials", + args=[account.id]), + "img": "fa fa-download", + "title": _("Retrieve user's credentials as a PDF document") + }] + + diff --git a/modoboa/pdfcredentials/lib.py b/modoboa/pdfcredentials/lib.py new file mode 100644 index 000000000..2d9785bbf --- /dev/null +++ b/modoboa/pdfcredentials/lib.py @@ -0,0 +1,101 @@ +"""Internal library.""" + +from io import BytesIO +import os +import struct + +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes +from cryptography.hazmat.backends import default_backend + +from django.conf import settings +from django.utils.encoding import force_bytes, smart_bytes +from django.utils.translation import ugettext as _ + +from modoboa.lib.exceptions import InternalError +from modoboa.parameters import tools as param_tools + + +def init_storage_dir(): + """Create the directory whare documents will be stored.""" + storage_dir = param_tools.get_global_parameter("storage_dir") + if os.path.exists(storage_dir): + return + try: + os.mkdir(storage_dir) + except (OSError, IOError) as inst: + raise InternalError( + _("Failed to create the directory that will contain " + "PDF documents (%s)") % inst + ) + + +def get_creds_filename(account): + """Return the full path of a document.""" + storage_dir = param_tools.get_global_parameter("storage_dir") + return os.path.join(storage_dir, account.username + ".pdf") + + +def delete_credentials(account): + """Try to delete a local file.""" + fname = get_creds_filename(account) + if not os.path.exists(fname): + return + os.remove(fname) + + +def _get_cipher(iv): + """Return ready-to-user Cipher.""" + key = smart_bytes(settings.SECRET_KEY[:32]) + backend = default_backend() + return Cipher( + algorithms.AES(force_bytes(key)), + modes.CBC(iv), + backend=backend + ) + + +def crypt_and_save_to_file(content, filename, length, chunksize=64*512): + """Crypt content and save it to a file.""" + iv = os.urandom(16) + cipher = _get_cipher(iv) + encryptor = cipher.encryptor() + with open(filename, "wb") as fp: + fp.write(struct.pack(b", 2018 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-08-10 11:24+0000\n" +"Last-Translator: Jarda Tesar \n" +"Language-Team: Czech (Czech Republic) (http://www.transifex.com/tonio/modoboa/language/cs_CZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs_CZ\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#: constants.py:7 +msgid "None" +msgstr "Žádné" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Informace osobního účtu" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Běží na Modoboa - Poštovní hosting zjednodušeně" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nVážený %s, tento dokument obsahuje přístupové údaje potřebné\npro pripojení do rozhraní Modoboa. Zapamatujte si je a smazte\ntento dokument hned, jakmile to bude možné.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Webový panel:" + +#: documents.py:78 +msgid "Username" +msgstr "Uživatelské jméno" + +#: documents.py:79 +msgid "Password" +msgstr "Heslo" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nZde si kdykoliv můžete prohlédnout své emaily, vytvořit filtry nebo spravovat Vaše kontakty.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Prosím změňte si své heslo!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "Nastavení PC/Tabletu/Smartphonu:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Adresa SMTP serveru" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Port SMTP serveru" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Zabezpečení SMTP připojení" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "Adresa IMAP serveru" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "Port IMAP serveru" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Zabezpečení IMAP připojení" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Použijte tato nastavení ve svém počítači, tabletu či telefonu." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Úložný prostor pro dokumenty" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Adresář pro uložení dokumentů" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Cesta k adresáři kde budou uloženy PDF dokumenty" + +#: forms.py:28 +msgid "Security options" +msgstr "Možnosti zabezpečení" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Smazat dokumenty po prvním stažení" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Automaticky smazat dokument ihned po prvním stažení cez toto rozhraní" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Vytvářet dokumenty pouze při vytváření účtu" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Vytvářet nové dokumenty pouze při vytvoření účtu. Je-li nastaveno na hodnotu ne, bude nový dokument vytvořen pokaždé, když dojde ke změne hesla." + +#: forms.py:49 +msgid "Customization options" +msgstr "Možnosti vlastních úprav" + +#: forms.py:52 +msgid "Title" +msgstr "Název" + +#: forms.py:54 +msgid "The document's title" +msgstr "Název dokumentu" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL web panelu" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL adresa Modoboa web panelu" + +#: forms.py:63 +msgid "Custom message" +msgstr "Vlastní zpráva" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Vlastní zpráva, která se zobrazí na konci dokumentu." + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Zahrnout nastavení mailového klienta" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Zahrnout vyžadovaná nastavení SMTP a IMAP připojení pri konfiguraci mailového klienta, tabletu či telefonu" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Adresa SMTP serveru (hostname nebo IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Port SMTP serveru" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Zabezpečení připojení" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Adresa IMAP serveru (hostname nebo IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Port IMAP serveru" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Získat přístupové údaje uživatele ako PDF dokument" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Vytváření adresáře pro uložení PDF dokumentů (%s) selhalo " + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "PDF přístupové údaje" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Vytvářet PDF dokumenty obsahující přístupové údaje uživatele" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Pro tohoto uživatele není k dispozici žáden dokument" diff --git a/modoboa/pdfcredentials/locale/de/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/de/LC_MESSAGES/django.po new file mode 100644 index 000000000..6c98d2145 --- /dev/null +++ b/modoboa/pdfcredentials/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,212 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Boris Andratzek , 2018 +# Christian Wiegand, 2017 +# controlcde, 2015 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-04-25 14:19+0000\n" +"Last-Translator: Boris Andratzek \n" +"Language-Team: German (http://www.transifex.com/tonio/modoboa/language/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "kein" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Persönliche Kontoinformationen" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Powered by Modoboa - Mail hosting made simple" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nLiebe/r %s, dieses Dokument enthält die Anmeldeinformationen, die Du benötigst um Dich mit Modoboa zu verbinden. Präge Dir bitte die Informationen ein und lösche anschliessend dieses Dokument.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Webanwendung:" + +#: documents.py:78 +msgid "Username" +msgstr "Benutzername" + +#: documents.py:79 +msgid "Password" +msgstr "Passwort" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nHier können Sie Ihre Emails online ansehen, Filter oder Kontakte erstellen.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Bitte ändern Sie Ihr Passwort!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "PC/Tablet/Smartphone Konfiguration:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "SMTP Serveradresse" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "SMTP Server-Port" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "SMTP-Verbindungssicherheit" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "IMAP Serveradresse" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "IMAP Server-Port" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "IMAP Verbindungssicherheit" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Verwenden Sie diese Einstellungen für Ihren Computer, Ihr Tablet oder Telefon" + +#: forms.py:20 +msgid "Documents storage" +msgstr "Dokumentenablage" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Speicherpfad für Dokumente" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Dateipfad in dem die PDF-Dokumente abgelegt werden" + +#: forms.py:28 +msgid "Security options" +msgstr "Sicherheitseinstellungen" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Lösche Dokumente nach dem ersten Download" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Löscht automatisch das Dokument, wenn es das erste Mal über dieses Oberfläche heruntergeladen wurde" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Erzeuge Dokumente nur wenn ein Konto angelegt wurde" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Erzeuge ein neues Dokument nur wenn ein neues Konto erstellt wurde. Wenn die Option auf Nein steht wird jedes Mal ein neues Dokument erstellt, wenn ein Passwort aktualisiert wurde." + +#: forms.py:49 +msgid "Customization options" +msgstr "Individuell angepasste Optionen" + +#: forms.py:52 +msgid "Title" +msgstr "Titel" + +#: forms.py:54 +msgid "The document's title" +msgstr "Titel des Dokuments" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL der Webanwendung" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL der Modoboa Webanwendung" + +#: forms.py:63 +msgid "Custom message" +msgstr "Eigener Nachrichtentext" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Eine eigene Nachricht, die am Ende des Dokuments angezeigt wird" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Verbindungseinstellungen für Mailprogramme einschließen" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Erforderliche SMTP und IMAP Einstellungen zur Konfiguration von Mailprogramme, Tablets oder Telefonen" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Adresse des SMTP-Servers (Hostname oder IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Port, auf dem der SMTP-Server erreicht werden kann" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Mechanismus zur Verbindungssicherung" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Adresse des IMAP-Servers (Hostname oder IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Port, auf dem der IMAP-Servier erreicht werden kann" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Erhalte die Anmeldeinformationen des Benutzer als ein PDF-Dokument" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Ein Fehler ist bei der Erstellung des Pfades, der die PDF Dokumente (%s) enthält, aufgetreten. " + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "PDF Anmeldeinformationen" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Erzeuge PDF-Dokumente welche die Benutzeranmeldeinformationen enthält" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Kein Dokument für diesen Benutzer verfügbar" diff --git a/modoboa/pdfcredentials/locale/el_GR/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/el_GR/LC_MESSAGES/django.po new file mode 100644 index 000000000..e1c5bd632 --- /dev/null +++ b/modoboa/pdfcredentials/locale/el_GR/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Giannis Kapetanakis , 2016 +# Kostas Moumouris , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2017-10-12 13:30+0000\n" +"Last-Translator: Kostas Moumouris \n" +"Language-Team: Greek (Greece) (http://www.transifex.com/tonio/modoboa/language/el_GR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el_GR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "Κανένας" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Προσωπικές πληροφορίες λογαριασμού" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Powered by Modoboa - Mail hosting made simple" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nΑγαπητέ/ή %s, αυτό το έγγραφο περιέχει τα διαπιστευτήρια\nπου χρειάζεστε για να συνδεθείτε με το Modoboa.\nΑποστηθίστε το περιεχόμενο και διαγράψτε το έγγραφο\nτο συντομότερο δυνατόν.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Web panel:" + +#: documents.py:78 +msgid "Username" +msgstr "Όνομα Χρήστη" + +#: documents.py:79 +msgid "Password" +msgstr "Κωδικός" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nΕδώ μπορείτε να προβάλετε τα ηλεκτρονικά σας μηνύματα σε πραγματικό χρόνο, να δημιουργήσετε φίλτρα ή να διαχειριστείτε\n τις επαφές σας.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Παρακαλώ αλλάξτε το κωδικό σας!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "Ρυθμίσεις: PC/Tablet/Smartphone " + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Διεύθυνση SMTP Server" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Θύρα SMTP server" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Ασφάλεια σύνδεσης SMTP" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "Διεύθυνση IMAP server" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "θύρα IMAP Server" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Ασφάλεια σύνδεσης IMAP" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Χρησιμοποιήστε αυτές τις ρυθμίσεις για τον υπολογιστή, το tablet ή το τηλέφωνό σας." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Αποθηκευτικός χώρος εγγράφων" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Κατάλογος αρχείων για την αποθήκευση εγγράφων" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Κατάλογος αρχείων για την αποθήκευση PDF εγγράφων" + +#: forms.py:28 +msgid "Security options" +msgstr "Ρυθμίσεις Ασφαλείας" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Διαγραφή εγγράφων μετά την πρώτη λήψη" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Αυτόματη διαγραφή εγγράφου μετά την πρώτη λήψη από αυτήν την διεπαφή" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Δημιουργία εγγράφων μόνο κατά την δημιουργία λογαριασμού" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Δημιουργία νέου εγγράφου μόνο κατά την δημιουργία νέου λογαριασμού. Εάν επιλέξετε όχι, ένα νέο έγγραφο θα δημιουργείται κάθε φορά που ο κωδικός χρήστη ενημερώνεται." + +#: forms.py:49 +msgid "Customization options" +msgstr "Επιλογές προσαρμογής" + +#: forms.py:52 +msgid "Title" +msgstr "Τίτλος" + +#: forms.py:54 +msgid "The document's title" +msgstr "Ο τίτλος του εγγράφου" + +#: forms.py:58 +msgid "Web panel url" +msgstr "Διεύθυνση Web panel" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL του Modoboa web panel" + +#: forms.py:63 +msgid "Custom message" +msgstr "Προσαρμοσμένο μήνυμα" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Ένα προσαρμοσμένο μήνυμα που θα εμφανιστεί στο τέλος των εγγράφων" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Συμπεριλάβε τις ρυθμίσεις σύνδεσης προγράμματος αλληλογραφίας" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Συμπεριέλαβε της απαιτούμενες ρυθμίσης SMTP και IMAP για διασύνδεση με προγράμματα emai, τάμπλετ και τηλέφωνα" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Διεύθυνση από τον SMTP server (hostname ή IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Οι θύρες που ακούει ό SMTP Server" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Μηχανισμός ασφαλείας σύνδεσης" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Διεύθυνση του IMAP server (hostname ή IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Η θύρα που ακούει ο IMAP Server" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Ανάκτηση διαπιστευτηρίων χρήστη σε αρχείο PDF" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Σφάλμα στην δημιουργία του καταλόγου αρχείων για την αποθήκευση PDF εγγράφων (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "Διαπιστευτήρια PDF" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Δημιουργία PDF εγγράφων που να περιέχουν τα διαπιστευτήρια χρηστών" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Δεν υπάρχουν διαθέσιμα έγγραφα για αυτόν τον χρήστη" diff --git a/modoboa/pdfcredentials/locale/en/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/en/LC_MESSAGES/django.po new file mode 100644 index 000000000..7405024a2 --- /dev/null +++ b/modoboa/pdfcredentials/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,209 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: constants.py:7 +msgid "None" +msgstr "" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "" + +#: documents.py:75 +msgid "Web panel:" +msgstr "" + +#: documents.py:78 +msgid "Username" +msgstr "" + +#: documents.py:79 +msgid "Password" +msgstr "" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "" + +#: forms.py:20 +msgid "Documents storage" +msgstr "" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "" + +#: forms.py:28 +msgid "Security options" +msgstr "" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "" + +#: forms.py:49 +msgid "Customization options" +msgstr "" + +#: forms.py:52 +msgid "Title" +msgstr "" + +#: forms.py:54 +msgid "The document's title" +msgstr "" + +#: forms.py:58 +msgid "Web panel url" +msgstr "" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "" + +#: forms.py:63 +msgid "Custom message" +msgstr "" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "" + +#: views.py:30 +msgid "No document available for this user" +msgstr "" diff --git a/modoboa/pdfcredentials/locale/fr/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 000000000..01b723e42 --- /dev/null +++ b/modoboa/pdfcredentials/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,210 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Antoine Nguyen , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2017-10-16 18:51+0000\n" +"Last-Translator: Antoine Nguyen \n" +"Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "Aucune" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Informations de compte personnel" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Propulsé par Modoboa - L'hébergement mail simplifié" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nCher %s, ce document contient les identifiants dont vous aurez\nbesoin pour vous connecter à Modoboa. Apprenez les puis détruisez\nce document le plus rapidement possible.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Console web :" + +#: documents.py:78 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: documents.py:79 +msgid "Password" +msgstr "Mot de passe" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nD'ici vous pouvez consulter vos emails en ligne n'importe quand, créer des filtres ou gérer vos contacts.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Merci de changer votre mot de passe !" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "Configuration PC/Tablette/Smartphone :" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Adresse du serveur SMTP" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Port du serveur SMTP" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Sécurité de la connexion SMTP" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "Adresse du serveur IMAP" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "Port du serveur IMAP" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Sécurité de la connexion IMAP" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Utilisez ces paramètres pour votre ordinateur, votre tablette ou votre téléphone." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Stockage des documents" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Répertoire dans lequel les documents sont sauvegardés" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Chemin d'accès vers le répertoire ou seront stockés les documents" + +#: forms.py:28 +msgid "Security options" +msgstr "Options de sécurité" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Supprimer les documents après le premier téléchargement" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Supprimer automatiquement un document juste après son premier téléchargement depuis cette interface" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Générer les documents à la création des comptes uniquement" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Génère un nouveau document uniquement lors de la création d'un compte. Si défini à non, un nouveau document sera généré chaque fois qu'un mot de passe est changé." + +#: forms.py:49 +msgid "Customization options" +msgstr "Options de personnalisation" + +#: forms.py:52 +msgid "Title" +msgstr "Titre" + +#: forms.py:54 +msgid "The document's title" +msgstr "Le titre du document" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL de la console web" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL de la console web Modoboa" + +#: forms.py:63 +msgid "Custom message" +msgstr "Message personnalisé" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Un message personnalisé qui apparaîtra en bas des documents." + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Inclure les paramètres de connexion pour client mail" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Inclure les paramètres de connexion nécessaires pour configurer un client mail, une tablette ou un téléphone" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Adresse du serveur SMTP (nom d'hôte ou IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Port d'écoute du serveur SMTP" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Mécanisme de sécurisation de la connexion" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Adresse du serveur IMAP (nom d'hôte ou IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Port d'écoute du serveur IMAP" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Récupérer les identifiant de l'utilisateur sous forme d'un document PDF" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Echec lors de la création du répertoire qui contiendra les documents PDF (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "Identifiants en PDF" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Génère des documents PDF contenant les identifiants des utilisateurs" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Aucun document disponible pour cet utilisateur" diff --git a/modoboa/pdfcredentials/locale/it/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/it/LC_MESSAGES/django.po new file mode 100644 index 000000000..fb1878d7e --- /dev/null +++ b/modoboa/pdfcredentials/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# marcotrevisan , 2018 +# Rocco , 2015 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-11-02 15:15+0000\n" +"Last-Translator: marcotrevisan \n" +"Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "Nessun valore" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Informazioni Personali" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Powered by Modoboa - Mail hosting made simple" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nGentile %s, questo documento contiene le credenziali di accesso \nper accedere a Modoboa. Leggilo e elimina\n il documento il prima possibile.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Pannello web:" + +#: documents.py:78 +msgid "Username" +msgstr "Nome Utente" + +#: documents.py:79 +msgid "Password" +msgstr "Password" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nQui puoi sempre visualizzare le tue email onlime, creare filtri\no gestire i tuoi contatti.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Per favore cambia la tua password!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "Configurazione PC/Tablet/Smartphone:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Indirizzo del server SMTP" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Porta del server SMTP" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Sicurezza della connessione al server SMTP" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "indirizzo del server IMAP" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "Porta del server IMAP" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Sicurezza della connessione al server IMAP" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Utilizza quelle impostazioni per il tuo computer, tablet o telefono." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Memorizzazione Documenti" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Cartella nella quale salvare i documenti" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Indirizzo della cartella dove i documenti PDF saranno salvati" + +#: forms.py:28 +msgid "Security options" +msgstr "Opzioni di sicurezza" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Cancella i documenti dopo averli scaricati" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Elimina automaticamente il documento dopo che è stato scaricato da questa interfaccia" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Genera documenti solo dopo la creazione dell'account" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Generare un nuovo documento solo quando si crea un nuovo account. Se impostato su no , un nuovo documento verrà creato ogni volta che la password viene aggiornata." + +#: forms.py:49 +msgid "Customization options" +msgstr "Opzioni di personalizzazione" + +#: forms.py:52 +msgid "Title" +msgstr "Titolo" + +#: forms.py:54 +msgid "The document's title" +msgstr "Il titolo del documento" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL del pannello di controllo web" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL del pannello di controllo web di Modoboa" + +#: forms.py:63 +msgid "Custom message" +msgstr "Messaggio personalizzato" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Un messaggio personalizzato comparirà alla fine dei documenti" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Includi le impostazioni di connessione del client di posta" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Includi le informazioni di connessione SMTP e IMAP richieste per configurare un client di posta, un tablet o telefono" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Indirizzo del server SMTP (nome host o indirizzo IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Porta di ascolto del server SMTP" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Meccanismo di sicurezza della connessione" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Indirizzo del server IMAP (nome host o indirizzo IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Porta di ascolto del server IMAP" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Recuperare le credenziali dell'utente come documento PDF" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Impossibile creare la cartella che conterrà i documenti PDF (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "Credenziali PDF" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Genera i documenti PDF con le credenziali dell'utente" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Non ci sono documenti disponibili er questo utente" diff --git a/modoboa/pdfcredentials/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/ja_JP/LC_MESSAGES/django.po new file mode 100644 index 000000000..2ec0ba19a --- /dev/null +++ b/modoboa/pdfcredentials/locale/ja_JP/LC_MESSAGES/django.po @@ -0,0 +1,210 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# cwatanab , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2017-09-27 10:02+0000\n" +"Last-Translator: Antoine Nguyen \n" +"Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/language/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: constants.py:7 +msgid "None" +msgstr "" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "個人アカウント情報" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Powered by Modoboa - メールホスティングをシンプルに" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\n%s さん\n\nこのドキュメントには、Modoboa へ接続するための必要な認証情報が書かれています。\n内容を理解したら、すみやかに廃棄してください。\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "" + +#: documents.py:78 +msgid "Username" +msgstr "ユーザ名" + +#: documents.py:79 +msgid "Password" +msgstr "パスワード" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "" + +#: forms.py:20 +msgid "Documents storage" +msgstr "ドキュメントストレージ" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "ドキュメントを保存するためのディレクトリ" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "PDF ドキュメントを保存するためのディレクトリのパス" + +#: forms.py:28 +msgid "Security options" +msgstr "セキュリティオプション" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "最初のダウンロードの後にドキュメントを削除する" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "このインターフェースから最初にダウンロードされたあとにドキュメントを自動的に削除する" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "アカウントを作成するときだけドキュメントを生成する" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "アカウントの作成されたときだけ、新しいドキュメントを生成します。\nもし「いいえ」設定すれば、新しい文書は、パスワードが更新されるたびに作成されます。" + +#: forms.py:49 +msgid "Customization options" +msgstr "" + +#: forms.py:52 +msgid "Title" +msgstr "" + +#: forms.py:54 +msgid "The document's title" +msgstr "" + +#: forms.py:58 +msgid "Web panel url" +msgstr "" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "" + +#: forms.py:63 +msgid "Custom message" +msgstr "" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "PDF ドキュメントとしてユーザー認証情報を取得します" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "PDFドキュメントを格納するディレクトリの作成に失敗しました (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "PDF 認証情報" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "ユーザーの認証情報を書かれた PDF ドキュメントを生成" + +#: views.py:30 +msgid "No document available for this user" +msgstr "このユーザーにはドキュメンがありません" diff --git a/modoboa/pdfcredentials/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/nl_NL/LC_MESSAGES/django.po new file mode 100644 index 000000000..0a828652a --- /dev/null +++ b/modoboa/pdfcredentials/locale/nl_NL/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# R Kloosterman , 2016 +# Tuxis Internet Engineering V.O.F. , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-01-31 08:43+0000\n" +"Last-Translator: Tuxis Internet Engineering V.O.F. \n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/tonio/modoboa/language/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Persoonlijke account informatie" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Aangeboden door Modoboa - Mail hosting made simple" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nBeste %s, dit document bevat alle gegevens dat u nodig\nheeft voor het gebruiken van Modoboa. Onthoud deze gegevens\nen verwijder dit document zo snel mogelijk.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Webpaneel:" + +#: documents.py:78 +msgid "Username" +msgstr "Gebruikersnaam" + +#: documents.py:79 +msgid "Password" +msgstr "Wachtwoord" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nHier kunt u uw e-mails online bekijken, filters aanmaken, of contactpersonen beheren.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Wijzig uw wachtwoord aub!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "PC/Tablet/Smartphone configuratie:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "SMTP serveradres" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "SMTP server poort" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "SMTP verbinding beveiliging" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "IMAP serveradres" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "IMAP server poort" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "IMAP verbinding beveiliging" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Gebruik deze instellingen voor uw computer, tablet of telefoon." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Document opslag" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Map voor het opslaan van de documenten" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Pad naar de map waar de PDF documenten worden opgeslagen" + +#: forms.py:28 +msgid "Security options" +msgstr "Beveiligings-opties" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Documenten verwijderen na eerste download" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Verwijder een document automatisch nadat het eenmalig is gedownload van paneel" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Genereer een document enkel bij het aanmaken van een account" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Genereer een document enkel wanneer een account is nieuw aangemaakt. Indien 'nee' is geselecteerd zal bij iedere wachtwoord wijziging een nieuw document worden gemaakt. " + +#: forms.py:49 +msgid "Customization options" +msgstr "Personaliseringsopties" + +#: forms.py:52 +msgid "Title" +msgstr "Titel" + +#: forms.py:54 +msgid "The document's title" +msgstr "Titel van het document" + +#: forms.py:58 +msgid "Web panel url" +msgstr "Webpaneel URL" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL van het Modoboa webpaneel" + +#: forms.py:63 +msgid "Custom message" +msgstr "Aangepast bericht" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Een aangepast bericht dat aan het einde van de documenten komt te staan" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Vraag de gebruikers gegevens op als een PDF document" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Het aanmaken van de map voor de PDF documenten is mislukt (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "PDF gegevens" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Genereer PDF document met de gegevens voor de gebruiker" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Geen document beschikbaar voor deze gebruiker" diff --git a/modoboa/pdfcredentials/locale/pl_PL/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/pl_PL/LC_MESSAGES/django.po new file mode 100644 index 000000000..20c3f866e --- /dev/null +++ b/modoboa/pdfcredentials/locale/pl_PL/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# sin88 , 2016 +# Tomasz Proć , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2017-12-02 10:36+0000\n" +"Last-Translator: Tomasz Proć \n" +"Language-Team: Polish (Poland) (http://www.transifex.com/tonio/modoboa/language/pl_PL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +#: constants.py:7 +msgid "None" +msgstr "Brak" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Informacje o koncie osobistym" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Powered by Modoboa - Mail hosting made simple" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nDrogi użytkowniku %s, ten dokument zawiera dane uwierzytelniające które będzeisz potrzebował to połączenia się. Zapoznaj się z nim i usuń go najszybciej jak to możliwe.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Panel web:" + +#: documents.py:78 +msgid "Username" +msgstr "Nazwa użytkownika" + +#: documents.py:79 +msgid "Password" +msgstr "Hasło" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nPod tym adresem możesz online przeczytać swoje wiadomości, stworzyć filtry lub zarządzać\n listą kontaktów.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Proszę zmienić swoje hasło!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "konfiguracją PC/Tabletu/Smartfonu:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Adres serwera SMTP" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Port serwera SMTP" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Zabezpieczenia połączenia SMTP" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "Adres serwera IMAP" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "Port serwera IMAP" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Zabezpieczenie połączenia IMAP" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Użyj tych ustawień w swoim komputerze, tablecie lub telefonie." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Magazyn dokumentów" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Lokalizacja gdzie zapisywać dokumenty" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Ścieżka do lokalizacji, gdzie będą zapisywane PDF'y" + +#: forms.py:28 +msgid "Security options" +msgstr "Opcje bezpieczeństwa" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Usuwaj dokumenty po ich pierwszym pobraniu" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Automatycznie usuwaj dokumenty jak tylko zostaną pobranie przez ten interfejs" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Generuj dokumenty tylko podczas zakładania konta" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Generuj nowy dokument tylko wtedy, kiedy nowe konto jest zakładane. Jeśli ustawione na nie, to nowy dokument będzie tworzony przy każdej zmianie hasła." + +#: forms.py:49 +msgid "Customization options" +msgstr "Opcje dostosowania" + +#: forms.py:52 +msgid "Title" +msgstr "Tytuł" + +#: forms.py:54 +msgid "The document's title" +msgstr "Tytuł dokumentu" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL panelu Web" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL panelu Modoboa" + +#: forms.py:63 +msgid "Custom message" +msgstr "Własna wiadomość" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Dodatkowa wiadomość która pojawi się na końcu dokumentu." + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Załącz ustawienia połączenia dla programu pocztowego klienta" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Załącz wymagane do konfiguracji, informacje o połączeniu SMTP i IMAP " + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Adres serwera SMTP (nazwa hosta lub IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Port nasłuchujący serwera SMTP" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Mechanizm zabezpieczenia połączenia" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Adres serwera IMAP (nazwa hosta lub IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Port nasłuchujący serwera IMAP" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Pobieranie danych uwierzytelniających użytkownika w formacie PDF" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Nie można utworzyć katalogu do przechowywania PDF'ów (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "Poświadczenia PDF" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Generuj dokumenty PDF zawierające dane uwierzytelniające użytkowników" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Brak dokumentu dla tego użytkownika" diff --git a/modoboa/pdfcredentials/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 000000000..41a9b5b47 --- /dev/null +++ b/modoboa/pdfcredentials/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Rafael Barretto , 2015 +# Rafael Barretto , 2017-2018 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-09-25 03:25+0000\n" +"Last-Translator: Rafael Barretto \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "Nenhuma" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Informações da conta pessoal" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Desenvolvido por Modoboa - Hospedagem de email de forma simples" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nCaro(a) %s, este documento contem as credenciais que você irá precisar\npara conectar ao Modoboa. Verifique o conteúdo e destrua\neste documento assim que possível.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Painel web:" + +#: documents.py:78 +msgid "Username" +msgstr "Nome de usuário" + +#: documents.py:79 +msgid "Password" +msgstr "Senha" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nAqui você poderá ver seus emails a qualquer momento online, crie filtros ou gerencie \nseus contatos.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Por favor mude sua senha!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "Configuração para PC/Tablet/Smartphone:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Endereço do servidor SMTP" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Porta do servidor SMTP" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Conexão segura SMTP" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "Endereço do servidor IMAP" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "Porta do servidor IMAP" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Conexão segura IMAP" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Use essas configurações para seu computador, tablet ou telefone." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Armazenamento de documentos" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Diretório para salvar documentos" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Caminho para o diretório onde os arquivos PDF serão salvos" + +#: forms.py:28 +msgid "Security options" +msgstr "Opções de segurança" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Deletar documentos após o primeiro download" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Excluir automaticamente um documento logo após a sua primeira transferência a partir desta interface" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Apenas gerar documentos na criação da conta" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Gerar um novo documento apenas quando uma nova conta é criada. Se definido como não, um novo documento será criado cada vez que uma senha é atualizada." + +#: forms.py:49 +msgid "Customization options" +msgstr "Opções de customização" + +#: forms.py:52 +msgid "Title" +msgstr "Título" + +#: forms.py:54 +msgid "The document's title" +msgstr "Título do documento" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL do painel web" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL do painel web do Modoboa" + +#: forms.py:63 +msgid "Custom message" +msgstr "Mensagem personalizada" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Uma mensagem personalizada irá aparecer no fim do documento" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Incluir configurações de conexão do cliente de email" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Incluir informações de conexão SMTP e IMAP necessárias para configurar um cliente de e-mail, um tablet ou um telefone" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Endereço do servidor SMTP (hostname ou IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Mecanismo de conexão segura" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Recuperar credenciais do usuário como um documento PDF" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Falha ao criar o diretório que conterá documentos PDF (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "Credenciais PDF" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Gerar documentos em PDF contendo as credenciais dos usuários" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Nenhum documento disponível para esse usuário" diff --git a/modoboa/pdfcredentials/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/pt_PT/LC_MESSAGES/django.po new file mode 100644 index 000000000..feb9e5fbd --- /dev/null +++ b/modoboa/pdfcredentials/locale/pt_PT/LC_MESSAGES/django.po @@ -0,0 +1,209 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2017-09-27 10:02+0000\n" +"Last-Translator: Antoine Nguyen \n" +"Language-Team: Portuguese (Portugal) (http://www.transifex.com/tonio/modoboa/language/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "" + +#: documents.py:75 +msgid "Web panel:" +msgstr "" + +#: documents.py:78 +msgid "Username" +msgstr "" + +#: documents.py:79 +msgid "Password" +msgstr "" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "" + +#: forms.py:20 +msgid "Documents storage" +msgstr "" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "" + +#: forms.py:28 +msgid "Security options" +msgstr "" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "" + +#: forms.py:49 +msgid "Customization options" +msgstr "" + +#: forms.py:52 +msgid "Title" +msgstr "" + +#: forms.py:54 +msgid "The document's title" +msgstr "" + +#: forms.py:58 +msgid "Web panel url" +msgstr "" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "" + +#: forms.py:63 +msgid "Custom message" +msgstr "" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "" + +#: views.py:30 +msgid "No document available for this user" +msgstr "" diff --git a/modoboa/pdfcredentials/locale/sv/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 000000000..804ce42ff --- /dev/null +++ b/modoboa/pdfcredentials/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Olle Gustafsson , 2016,2018 +# Tomas Olsson , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-08-14 08:40+0000\n" +"Last-Translator: Olle Gustafsson \n" +"Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "Ingen" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Personlig kontoinformation" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Drivs av Modoboa - Mail hosting gjort enkelt" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nKära %s, detta dokument innehåller de kontouppgifter du behöver för att ansluta till Modoboa. Lär dig innehållet i detta dokument och förstör detta dokument så snart som möjligt\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Webbpanel" + +#: documents.py:78 +msgid "Username" +msgstr "Användarnamn" + +#: documents.py:79 +msgid "Password" +msgstr "Lösenord" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nHär kan du se dina e-postmeddelanden när som helst online, skapa filter eller hantera\ndina kontakter.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Vänligen ändra ditt lösenord!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "PC/Tablet/Smartphone inställningar:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "SMTP server adress" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "SMTP server port" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "SMTP anslutningssäkerhet" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "IMAP server adress" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "IMAP server port" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "IMAP anslutningssäkerhet" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Använd dessa inställningar för din dator, surfplatta eller telefon." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Dokumentlagring" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Katalog att spara dokument till" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Sökväg till en katalog där PDF dokument kommer sparas" + +#: forms.py:28 +msgid "Security options" +msgstr "Säkerhetsinställningar" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Radera dokument efter första nedladdning" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Radera dokument automatiskt efter första nedladdningen" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Generera dokument endast vid kontoskapande" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Generera bara nya dokument när ett nytt konto skapas. Om detta sätts till nej, kommer ett nytt dokument skapas varje gång ett lösenord uppdateras." + +#: forms.py:49 +msgid "Customization options" +msgstr "Anpassningsalternativ" + +#: forms.py:52 +msgid "Title" +msgstr "Titel" + +#: forms.py:54 +msgid "The document's title" +msgstr "Dokumentets titel" + +#: forms.py:58 +msgid "Web panel url" +msgstr "Webbpanels länk " + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL till Modoboa webbpanel" + +#: forms.py:63 +msgid "Custom message" +msgstr "Anpassat meddelande" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Ett anpassat meddelande som kommer visas i slutet på dokumentet" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Inkludera e-post klient inställningar" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Inkludera SMTP och IMAP anslutningsinformation för att konfigurera en e-postklient, surfplatta eller telefon" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Adress till SMTP servern (värdnamn eller IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Lyssningsport för SMTP servern" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Anslutningssäkerhetsmekanism" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Adress till IMAP servern (värdnamn eller IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Lyssningsport för IMAP servern" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Hämta användares kontouppgifter som ett PDF dokument" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Kunde inte skapa katalogen som innehåller PDF dokumenten (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "PDF kontouppgifter" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Generera PDF dokument innehållande användares kontouppgifter" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Inga dokument tillgängliga för den här användaren" diff --git a/modoboa/pdfcredentials/models.py b/modoboa/pdfcredentials/models.py new file mode 100644 index 000000000..71a836239 --- /dev/null +++ b/modoboa/pdfcredentials/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/modoboa/pdfcredentials/rfc6266.py b/modoboa/pdfcredentials/rfc6266.py new file mode 100644 index 000000000..c0dacb2d1 --- /dev/null +++ b/modoboa/pdfcredentials/rfc6266.py @@ -0,0 +1,109 @@ +""" +Copy of the original rfc6266 package, just the generation part. + +Orginal code is available at https://github.com/g2p/rfc6266. +""" + +from urllib.parse import quote + + +# RFC 2616 +separator_chars = "()<>@,;:\\\"/[]?={} \t" +# RFC 5987 +attr_chars_nonalnum = '!#$&+-.^_`|~' + + +def percent_encode(string, safe, encoding): + return quote(string, safe, encoding, errors='strict') + + +def is_token_char(ch): + # Must be ascii, and neither a control char nor a separator char + asciicode = ord(ch) + # < 128 means ascii, exclude control chars at 0-31 and 127, + # exclude separator characters. + return 31 < asciicode < 127 and ch not in separator_chars + + +def is_token(candidate): + return all(is_token_char(ch) for ch in candidate) + + +def is_ascii(text): + return all(ord(ch) < 128 for ch in text) + + +def fits_inside_codec(text, codec): + try: + text.encode(codec) + except UnicodeEncodeError: + return False + else: + return True + + +def is_lws_safe(text): + return normalize_ws(text) == text + + +def normalize_ws(text): + return ' '.join(text.split()) + + +def qd_quote(text): + return text.replace('\\', '\\\\').replace('"', '\\"') + + +def build_header( + filename, disposition='attachment', filename_compat=None +): + """Generate a Content-Disposition header for a given filename. + For legacy clients that don't understand the filename* parameter, + a filename_compat value may be given. + It should either be ascii-only (recommended) or iso-8859-1 only. + In the later case it should be a character string + (unicode in Python 2). + Options for generating filename_compat (only useful for legacy clients): + - ignore (will only send filename*); + - strip accents using unicode's decomposing normalisations, + which can be done from unicode data (stdlib), and keep only ascii; + - use the ascii transliteration tables from Unidecode (PyPI); + - use iso-8859-1 + Ignore is the safest, and can be used to trigger a fallback + to the document location (which can be percent-encoded utf-8 + if you control the URLs). + See https://tools.ietf.org/html/rfc6266#appendix-D + """ + + # While this method exists, it could also sanitize the filename + # by rejecting slashes or other weirdness that might upset a receiver. + + if disposition != 'attachment': + assert is_token(disposition) + + rv = disposition + + if is_token(filename): + rv += '; filename=%s' % (filename, ) + return rv + elif is_ascii(filename) and is_lws_safe(filename): + qd_filename = qd_quote(filename) + rv += '; filename="%s"' % (qd_filename, ) + if qd_filename == filename: + # RFC 6266 claims some implementations are iffy on qdtext's + # backslash-escaping, we'll include filename* in that case. + return rv + elif filename_compat: + if is_token(filename_compat): + rv += '; filename=%s' % (filename_compat, ) + else: + assert is_lws_safe(filename_compat) + rv += '; filename="%s"' % (qd_quote(filename_compat), ) + + # alnum are already considered always-safe, but the rest isn't. + # Python encodes ~ when it shouldn't, for example. + rv += "; filename*=utf-8''%s" % (percent_encode( + filename, safe=attr_chars_nonalnum, encoding='utf-8'), ) + + # This will only encode filename_compat, if it used non-ascii iso-8859-1. + return rv.encode('iso-8859-1') diff --git a/modoboa/pdfcredentials/tests.py b/modoboa/pdfcredentials/tests.py new file mode 100644 index 000000000..885528ffa --- /dev/null +++ b/modoboa/pdfcredentials/tests.py @@ -0,0 +1,147 @@ +"""PDF credentials tests.""" + +import os +import shutil +import tempfile + +from django.test import override_settings +from django.urls import reverse + +from modoboa.admin import factories as admin_factories +from modoboa.core import models as core_models + +from modoboa.lib.tests import ModoTestCase + + +class EventsTestCase(ModoTestCase): + """Test event handlers.""" + + @classmethod + def setUpTestData(cls): + """Create some data.""" + super(EventsTestCase, cls).setUpTestData() + admin_factories.DomainFactory(name="test.com") + + def setUp(self): + """Create temp. directory to store files.""" + super(EventsTestCase, self).setUp() + self.workdir = tempfile.mkdtemp() + self.set_global_parameter("storage_dir", self.workdir) + + def tearDown(self): + """Reset test env.""" + shutil.rmtree(self.workdir) + + def _create_account(self, username, expected_status=200): + """Create a test account.""" + values = { + "username": username, + "first_name": "Tester", "last_name": "Toto", + "role": "SimpleUsers", "quota_act": True, + "is_active": True, "email": username, + "random_password": True, "stepid": 2 + } + response = self.client.post( + reverse("admin:account_add"), values, + HTTP_X_REQUESTED_WITH="XMLHttpRequest") + self.assertEqual(response.status_code, expected_status) + return values + + def test_password_updated(self): + """Check that document is generated at account creation/update.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + + # Check if link is present in listing page + response = self.ajax_get(reverse("admin:_identity_list")) + self.assertIn('name="get_credentials"', response["rows"]) + + # Try to download the file + response = self.client.get( + reverse("pdfcredentials:account_credentials", + args=[account.pk])) + self.assertEqual(response.status_code, 200) + self.assertEqual(response["Content-Type"], "application/pdf") + + # File have been deleted? + self.assertFalse(os.path.exists(fname)) + + # Try to download a second time + response = self.client.get( + reverse("pdfcredentials:account_credentials", + args=[account.pk])) + self.assertContains(response, "No document available for this user") + + # Update account + values.update({"language": "en"}) + self.ajax_post( + reverse("admin:account_change", args=[account.pk]), values + ) + self.assertFalse(os.path.exists(fname)) + + self.set_global_parameter("generate_at_creation", False) + self.ajax_post( + reverse("admin:account_change", args=[account.pk]), values + ) + self.assertTrue(os.path.exists(fname)) + + def test_with_connection_settings(self): + """Add connection settings to documents.""" + self.set_global_parameter("include_connection_settings", True) + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_with_custom_message(self): + """Add custom message to documents.""" + self.set_global_parameter("custom_message", "This is a test message.") + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_account_delete(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + self.ajax_post( + reverse("admin:account_delete", args=[account.pk]), {} + ) + self.assertFalse(os.path.exists(fname)) + + @override_settings(MODOBOA_LOGO="modoboa.png") + def test_with_custom_logo(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_download_and_delete_account(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + + # Try to download the file + response = self.client.get( + reverse("pdfcredentials:account_credentials", + args=[account.pk])) + self.assertEqual(response.status_code, 200) + self.assertEqual(response["Content-Type"], "application/pdf") + + # File have been deleted? + self.assertFalse(os.path.exists(fname)) + + # Delete account + self.ajax_post( + reverse("admin:account_delete", args=[account.pk]), {} + ) + + def test_storage_dir_creation(self): + """Test storage directory creation.""" + self.set_global_parameter("storage_dir", "/nonexistentdir") + self._create_account("leon@test.com", expected_status=500) diff --git a/modoboa/pdfcredentials/urls.py b/modoboa/pdfcredentials/urls.py new file mode 100644 index 000000000..9a13a5b3c --- /dev/null +++ b/modoboa/pdfcredentials/urls.py @@ -0,0 +1,10 @@ +from django.urls import path + +from . import views + +app_name = "pdfcredentials" + +urlpatterns = [ + path('credentials//', views.get_account_credentials, + name="account_credentials"), +] diff --git a/modoboa/pdfcredentials/views.py b/modoboa/pdfcredentials/views.py new file mode 100644 index 000000000..584675db7 --- /dev/null +++ b/modoboa/pdfcredentials/views.py @@ -0,0 +1,37 @@ +"""modoboa.pdfcredentials views.""" + +import os + +from django.http import HttpResponse +from django.utils.translation import ugettext as _ + +from django.contrib.auth.decorators import ( + login_required, permission_required +) + +from modoboa.core.models import User +from modoboa.lib.exceptions import ModoboaException, PermDeniedException +from modoboa.parameters import tools as param_tools + +from .lib import decrypt_file, get_creds_filename +from .rfc6266 import build_header + + +@login_required +@permission_required("core.add_user") +def get_account_credentials(request, accountid): + """View to download a document.""" + account = User.objects.get(pk=accountid) + if not request.user.can_access(account): + raise PermDeniedException() + fname = get_creds_filename(account) + if not os.path.exists(fname): + raise ModoboaException(_("No document available for this user")) + content = decrypt_file(fname) + if param_tools.get_global_parameter("delete_first_dl"): + os.remove(fname) + resp = HttpResponse(content) + resp["Content-Type"] = "application/pdf" + resp["Content-Length"] = len(content) + resp["Content-Disposition"] = build_header(os.path.basename(fname)) + return resp diff --git a/modoboa/urls.py b/modoboa/urls.py index 159d2583e..75ce14626 100644 --- a/modoboa/urls.py +++ b/modoboa/urls.py @@ -27,6 +27,7 @@ urlpatterns = [ path('', include("modoboa.core.urls")), path('admin/', include("modoboa.admin.urls")), path('dnstools/', include("modoboa.dnstools.urls")), + path('pdfcredentials', include("modoboa.pdfcredentials.urls")), path('stats/', include("modoboa.maillog.urls")), path('user/forward/', user_views.forward, name="user_forward"), diff --git a/modoboa/urls_api_v2.py b/modoboa/urls_api_v2.py index b6376b088..06ee56864 100644 --- a/modoboa/urls_api_v2.py +++ b/modoboa/urls_api_v2.py @@ -15,6 +15,7 @@ urlpatterns = [ path('', include("modoboa.dnstools.api.v2.urls")), path('', include("modoboa.maillog.api.v2.urls")), path('', include("modoboa.transport.api.v2.urls")), + path('', include("modoboa.pdfcredentials.api.v2.urls")), ] urlpatterns += exts_pool.get_urls(category="api") diff --git a/requirements.txt b/requirements.txt index 4e4c4de50..db8e88ad5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,3 +37,6 @@ qrcode aiosmtplib aioredis==2.0.1 + +# PDF credentials +reportlab \ No newline at end of file diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index f0d1b63de..4e304bd0d 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -88,6 +88,7 @@ MODOBOA_APPS = ( 'modoboa.dnstools', 'modoboa.policyd', 'modoboa.maillog', + 'modoboa.pdfcredentials', # Modoboa extensions here. ) From ec4ac89e8e7552f474da90a8b2709b817cce92af Mon Sep 17 00:00:00 2001 From: Spitap Date: Sat, 18 Feb 2023 11:11:16 +0100 Subject: [PATCH 02/25] fixed tests --- modoboa/admin/api/v2/serializers.py | 2 +- modoboa/core/tests/test_views.py | 14 ++++++++++++++ modoboa/lib/tests/__init__.py | 5 +++++ modoboa/parameters/api/v2/tests.py | 4 ++-- modoboa/pdfcredentials/api/v2/tests.py | 7 ------- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py index a6d2c0e06..e1310ebf9 100644 --- a/modoboa/admin/api/v2/serializers.py +++ b/modoboa/admin/api/v2/serializers.py @@ -540,7 +540,7 @@ class WritableAccountSerializer(v1_serializers.WritableAccountSerializer): instance.set_password(password) if mailbox_data: creator = self.context["request"].user - if hasattr(instance, "mailbox") and "mailbox" in validated_data: + if hasattr(instance, "mailbox"): if "username" in validated_data: mailbox_data["email"] = validated_data["username"] instance.email = validated_data["username"] diff --git a/modoboa/core/tests/test_views.py b/modoboa/core/tests/test_views.py index 1c14f2d8f..19fbb306c 100644 --- a/modoboa/core/tests/test_views.py +++ b/modoboa/core/tests/test_views.py @@ -93,6 +93,20 @@ SETTINGS_SAMPLE = { "maillog-logfile": "/var/log/mail.log", "maillog-rrd_rootdir": "/tmp", "maillog-greylist": False, + "pdfcredentials-enabled_pdfcredentials": True, + "pdfcredentials-storage_dir": "./", + "pdfcredentials-delete_first_dl": True, + "pdfcredentials-generate_at_creation": True, + "pdfcredentials-title": "Modoboa", + "pdfcredentials-webpanel_url": "local.host/", + "pdfcredentials-custom_message": "test", + "pdfcredentials-include_connection_settings": False, + "pdfcredentials-smtp_server_address": "127.0.0.1", + "pdfcredentials-smtp_server_port": 666, + "pdfcredentials-smtp_connection_security": "starttls", + "pdfcredentials-imap_server_address": "127.0.0.1", + "pdfcredentials-imap_server_port": 667, + "pdfcredentials-imap_connection_security": "starttls" } diff --git a/modoboa/lib/tests/__init__.py b/modoboa/lib/tests/__init__.py index 608197a41..eda6d56bf 100644 --- a/modoboa/lib/tests/__init__.py +++ b/modoboa/lib/tests/__init__.py @@ -1,6 +1,7 @@ """Testing utilities.""" import socket +import tempfile from django.conf import settings from django.core import management @@ -65,6 +66,8 @@ class ModoTestCase(ParametersMixin, TestCase): """Initiate test context.""" self.assertEqual( self.client.login(username=username, password=password), True) + self.workdir = tempfile.mkdtemp() + self.set_global_parameter("storage_dir", self.workdir, app="pdfcredentials") def ajax_request(self, method, url, params=None, status=200): if params is None: @@ -102,6 +105,8 @@ class ModoAPITestCase(ParametersMixin, APITestCase): """Setup.""" super(ModoAPITestCase, self).setUp() self.client.credentials(HTTP_AUTHORIZATION="Token " + self.token.key) + self.workdir = tempfile.mkdtemp() + self.set_global_parameter("storage_dir", self.workdir, app="pdfcredentials") def create_session(self): """Enable session storage across requests.""" diff --git a/modoboa/parameters/api/v2/tests.py b/modoboa/parameters/api/v2/tests.py index 0803b650d..33cf993be 100644 --- a/modoboa/parameters/api/v2/tests.py +++ b/modoboa/parameters/api/v2/tests.py @@ -11,8 +11,8 @@ class ParametersAPITestCase(ModoAPITestCase): url = reverse("v2:parameter-applications") resp = self.client.get(url) self.assertEqual(resp.status_code, 200) - # core, admin, limits - self.assertEqual(len(resp.json()), 3) + # core, admin, limits, pdf credentials + self.assertEqual(len(resp.json()), 4) def test_get_structure(self): url = reverse("v2:parameter-structure") diff --git a/modoboa/pdfcredentials/api/v2/tests.py b/modoboa/pdfcredentials/api/v2/tests.py index c970eaf9a..aa5cf5391 100644 --- a/modoboa/pdfcredentials/api/v2/tests.py +++ b/modoboa/pdfcredentials/api/v2/tests.py @@ -1,6 +1,5 @@ """API v2 tests.""" -import tempfile import shutil import os @@ -20,12 +19,6 @@ class PDFCredentialViewTestCase(ModoAPITestCase): super().setUpTestData() factories.populate_database() - def setUp(self): - """Create temp. directory to store files.""" - super().setUp() - self.workdir = tempfile.mkdtemp() - self.set_global_parameter("storage_dir", self.workdir) - def tearDown(self): """Reset test env.""" shutil.rmtree(self.workdir) From faf718d7a0cf5a665cbbc8515cdd2b30e1439f5a Mon Sep 17 00:00:00 2001 From: Spitap Date: Sat, 18 Feb 2023 11:22:27 +0100 Subject: [PATCH 03/25] simpler fail if logo is not found --- modoboa/pdfcredentials/documents.py | 4 +++- modoboa/pdfcredentials/lib.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/modoboa/pdfcredentials/documents.py b/modoboa/pdfcredentials/documents.py index 21399a6d6..adaf9b572 100644 --- a/modoboa/pdfcredentials/documents.py +++ b/modoboa/pdfcredentials/documents.py @@ -62,7 +62,9 @@ def credentials(account, password): buff = BytesIO() doc = SimpleDocTemplate(buff, pagesize=A4) story = [] - story.append(resized_image(lib.get_document_logo(), 8*cm)) + logo = lib.get_document_logo() + if logo is not None: + story.append(resized_image(logo, 8*cm)) story.append(Spacer(1, 1 * cm)) story.append(Paragraph(conf["title"], styles["Title"])) story.append(Spacer(1, 1 * cm)) diff --git a/modoboa/pdfcredentials/lib.py b/modoboa/pdfcredentials/lib.py index 2d9785bbf..937dd6731 100644 --- a/modoboa/pdfcredentials/lib.py +++ b/modoboa/pdfcredentials/lib.py @@ -96,6 +96,9 @@ def get_document_logo(): logo = settings.MODOBOA_CUSTOM_LOGO logo = os.path.join(settings.MEDIA_ROOT, os.path.basename(logo)) except AttributeError: - logo = os.path.join(settings.STATIC_ROOT, "css/modoboa.png") + try: + logo = os.path.join(settings.STATIC_ROOT, "css/modoboa.png") + except OSError: + return None finally: return logo From 0987a482fd5963d2d2acace02df775cb6740e3a5 Mon Sep 17 00:00:00 2001 From: Spitap Date: Sat, 18 Feb 2023 11:41:17 +0100 Subject: [PATCH 04/25] prevent crash if logo is not found --- modoboa/pdfcredentials/lib.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/modoboa/pdfcredentials/lib.py b/modoboa/pdfcredentials/lib.py index 937dd6731..a7bd85a4d 100644 --- a/modoboa/pdfcredentials/lib.py +++ b/modoboa/pdfcredentials/lib.py @@ -96,9 +96,7 @@ def get_document_logo(): logo = settings.MODOBOA_CUSTOM_LOGO logo = os.path.join(settings.MEDIA_ROOT, os.path.basename(logo)) except AttributeError: - try: - logo = os.path.join(settings.STATIC_ROOT, "css/modoboa.png") - except OSError: - return None - finally: - return logo + logo = os.path.join(settings.STATIC_ROOT, "css/modoboa.png") + if not os.path.isfile(logo): + return None + return logo From 00a6b638418e49c476217eec096c8fb271ed204e Mon Sep 17 00:00:00 2001 From: Spitap Date: Fri, 17 Feb 2023 18:09:11 +0100 Subject: [PATCH 05/25] added pdfcredential native support --- .../components/identities/IdentityList.vue | 11 + modoboa/admin/api/v2/serializers.py | 30 ++- modoboa/admin/signals.py | 1 + modoboa/core/app_settings.py | 4 +- .../core/commands/templates/settings.py.tpl | 1 + modoboa/pdfcredentials/__init__.py | 3 + modoboa/pdfcredentials/api/v2/__init__.py | 0 modoboa/pdfcredentials/api/v2/handlers.py | 32 +++ modoboa/pdfcredentials/api/v2/serializers.py | 65 +++++ modoboa/pdfcredentials/api/v2/tests.py | 153 +++++++++++ modoboa/pdfcredentials/api/v2/urls.py | 11 + modoboa/pdfcredentials/api/v2/views.py | 39 +++ modoboa/pdfcredentials/app_settings.py | 243 ++++++++++++++++++ modoboa/pdfcredentials/apps.py | 35 +++ modoboa/pdfcredentials/constants.py | 10 + modoboa/pdfcredentials/documents.py | 131 ++++++++++ modoboa/pdfcredentials/forms.py | 146 +++++++++++ modoboa/pdfcredentials/handlers.py | 53 ++++ modoboa/pdfcredentials/lib.py | 101 ++++++++ .../locale/cs_CZ/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/de/LC_MESSAGES/django.po | 212 +++++++++++++++ .../locale/el_GR/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/en/LC_MESSAGES/django.po | 209 +++++++++++++++ .../locale/fr/LC_MESSAGES/django.po | 210 +++++++++++++++ .../locale/it/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/ja_JP/LC_MESSAGES/django.po | 210 +++++++++++++++ .../locale/nl_NL/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/pl_PL/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/pt_BR/LC_MESSAGES/django.po | 211 +++++++++++++++ .../locale/pt_PT/LC_MESSAGES/django.po | 209 +++++++++++++++ .../locale/sv/LC_MESSAGES/django.po | 211 +++++++++++++++ modoboa/pdfcredentials/models.py | 3 + modoboa/pdfcredentials/rfc6266.py | 109 ++++++++ modoboa/pdfcredentials/tests.py | 147 +++++++++++ modoboa/pdfcredentials/urls.py | 10 + modoboa/pdfcredentials/views.py | 37 +++ modoboa/urls.py | 1 + modoboa/urls_api_v2.py | 1 + requirements.txt | 3 + test_project/test_project/settings.py | 1 + 40 files changed, 3904 insertions(+), 4 deletions(-) create mode 100644 modoboa/pdfcredentials/__init__.py create mode 100644 modoboa/pdfcredentials/api/v2/__init__.py create mode 100644 modoboa/pdfcredentials/api/v2/handlers.py create mode 100644 modoboa/pdfcredentials/api/v2/serializers.py create mode 100644 modoboa/pdfcredentials/api/v2/tests.py create mode 100644 modoboa/pdfcredentials/api/v2/urls.py create mode 100644 modoboa/pdfcredentials/api/v2/views.py create mode 100644 modoboa/pdfcredentials/app_settings.py create mode 100644 modoboa/pdfcredentials/apps.py create mode 100644 modoboa/pdfcredentials/constants.py create mode 100644 modoboa/pdfcredentials/documents.py create mode 100644 modoboa/pdfcredentials/forms.py create mode 100644 modoboa/pdfcredentials/handlers.py create mode 100644 modoboa/pdfcredentials/lib.py create mode 100644 modoboa/pdfcredentials/locale/cs_CZ/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/de/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/el_GR/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/en/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/fr/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/it/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/ja_JP/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/nl_NL/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/pl_PL/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/pt_BR/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/pt_PT/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/locale/sv/LC_MESSAGES/django.po create mode 100644 modoboa/pdfcredentials/models.py create mode 100644 modoboa/pdfcredentials/rfc6266.py create mode 100644 modoboa/pdfcredentials/tests.py create mode 100644 modoboa/pdfcredentials/urls.py create mode 100644 modoboa/pdfcredentials/views.py diff --git a/frontend/src/components/identities/IdentityList.vue b/frontend/src/components/identities/IdentityList.vue index 1a10fb245..991fba2fc 100644 --- a/frontend/src/components/identities/IdentityList.vue +++ b/frontend/src/components/identities/IdentityList.vue @@ -164,6 +164,17 @@ export default { getMenuItems (item) { const result = [] if (item.type === 'account') { + item.possible_actions.forEach(element => { + result.push({ + label: this.$gettext(element.label), + icon: element.icon, + link: element.url, + onClick: () => { + window.open(element.url) + this.fetchIdentities() + } + }) + }) result.push({ label: this.$gettext('Edit'), icon: 'mdi-circle-edit-outline', onClick: this.editAccount }) result.push({ label: this.$gettext('Delete'), icon: 'mdi-delete-outline', onClick: this.deleteAccount, color: 'red' }) } else if (item.type === 'alias') { diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py index 84bccec49..a6d2c0e06 100644 --- a/modoboa/admin/api/v2/serializers.py +++ b/modoboa/admin/api/v2/serializers.py @@ -14,6 +14,7 @@ from django.contrib.auth import password_validation from rest_framework import serializers +from modoboa.admin import signals as admin_signals from modoboa.admin.api.v1 import serializers as v1_serializers from modoboa.core import models as core_models, signals as core_signals from modoboa.lib import email_utils @@ -284,6 +285,15 @@ class TagSerializer(serializers.Serializer): type = serializers.CharField() +class IdPossibleActionsSerializer(serializers.Serializer): + """Serialiser used to get possible actions related to identities.""" + + name = serializers.CharField() + icon = serializers.CharField() + label = serializers.CharField() + url = serializers.URLField() + + class IdentitySerializer(serializers.Serializer): """Serializer used for identities.""" @@ -293,6 +303,24 @@ class IdentitySerializer(serializers.Serializer): name_or_rcpt = serializers.CharField() tags = TagSerializer(many=True) + def __init__(self, instance=None, data=..., **kwargs): + super().__init__(instance, data, **kwargs) + self.fields["possible_actions"] = serializers.SerializerMethodField() + + def get_possible_actions(self, identity): + if not isinstance(identity, core_models.User): + # Return empty action list if identity type is an alias (not used for now) + return [] + actions = admin_signals.extra_account_identities_actions.send( + self.__class__, account=identity) + cleaned_actions = [] + for action in actions: + try : + serialized_data = IdPossibleActionsSerializer(action[1]).data + cleaned_actions.append(serialized_data) + except (ValidationError, AttributeError): + continue + return cleaned_actions class AccountResourceSerializer(serializers.ModelSerializer): """Serializer for user resource.""" @@ -512,7 +540,7 @@ class WritableAccountSerializer(v1_serializers.WritableAccountSerializer): instance.set_password(password) if mailbox_data: creator = self.context["request"].user - if hasattr(instance, "mailbox"): + if hasattr(instance, "mailbox") and "mailbox" in validated_data: if "username" in validated_data: mailbox_data["email"] = validated_data["username"] instance.email = validated_data["username"] diff --git a/modoboa/admin/signals.py b/modoboa/admin/signals.py index d7e59ba9b..9610ec7bd 100644 --- a/modoboa/admin/signals.py +++ b/modoboa/admin/signals.py @@ -29,3 +29,4 @@ get_domain_form_instances = django.dispatch.Signal( import_object = django.dispatch.Signal(providing_args=["objtype"]) use_external_recipients = django.dispatch.Signal(providing_args=["recipients"]) new_dkim_keys = django.dispatch.Signal(providing_args=["domains"]) +extra_account_identities_actions = django.dispatch.Signal(providing_args=["account"]) \ No newline at end of file diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py index 7b4aaeee1..5a1fcdc5a 100644 --- a/modoboa/core/app_settings.py +++ b/modoboa/core/app_settings.py @@ -1,7 +1,5 @@ """Core settings.""" -from collections import OrderedDict - import collections from django import forms @@ -536,7 +534,7 @@ class GeneralParametersForm(param_forms.AdminParametersForm): ] def _add_dynamic_fields(self): - new_fields = OrderedDict() + new_fields = collections.OrderedDict() for field, value in self.fields.items(): new_fields[field] = value if field == "sms_provider": diff --git a/modoboa/core/commands/templates/settings.py.tpl b/modoboa/core/commands/templates/settings.py.tpl index bb9baf7d5..358ac4fe8 100644 --- a/modoboa/core/commands/templates/settings.py.tpl +++ b/modoboa/core/commands/templates/settings.py.tpl @@ -87,6 +87,7 @@ MODOBOA_APPS = ( 'modoboa.dnstools', 'modoboa.policyd', 'modoboa.maillog', + 'modoboa.pdfcredentials', # Modoboa extensions here. {% for extension in extensions %} '{{ extension }}', {% endfor %} diff --git a/modoboa/pdfcredentials/__init__.py b/modoboa/pdfcredentials/__init__.py new file mode 100644 index 000000000..7e1dfa1a8 --- /dev/null +++ b/modoboa/pdfcredentials/__init__.py @@ -0,0 +1,3 @@ +"""Generate PDF documents containing user credentials.""" + +default_app_config = "modoboa.pdfcredentials.apps.PDFCredentialsConfig" diff --git a/modoboa/pdfcredentials/api/v2/__init__.py b/modoboa/pdfcredentials/api/v2/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modoboa/pdfcredentials/api/v2/handlers.py b/modoboa/pdfcredentials/api/v2/handlers.py new file mode 100644 index 000000000..453136216 --- /dev/null +++ b/modoboa/pdfcredentials/api/v2/handlers.py @@ -0,0 +1,32 @@ +"""Handlers for PDF credientials api v2.""" + +import os + +from django.urls import reverse +from django.dispatch import receiver +from django.utils.translation import ugettext as _ + +from modoboa.admin import signals as admin_signals +from modoboa.parameters import tools as param_tools + +from ...lib import get_creds_filename + + +@receiver(admin_signals.extra_account_identities_actions) +def extra_identities_actions(sender, account, **kwargs): + """ + Add download credential action for identity. + Used for api v2. + """ + if not param_tools.get_global_parameter("enabled_pdfcredentials"): + return [] + fname = get_creds_filename(account) + if not os.path.exists(fname): + return [] + return { + "name": "get_credentials", + "url": reverse("v2:get-credentials", + args=[account.id]), + "icon": "mdi-file-download-outline", + "label": _("Download PDF credentials.") + } diff --git a/modoboa/pdfcredentials/api/v2/serializers.py b/modoboa/pdfcredentials/api/v2/serializers.py new file mode 100644 index 000000000..fba0a7809 --- /dev/null +++ b/modoboa/pdfcredentials/api/v2/serializers.py @@ -0,0 +1,65 @@ +"""Limits serializers for API v2.""" + +import os + +from django.utils.translation import ugettext_lazy as _ + +from rest_framework import serializers, status +from rest_framework.exceptions import PermissionDenied, APIException + + +from modoboa.core.models import User +from modoboa.parameters import tools as param_tools +from ...lib import decrypt_file, get_creds_filename + +from ...constants import CONNECTION_SECURITY_MODES + + +class PDFCredentialsSettingsSerializer(serializers.Serializer): + """A serializer for global parameters.""" + + # General + enabled_pdfcredentials = serializers.BooleanField(default=True) + + # Document storage + storage_dir = serializers.CharField(default="/var/lib/modoboa/pdf_credentials") + + # Security options + delete_first_dl = serializers.BooleanField(default=True) + generate_at_creation = serializers.BooleanField(default=True) + + # Customization options + title = serializers.CharField(default=_("Personal account information")) + webpanel_url = serializers.URLField() + custom_message = serializers.CharField(required=False, allow_blank=True) + include_connection_settings = serializers.BooleanField(default=False) + smtp_server_address = serializers.CharField() + smtp_server_port = serializers.IntegerField(default=587) + smtp_connection_security = serializers.ChoiceField(choices=CONNECTION_SECURITY_MODES, default="starttls") + imap_server_address = serializers.CharField() + imap_server_port = serializers.IntegerField(default=143) + imap_connection_security = serializers.ChoiceField(choices=CONNECTION_SECURITY_MODES, default="starttls") + + +class GetAccountCredentialsSerializer(serializers.Serializer): + """A serializer for get account credential view.""" + + account_id = serializers.IntegerField() + + def validate(self, data): + request = self.context["request"] + account = User.objects.get(pk=data["account_id"]) + if not request.user.can_access(account): + raise PermissionDenied() + self.context["account"] = account + return data + + + def save(self): + fname = get_creds_filename(self.context["account"]) + if not os.path.exists(fname): + raise APIException( _("No document available for this user"), status.HTTP_400_BAD_REQUEST) + self.context["content"] = decrypt_file(fname) + if param_tools.get_global_parameter("delete_first_dl"): + os.remove(fname) + self.context["fname"] = fname \ No newline at end of file diff --git a/modoboa/pdfcredentials/api/v2/tests.py b/modoboa/pdfcredentials/api/v2/tests.py new file mode 100644 index 000000000..c970eaf9a --- /dev/null +++ b/modoboa/pdfcredentials/api/v2/tests.py @@ -0,0 +1,153 @@ +"""API v2 tests.""" + +import tempfile +import shutil +import os + +from django.test import override_settings +from django.urls import reverse + +from modoboa.admin import factories +from modoboa.core import models as core_models +from modoboa.lib.tests import ModoAPITestCase + + +class PDFCredentialViewTestCase(ModoAPITestCase): + + @classmethod + def setUpTestData(cls): # NOQA:N802 + """Create test data.""" + super().setUpTestData() + factories.populate_database() + + def setUp(self): + """Create temp. directory to store files.""" + super().setUp() + self.workdir = tempfile.mkdtemp() + self.set_global_parameter("storage_dir", self.workdir) + + def tearDown(self): + """Reset test env.""" + shutil.rmtree(self.workdir) + + def _create_account(self, username, expected_status=201): + url = reverse("v2:account-list") + data = { + "username": f"{username}", + "role": "SimpleUsers", + "mailbox": { + "use_domain_quota": True + }, + "password": "Toto12345", + "language": "fr", + } + resp = self.client.post(url, data, format="json") + self.assertEqual(resp.status_code, expected_status) + return data + + def test_password_updated(self): + """Check that document is generated at account creation/update.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + + # Check if link is present in listing page + response = self.client.get(reverse("v2:identities-list"), format="json") + assert_action_in_response = False + for res_dict in response.json(): + for action in res_dict["possible_actions"]: + try: + if action.get("icon") == "mdi-file-download-outline": + assert_action_in_response = True + break + except KeyError: + continue + self.assertEqual(assert_action_in_response, True) + + # Try to download the file + response = self.client.get( + reverse("v2:get-credentials", + args=[account.pk])) + self.assertEqual(response.status_code, 200) + self.assertEqual(response["Content-Type"], "application/pdf") + + # File have been deleted? + self.assertFalse(os.path.exists(fname)) + + # Try to download a second time + response = self.client.get( + reverse("v2:get-credentials", + args=[account.pk])) + self.assertEqual(response.json()["detail"], "No document available for this user") + + # Update account + values.update({"language": "en"}) + self.client.patch( + reverse("v2:account-detail", args=[account.pk]), values, format='json' + ) + self.assertFalse(os.path.exists(fname)) + + self.set_global_parameter("generate_at_creation", False) + self.client.patch( + reverse("v2:account-detail", args=[account.pk]), values, format='json' + ) + self.assertTrue(os.path.exists(fname)) + + def test_with_connection_settings(self): + """Add connection settings to documents.""" + self.set_global_parameter("include_connection_settings", True) + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_with_custom_message(self): + """Add custom message to documents.""" + self.set_global_parameter("custom_message", "This is a test message.") + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_account_delete(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + url = reverse("v2:account-delete", args=[account.pk]) + self.client.post(url) + self.assertFalse(os.path.exists(fname)) + + @override_settings(MODOBOA_LOGO="modoboa.png") + def test_with_custom_logo(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_download_and_delete_account(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + + # Try to download the file + response = self.client.get( + reverse("v2:get-credentials", + args=[account.pk])) + self.assertEqual(response.status_code, 200) + self.assertEqual(response["Content-Type"], "application/pdf") + + # File have been deleted? + self.assertFalse(os.path.exists(fname)) + + # Delete account + url = reverse("v2:account-delete", args=[account.pk]) + self.client.post(url) + self.assertFalse(os.path.exists(fname)) + + def test_storage_dir_creation(self): + """Test storage directory creation.""" + self.set_global_parameter("storage_dir", "/nonexistentdir") + self._create_account("leon@test.com", expected_status=500) diff --git a/modoboa/pdfcredentials/api/v2/urls.py b/modoboa/pdfcredentials/api/v2/urls.py new file mode 100644 index 000000000..4b62a3ea0 --- /dev/null +++ b/modoboa/pdfcredentials/api/v2/urls.py @@ -0,0 +1,11 @@ +"""PDF Credentials API urls.""" + +from django.urls import path + + +from . import views + +urlpatterns = [ + path('credentials//', views.PDFCredentialView.as_view(), + name="get-credentials"), +] diff --git a/modoboa/pdfcredentials/api/v2/views.py b/modoboa/pdfcredentials/api/v2/views.py new file mode 100644 index 000000000..eb8b844eb --- /dev/null +++ b/modoboa/pdfcredentials/api/v2/views.py @@ -0,0 +1,39 @@ +"""PDF Credentials API v2 views.""" + +from django.utils.translation import ugettext as _ +from django.http import HttpResponse + +from rest_framework import permissions +from rest_framework.views import APIView + +from modoboa.admin.models import Domain + +from .serializers import GetAccountCredentialsSerializer + + +class PDFCredentialView(APIView): + + permission_classes = ( + permissions.IsAuthenticated, permissions.DjangoModelPermissions, + ) + + serializer_class = GetAccountCredentialsSerializer + + def get_queryset(self): + """Filter queryset based on current user.""" + return Domain.objects.get_for_admin(self.request.user) + + def get(self, request, *args, **kwargs): + """View to download a document.""" + data = {"account_id": kwargs["account_id"]} + serializer = GetAccountCredentialsSerializer(data=data, context={'request': request}) + serializer.is_valid(raise_exception=True) + serializer.save() + + content = serializer.context["content"] + fname = serializer.context["fname"] + resp = HttpResponse(content) + resp["Content-Type"] = "application/pdf" + resp["Content-Length"] = len(content) + resp["Content-Disposition"] = f"attachment; filename={fname};" + return resp diff --git a/modoboa/pdfcredentials/app_settings.py b/modoboa/pdfcredentials/app_settings.py new file mode 100644 index 000000000..b5bd958ba --- /dev/null +++ b/modoboa/pdfcredentials/app_settings.py @@ -0,0 +1,243 @@ +"""PDF Credentials forms.""" + +import collections + +from django import forms +from django.conf import settings +from django.utils.functional import cached_property +from django.utils.translation import ugettext_lazy as _ + +from django.contrib.sites import models as sites_models + +from modoboa.lib import form_utils +from modoboa.parameters import forms as param_forms + +from . import constants + + +PDF_CREDENTIALS_PARAMETERS_STRUCT = collections.OrderedDict([ + ("general", { + "label": _("General"), + "params": collections.OrderedDict([ + ("enabled_pdfcredentials", { + "label": _("Enable PDF credentials"), + "help_text": _( + "Enabled PDF credentials document generation on account creation."), + }) + ]) + }), + ("docstore", { + "label": _("Documents storage"), + "params": collections.OrderedDict([ + ("storage_dir", { + "label": _("Directory to save documents into"), + "help_text": _( + "Path to a directory where PDF documents will be saved"), + }), + ]) + }), + ("security", { + "label": _("Security options"), + "params": collections.OrderedDict([ + ("delete_first_dl", { + "label": _("Delete documents after the first download"), + "help_text": _( + "Automatically delete a document just after its first download " + "from this interface" + ) + }), + ("generate_at_creation", { + "label": _("Generate documents only at account creation"), + "help_text": _( + "Generate a new document only when a new account is created. " + "If set to no, a new document will be created each time a " + "password is updated." + ) + }) + ]) + }), + ("customization", { + "label": _("Customization options"), + "params": collections.OrderedDict([ + ("title", { + "label": _("Title"), + "help_text": _("The document's title") + }), + ("webpanel_url", { + "label": _("Web panel url"), + "help_text": _("URL of the Modoboa web panel") + }), + ("custom_message", { + "label": _("Custom message"), + "help_text": _( + "A custom message that will appear at the end of documents" + ) + }), + ("include_connection_settings", { + "label": _("Include mail client connection settings"), + "help_text": _( + "Include required SMTP and IMAP connection information to " + "configure a mail client, a tablet or a phone" + ) + }), + ("smtp_server_address", { + "label": _("SMTP server address"), + "help_text": _("Address of the SMTP server (hostname or IP)") + }), + ("smtp_server_port", { + "label": _("SMTP server port"), + "help_port": _("Listening port of the SMTP server") + }), + ("smtp_connection_security", { + "label": _("SMTP connection security"), + "help_text": _("Connection security mechanism") + }), + ("imap_server_address", { + "label": _("IMAP server address"), + "help_text": _("Address of the IMAP server (hostname or IP)") + }), + ("imap_server_port", { + "label": _("IMAP server port"), + "help_text": _("Listening port of the IMAP server") + }), + ("imap_connection_security", { + "label": _("IMAP connection security"), + "help_text": _("Connection security mechanism") + }) + ]) + }) +]) + + + +class ParametersForm(param_forms.AdminParametersForm): + """Admin parameters form.""" + + app = "pdfcredentials" + + general = form_utils.SeparatorField(label=_("General")) + + enabled_pdfcredentials = form_utils.YesNoField( + label= _("Enable PDF credentials"), + initial=True, + help_text=_("Enabled PDF credentials document generation on account creation.") + ) + + docstore = form_utils.SeparatorField(label=_("Documents storage")) + + storage_dir = forms.CharField( + label=_("Directory to save documents into"), + initial="/var/lib/modoboa/pdf_credentials", + help_text=_("Path to a directory where PDF documents will be saved"), + ) + + security = form_utils.SeparatorField(label=_("Security options")) + + delete_first_dl = form_utils.YesNoField( + label=_("Delete documents after the first download"), + initial=True, + help_text=_( + "Automatically delete a document just after its first download " + "from this interface" + ) + ) + + generate_at_creation = form_utils.YesNoField( + label=_("Generate documents only at account creation"), + initial=True, + help_text=_( + "Generate a new document only when a new account is created. " + "If set to no, a new document will be created each time a " + "password is updated." + ) + ) + + customization = form_utils.SeparatorField(label=_("Customization options")) + + title = forms.CharField( + label=_("Title"), + initial=_("Personal account information"), + help_text=_("The document's title") + ) + + webpanel_url = forms.URLField( + label=_("Web panel url"), + help_text=_("URL of the Modoboa web panel") + ) + + custom_message = forms.CharField( + label=_("Custom message"), + help_text=_( + "A custom message that will appear at the end of documents"), + required=False + ) + + include_connection_settings = form_utils.YesNoField( + label=_("Include mail client connection settings"), + initial=False, + help_text=_( + "Include required SMTP and IMAP connection information to " + "configure a mail client, a tablet or a phone" + ) + ) + + smtp_server_address = forms.CharField( + label=_("SMTP server address"), + help_text=_("Address of the SMTP server (hostname or IP)") + ) + + smtp_server_port = forms.IntegerField( + label=_("SMTP server port"), + initial=587, + help_text=_("Listening port of the SMTP server") + ) + + smtp_connection_security = forms.ChoiceField( + label=_("SMTP connection security"), + choices=constants.CONNECTION_SECURITY_MODES, + initial="starttls", + help_text=_("Connection security mechanism") + ) + + imap_server_address = forms.CharField( + label=_("IMAP server address"), + help_text=_("Address of the IMAP server (hostname or IP)") + ) + + imap_server_port = forms.IntegerField( + label=_("IMAP server port"), + initial=143, + help_text=_("Listening port of the IMAP server") + ) + + imap_connection_security = forms.ChoiceField( + label=_("IMAP connection security"), + choices=constants.CONNECTION_SECURITY_MODES, + initial="starttls", + help_text=_("Connection security mechanism") + ) + + visibility_rules = { + "smtp_server_address": "include_connection_settings=True", + "smtp_server_port": "include_connection_settings=True", + "smtp_connection_security": "include_connection_settings=True", + "imap_server_address": "include_connection_settings=True", + "imap_server_port": "include_connection_settings=True", + "imap_connection_security": "include_connection_settings=True", + } + + @cached_property + def hostname(self): + """Return local hostname.""" + return sites_models.Site.objects.get_current().domain + + def __init__(self, *args, **kwargs): + """Set initial values.""" + super(ParametersForm, self).__init__(*args, **kwargs) + if not self.fields["webpanel_url"].initial: + url = "https://{}{}".format(self.hostname, settings.LOGIN_URL) + self.fields["webpanel_url"].initial = url + if not self.fields["smtp_server_address"].initial: + self.fields["smtp_server_address"].initial = self.hostname + if not self.fields["imap_server_address"].initial: + self.fields["imap_server_address"].initial = self.hostname diff --git a/modoboa/pdfcredentials/apps.py b/modoboa/pdfcredentials/apps.py new file mode 100644 index 000000000..761eb4fe1 --- /dev/null +++ b/modoboa/pdfcredentials/apps.py @@ -0,0 +1,35 @@ +"""AppConfig for PDF credentials.""" + +from django.apps import AppConfig + +from django.utils.translation import ugettext_lazy + + +def load_pdfcredential_settings(): + """Load core settings. + + This function must be manually called (see :file:`urls.py`) in + order to load base settings. + """ + from modoboa.parameters import tools as param_tools + from . import app_settings + from .api.v2 import serializers + + param_tools.registry.add( + "global", app_settings.ParametersForm, ugettext_lazy("PDF credentials")) + param_tools.registry.add2( + "global", "pdfcredentials", ugettext_lazy("PDF Credentials"), + app_settings.PDF_CREDENTIALS_PARAMETERS_STRUCT, + serializers.PDFCredentialsSettingsSerializer) + + +class PDFCredentialsConfig(AppConfig): + """App configuration.""" + + name = "modoboa.pdfcredentials" + verbose_name = "PDF credentials for Modoboa" + + def ready(self): + from . import handlers + from .api.v2 import handlers + load_pdfcredential_settings() diff --git a/modoboa/pdfcredentials/constants.py b/modoboa/pdfcredentials/constants.py new file mode 100644 index 000000000..c0a407a9c --- /dev/null +++ b/modoboa/pdfcredentials/constants.py @@ -0,0 +1,10 @@ +"""PDF credentials constants.""" + +from django.utils.translation import ugettext_lazy + + +CONNECTION_SECURITY_MODES = [ + ("none", ugettext_lazy("None")), + ("starttls", "STARTTLS"), + ("tls", "TLS") +] diff --git a/modoboa/pdfcredentials/documents.py b/modoboa/pdfcredentials/documents.py new file mode 100644 index 000000000..21399a6d6 --- /dev/null +++ b/modoboa/pdfcredentials/documents.py @@ -0,0 +1,131 @@ +"""The code used to generate PDF files (based on Reportlab).""" + +from io import BytesIO + +from reportlab.lib import colors +from reportlab.lib.pagesizes import A4 +from reportlab.lib.units import cm +from reportlab.lib.enums import TA_CENTER +from reportlab.lib import utils +from reportlab.platypus import ( + SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Frame, + Image +) +from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle + +from django.utils.translation import ugettext as _ + +from modoboa.parameters import tools as param_tools + +from . import lib + +styles = getSampleStyleSheet() +styles.add(ParagraphStyle( + name="Footer", alignment=TA_CENTER, fontName="Helvetica-Oblique", + textColor=colors.lightgrey +)) +styles.add(ParagraphStyle( + name="Warning", fontName="Helvetica-Oblique", + textColor=colors.red, fontSize=12 +)) +styles.add(ParagraphStyle( + name="Link", + textColor=colors.blue +)) +styles.add(ParagraphStyle( + name="Greeting", alignment=TA_CENTER, fontName="Helvetica-Oblique", + fontSize=14 +)) + + +def resized_image(path, width=1*cm): + img = utils.ImageReader(path) + iw, ih = img.getSize() + aspect = ih / float(iw) + return Image(path, width=width, height=(width * aspect)) + + +def credentials(account, password): + """Generate a PDF document containing account credentials.""" + + def page_template(canvas, doc): + canvas.setTitle(_("Personal account information")) + canvas.setAuthor(account.fullname) + canvas.setCreator("Modoboa") + footer = [Paragraph(_("Powered by Modoboa - Mail hosting made simple"), + styles["Footer"])] + Frame(0, 0, 21 * cm, 2 * cm).addFromList(footer, canvas) + + conf = dict( + param_tools.get_global_parameters("pdfcredentials")) + filename = lib.get_creds_filename(account) + buff = BytesIO() + doc = SimpleDocTemplate(buff, pagesize=A4) + story = [] + story.append(resized_image(lib.get_document_logo(), 8*cm)) + story.append(Spacer(1, 1 * cm)) + story.append(Paragraph(conf["title"], styles["Title"])) + story.append(Spacer(1, 1 * cm)) + story.append(Paragraph(_(""" +Dear %s, this document contains the credentials you will need +to connect to Modoboa. Learn the content and destroy +the document as soon as possible. +""") % account.fullname, styles["Normal"])) + story.append(Spacer(1, 0.2 * cm)) + story.append(Paragraph(_("Web panel:"), styles["h3"])) + data = [ + ["URL", conf["webpanel_url"]], + [_("Username"), account.username], + [_("Password"), password] + ] + table = Table(data) + table.setStyle(TableStyle([ + ('TEXTCOLOR', (1, 0), (1, 0), colors.blue), + ('GRID', (0, 0), (-1, -1), 1, colors.black), + ('BACKGROUND', (0, 0), (0, -1), colors.lightgrey), + ])) + story.append(table) + story.append(Spacer(1, 0.5 * cm)) + story.append(Paragraph(_(""" +Here you can view your emails anytime online, create filters or manage +your contacts. +"""), styles["Normal"])) + + story.append(Spacer(1, 0.2 * cm)) + story.append(Paragraph( + _("Please change your password!"), + styles["Warning"])) + + if conf["include_connection_settings"]: + story.append(Spacer(1, 1 * cm)) + story.append(Paragraph( + _("PC/Tablet/Smartphone configuration:"), styles["h3"])) + story.append(Spacer(1, 0.2 * cm)) + data = [ + [_("SMTP server address"), conf["smtp_server_address"]], + [_("SMTP server port"), conf["smtp_server_port"]], + [_("SMTP connection security"), conf["smtp_connection_security"]], + [_("IMAP server address"), conf["imap_server_address"]], + [_("IMAP server port"), conf["imap_server_port"]], + [_("IMAP connection security"), conf["imap_connection_security"]], + ] + table = Table(data) + table.setStyle(TableStyle([ + ('GRID', (0, 0), (-1, -1), 1, colors.black), + ('BACKGROUND', (0, 0), (0, -1), colors.lightgrey), + ])) + story.append(table) + story.append(Spacer(1, 0.5 * cm)) + story.append(Paragraph( + _("Use those settings for your computer, tablet or phone."), + styles["Normal"]) + ) + + if conf["custom_message"]: + story.append(Spacer(1, 2 * cm)) + story.append(Paragraph(conf["custom_message"], styles["Greeting"])) + + doc.build(story, onFirstPage=page_template, onLaterPages=page_template) + length = len(buff.getvalue()) + buff.seek(0) + lib.crypt_and_save_to_file(buff, filename, length) diff --git a/modoboa/pdfcredentials/forms.py b/modoboa/pdfcredentials/forms.py new file mode 100644 index 000000000..8546a25f5 --- /dev/null +++ b/modoboa/pdfcredentials/forms.py @@ -0,0 +1,146 @@ +"""PDF credentials forms.""" + +from django import forms +from django.conf import settings +from django.utils.functional import cached_property +from django.utils.translation import ugettext_lazy as _ + +from django.contrib.sites import models as sites_models + +from modoboa.lib import form_utils +from modoboa.parameters import forms as param_forms + +from . import constants + + +class ParametersForm(param_forms.AdminParametersForm): + """Admin parameters form.""" + + app = "pdfcredentials" + + docstore = form_utils.SeparatorField(label=_("Documents storage")) + + storage_dir = forms.CharField( + label=_("Directory to save documents into"), + initial="/var/lib/modoboa/pdf_credentials", + help_text=_("Path to a directory where PDF documents will be saved"), + ) + + security = form_utils.SeparatorField(label=_("Security options")) + + delete_first_dl = form_utils.YesNoField( + label=_("Delete documents after the first download"), + initial=True, + help_text=_( + "Automatically delete a document just after its first download " + "from this interface" + ) + ) + + generate_at_creation = form_utils.YesNoField( + label=_("Generate documents only at account creation"), + initial=True, + help_text=_( + "Generate a new document only when a new account is created. " + "If set to no, a new document will be created each time a " + "password is updated." + ) + ) + + customization = form_utils.SeparatorField(label=_("Customization options")) + + title = forms.CharField( + label=_("Title"), + initial=_("Personal account information"), + help_text=_("The document's title") + ) + + webpanel_url = forms.URLField( + label=_("Web panel url"), + help_text=_("URL of the Modoboa web panel") + ) + + custom_message = forms.CharField( + label=_("Custom message"), + help_text=_( + "A custom message that will appear at the end of documents"), + required=False + ) + + include_connection_settings = form_utils.YesNoField( + label=_("Include mail client connection settings"), + initial=False, + help_text=_( + "Include required SMTP and IMAP connection information to " + "configure a mail client, a tablet or a phone" + ) + ) + + smtp_server_address = forms.CharField( + label=_("SMTP server address"), + help_text=_("Address of the SMTP server (hostname or IP)") + ) + + smtp_server_port = forms.IntegerField( + label=_("SMTP server port"), + initial=587, + help_text=_("Listening port of the SMTP server") + ) + + smtp_connection_security = forms.ChoiceField( + label=_("SMTP connection security"), + choices=constants.CONNECTION_SECURITY_MODES, + initial="starttls", + help_text=_("Connection security mechanism") + ) + + imap_server_address = forms.CharField( + label=_("IMAP server address"), + help_text=_("Address of the IMAP server (hostname or IP)") + ) + + imap_server_port = forms.IntegerField( + label=_("IMAP server port"), + initial=143, + help_text=_("Listening port of the IMAP server") + ) + + imap_connection_security = forms.ChoiceField( + label=_("IMAP connection security"), + choices=constants.CONNECTION_SECURITY_MODES, + initial="starttls", + help_text=_("Connection security mechanism") + ) + + visibility_rules = { + "smtp_server_address": "include_connection_settings=True", + "smtp_server_port": "include_connection_settings=True", + "smtp_connection_security": "include_connection_settings=True", + "imap_server_address": "include_connection_settings=True", + "imap_server_port": "include_connection_settings=True", + "imap_connection_security": "include_connection_settings=True", + } + + @cached_property + def hostname(self): + """Return local hostname.""" + return sites_models.Site.objects.get_current().domain + + def __init__(self, *args, **kwargs): + """Set initial values.""" + super(ParametersForm, self).__init__(*args, **kwargs) + if not self.fields["webpanel_url"].initial: + url = "https://{}{}".format(self.hostname, settings.LOGIN_URL) + self.fields["webpanel_url"].initial = url + if not self.fields["smtp_server_address"].initial: + self.fields["smtp_server_address"].initial = self.hostname + if not self.fields["imap_server_address"].initial: + self.fields["imap_server_address"].initial = self.hostname + + +def load_settings(): + """Load app settings.""" + from modoboa.parameters import tools as param_tools + + param_tools.registry.add( + "global", ParametersForm, _("PDF credentials")) \ No newline at end of file diff --git a/modoboa/pdfcredentials/handlers.py b/modoboa/pdfcredentials/handlers.py new file mode 100644 index 000000000..448cea6bd --- /dev/null +++ b/modoboa/pdfcredentials/handlers.py @@ -0,0 +1,53 @@ +"""PDF credentials handlers.""" + +import os + +from django.urls import reverse +from django.db.models import signals +from django.dispatch import receiver +from django.utils.translation import ugettext as _ + +from modoboa.core import models as core_models +from modoboa.core import signals as core_signals +from modoboa.parameters import tools as param_tools + +from .documents import credentials +from .lib import init_storage_dir, delete_credentials, get_creds_filename + + +@receiver(core_signals.account_password_updated) +def password_updated(sender, account, password, created, **kwargs): + """Create or update document.""" + if not param_tools.get_global_parameter("enabled_pdfcredentials"): + return + generate_at_creation = param_tools.get_global_parameter( + "generate_at_creation") + if (generate_at_creation and not created) or account.is_superuser: + return + init_storage_dir() + credentials(account, password) + + +@receiver(signals.pre_delete, sender=core_models.User) +def account_deleted(sender, instance, **kwargs): + """Remove document.""" + delete_credentials(instance) + + +@receiver(core_signals.extra_account_actions) +def extra_account_actions(sender, account, **kwargs): + """Add link to download document.""" + if not param_tools.get_global_parameter("enabled_pdfcredentials"): + return [] + fname = get_creds_filename(account) + if not os.path.exists(fname): + return [] + return [{ + "name": "get_credentials", + "url": reverse("pdfcredentials:account_credentials", + args=[account.id]), + "img": "fa fa-download", + "title": _("Retrieve user's credentials as a PDF document") + }] + + diff --git a/modoboa/pdfcredentials/lib.py b/modoboa/pdfcredentials/lib.py new file mode 100644 index 000000000..2d9785bbf --- /dev/null +++ b/modoboa/pdfcredentials/lib.py @@ -0,0 +1,101 @@ +"""Internal library.""" + +from io import BytesIO +import os +import struct + +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes +from cryptography.hazmat.backends import default_backend + +from django.conf import settings +from django.utils.encoding import force_bytes, smart_bytes +from django.utils.translation import ugettext as _ + +from modoboa.lib.exceptions import InternalError +from modoboa.parameters import tools as param_tools + + +def init_storage_dir(): + """Create the directory whare documents will be stored.""" + storage_dir = param_tools.get_global_parameter("storage_dir") + if os.path.exists(storage_dir): + return + try: + os.mkdir(storage_dir) + except (OSError, IOError) as inst: + raise InternalError( + _("Failed to create the directory that will contain " + "PDF documents (%s)") % inst + ) + + +def get_creds_filename(account): + """Return the full path of a document.""" + storage_dir = param_tools.get_global_parameter("storage_dir") + return os.path.join(storage_dir, account.username + ".pdf") + + +def delete_credentials(account): + """Try to delete a local file.""" + fname = get_creds_filename(account) + if not os.path.exists(fname): + return + os.remove(fname) + + +def _get_cipher(iv): + """Return ready-to-user Cipher.""" + key = smart_bytes(settings.SECRET_KEY[:32]) + backend = default_backend() + return Cipher( + algorithms.AES(force_bytes(key)), + modes.CBC(iv), + backend=backend + ) + + +def crypt_and_save_to_file(content, filename, length, chunksize=64*512): + """Crypt content and save it to a file.""" + iv = os.urandom(16) + cipher = _get_cipher(iv) + encryptor = cipher.encryptor() + with open(filename, "wb") as fp: + fp.write(struct.pack(b", 2018 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-08-10 11:24+0000\n" +"Last-Translator: Jarda Tesar \n" +"Language-Team: Czech (Czech Republic) (http://www.transifex.com/tonio/modoboa/language/cs_CZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs_CZ\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#: constants.py:7 +msgid "None" +msgstr "Žádné" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Informace osobního účtu" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Běží na Modoboa - Poštovní hosting zjednodušeně" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nVážený %s, tento dokument obsahuje přístupové údaje potřebné\npro pripojení do rozhraní Modoboa. Zapamatujte si je a smazte\ntento dokument hned, jakmile to bude možné.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Webový panel:" + +#: documents.py:78 +msgid "Username" +msgstr "Uživatelské jméno" + +#: documents.py:79 +msgid "Password" +msgstr "Heslo" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nZde si kdykoliv můžete prohlédnout své emaily, vytvořit filtry nebo spravovat Vaše kontakty.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Prosím změňte si své heslo!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "Nastavení PC/Tabletu/Smartphonu:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Adresa SMTP serveru" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Port SMTP serveru" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Zabezpečení SMTP připojení" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "Adresa IMAP serveru" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "Port IMAP serveru" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Zabezpečení IMAP připojení" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Použijte tato nastavení ve svém počítači, tabletu či telefonu." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Úložný prostor pro dokumenty" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Adresář pro uložení dokumentů" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Cesta k adresáři kde budou uloženy PDF dokumenty" + +#: forms.py:28 +msgid "Security options" +msgstr "Možnosti zabezpečení" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Smazat dokumenty po prvním stažení" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Automaticky smazat dokument ihned po prvním stažení cez toto rozhraní" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Vytvářet dokumenty pouze při vytváření účtu" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Vytvářet nové dokumenty pouze při vytvoření účtu. Je-li nastaveno na hodnotu ne, bude nový dokument vytvořen pokaždé, když dojde ke změne hesla." + +#: forms.py:49 +msgid "Customization options" +msgstr "Možnosti vlastních úprav" + +#: forms.py:52 +msgid "Title" +msgstr "Název" + +#: forms.py:54 +msgid "The document's title" +msgstr "Název dokumentu" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL web panelu" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL adresa Modoboa web panelu" + +#: forms.py:63 +msgid "Custom message" +msgstr "Vlastní zpráva" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Vlastní zpráva, která se zobrazí na konci dokumentu." + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Zahrnout nastavení mailového klienta" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Zahrnout vyžadovaná nastavení SMTP a IMAP připojení pri konfiguraci mailového klienta, tabletu či telefonu" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Adresa SMTP serveru (hostname nebo IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Port SMTP serveru" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Zabezpečení připojení" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Adresa IMAP serveru (hostname nebo IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Port IMAP serveru" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Získat přístupové údaje uživatele ako PDF dokument" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Vytváření adresáře pro uložení PDF dokumentů (%s) selhalo " + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "PDF přístupové údaje" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Vytvářet PDF dokumenty obsahující přístupové údaje uživatele" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Pro tohoto uživatele není k dispozici žáden dokument" diff --git a/modoboa/pdfcredentials/locale/de/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/de/LC_MESSAGES/django.po new file mode 100644 index 000000000..6c98d2145 --- /dev/null +++ b/modoboa/pdfcredentials/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,212 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Boris Andratzek , 2018 +# Christian Wiegand, 2017 +# controlcde, 2015 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-04-25 14:19+0000\n" +"Last-Translator: Boris Andratzek \n" +"Language-Team: German (http://www.transifex.com/tonio/modoboa/language/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "kein" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Persönliche Kontoinformationen" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Powered by Modoboa - Mail hosting made simple" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nLiebe/r %s, dieses Dokument enthält die Anmeldeinformationen, die Du benötigst um Dich mit Modoboa zu verbinden. Präge Dir bitte die Informationen ein und lösche anschliessend dieses Dokument.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Webanwendung:" + +#: documents.py:78 +msgid "Username" +msgstr "Benutzername" + +#: documents.py:79 +msgid "Password" +msgstr "Passwort" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nHier können Sie Ihre Emails online ansehen, Filter oder Kontakte erstellen.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Bitte ändern Sie Ihr Passwort!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "PC/Tablet/Smartphone Konfiguration:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "SMTP Serveradresse" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "SMTP Server-Port" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "SMTP-Verbindungssicherheit" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "IMAP Serveradresse" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "IMAP Server-Port" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "IMAP Verbindungssicherheit" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Verwenden Sie diese Einstellungen für Ihren Computer, Ihr Tablet oder Telefon" + +#: forms.py:20 +msgid "Documents storage" +msgstr "Dokumentenablage" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Speicherpfad für Dokumente" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Dateipfad in dem die PDF-Dokumente abgelegt werden" + +#: forms.py:28 +msgid "Security options" +msgstr "Sicherheitseinstellungen" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Lösche Dokumente nach dem ersten Download" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Löscht automatisch das Dokument, wenn es das erste Mal über dieses Oberfläche heruntergeladen wurde" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Erzeuge Dokumente nur wenn ein Konto angelegt wurde" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Erzeuge ein neues Dokument nur wenn ein neues Konto erstellt wurde. Wenn die Option auf Nein steht wird jedes Mal ein neues Dokument erstellt, wenn ein Passwort aktualisiert wurde." + +#: forms.py:49 +msgid "Customization options" +msgstr "Individuell angepasste Optionen" + +#: forms.py:52 +msgid "Title" +msgstr "Titel" + +#: forms.py:54 +msgid "The document's title" +msgstr "Titel des Dokuments" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL der Webanwendung" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL der Modoboa Webanwendung" + +#: forms.py:63 +msgid "Custom message" +msgstr "Eigener Nachrichtentext" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Eine eigene Nachricht, die am Ende des Dokuments angezeigt wird" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Verbindungseinstellungen für Mailprogramme einschließen" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Erforderliche SMTP und IMAP Einstellungen zur Konfiguration von Mailprogramme, Tablets oder Telefonen" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Adresse des SMTP-Servers (Hostname oder IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Port, auf dem der SMTP-Server erreicht werden kann" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Mechanismus zur Verbindungssicherung" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Adresse des IMAP-Servers (Hostname oder IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Port, auf dem der IMAP-Servier erreicht werden kann" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Erhalte die Anmeldeinformationen des Benutzer als ein PDF-Dokument" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Ein Fehler ist bei der Erstellung des Pfades, der die PDF Dokumente (%s) enthält, aufgetreten. " + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "PDF Anmeldeinformationen" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Erzeuge PDF-Dokumente welche die Benutzeranmeldeinformationen enthält" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Kein Dokument für diesen Benutzer verfügbar" diff --git a/modoboa/pdfcredentials/locale/el_GR/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/el_GR/LC_MESSAGES/django.po new file mode 100644 index 000000000..e1c5bd632 --- /dev/null +++ b/modoboa/pdfcredentials/locale/el_GR/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Giannis Kapetanakis , 2016 +# Kostas Moumouris , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2017-10-12 13:30+0000\n" +"Last-Translator: Kostas Moumouris \n" +"Language-Team: Greek (Greece) (http://www.transifex.com/tonio/modoboa/language/el_GR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el_GR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "Κανένας" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Προσωπικές πληροφορίες λογαριασμού" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Powered by Modoboa - Mail hosting made simple" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nΑγαπητέ/ή %s, αυτό το έγγραφο περιέχει τα διαπιστευτήρια\nπου χρειάζεστε για να συνδεθείτε με το Modoboa.\nΑποστηθίστε το περιεχόμενο και διαγράψτε το έγγραφο\nτο συντομότερο δυνατόν.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Web panel:" + +#: documents.py:78 +msgid "Username" +msgstr "Όνομα Χρήστη" + +#: documents.py:79 +msgid "Password" +msgstr "Κωδικός" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nΕδώ μπορείτε να προβάλετε τα ηλεκτρονικά σας μηνύματα σε πραγματικό χρόνο, να δημιουργήσετε φίλτρα ή να διαχειριστείτε\n τις επαφές σας.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Παρακαλώ αλλάξτε το κωδικό σας!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "Ρυθμίσεις: PC/Tablet/Smartphone " + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Διεύθυνση SMTP Server" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Θύρα SMTP server" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Ασφάλεια σύνδεσης SMTP" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "Διεύθυνση IMAP server" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "θύρα IMAP Server" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Ασφάλεια σύνδεσης IMAP" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Χρησιμοποιήστε αυτές τις ρυθμίσεις για τον υπολογιστή, το tablet ή το τηλέφωνό σας." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Αποθηκευτικός χώρος εγγράφων" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Κατάλογος αρχείων για την αποθήκευση εγγράφων" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Κατάλογος αρχείων για την αποθήκευση PDF εγγράφων" + +#: forms.py:28 +msgid "Security options" +msgstr "Ρυθμίσεις Ασφαλείας" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Διαγραφή εγγράφων μετά την πρώτη λήψη" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Αυτόματη διαγραφή εγγράφου μετά την πρώτη λήψη από αυτήν την διεπαφή" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Δημιουργία εγγράφων μόνο κατά την δημιουργία λογαριασμού" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Δημιουργία νέου εγγράφου μόνο κατά την δημιουργία νέου λογαριασμού. Εάν επιλέξετε όχι, ένα νέο έγγραφο θα δημιουργείται κάθε φορά που ο κωδικός χρήστη ενημερώνεται." + +#: forms.py:49 +msgid "Customization options" +msgstr "Επιλογές προσαρμογής" + +#: forms.py:52 +msgid "Title" +msgstr "Τίτλος" + +#: forms.py:54 +msgid "The document's title" +msgstr "Ο τίτλος του εγγράφου" + +#: forms.py:58 +msgid "Web panel url" +msgstr "Διεύθυνση Web panel" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL του Modoboa web panel" + +#: forms.py:63 +msgid "Custom message" +msgstr "Προσαρμοσμένο μήνυμα" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Ένα προσαρμοσμένο μήνυμα που θα εμφανιστεί στο τέλος των εγγράφων" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Συμπεριλάβε τις ρυθμίσεις σύνδεσης προγράμματος αλληλογραφίας" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Συμπεριέλαβε της απαιτούμενες ρυθμίσης SMTP και IMAP για διασύνδεση με προγράμματα emai, τάμπλετ και τηλέφωνα" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Διεύθυνση από τον SMTP server (hostname ή IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Οι θύρες που ακούει ό SMTP Server" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Μηχανισμός ασφαλείας σύνδεσης" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Διεύθυνση του IMAP server (hostname ή IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Η θύρα που ακούει ο IMAP Server" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Ανάκτηση διαπιστευτηρίων χρήστη σε αρχείο PDF" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Σφάλμα στην δημιουργία του καταλόγου αρχείων για την αποθήκευση PDF εγγράφων (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "Διαπιστευτήρια PDF" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Δημιουργία PDF εγγράφων που να περιέχουν τα διαπιστευτήρια χρηστών" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Δεν υπάρχουν διαθέσιμα έγγραφα για αυτόν τον χρήστη" diff --git a/modoboa/pdfcredentials/locale/en/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/en/LC_MESSAGES/django.po new file mode 100644 index 000000000..7405024a2 --- /dev/null +++ b/modoboa/pdfcredentials/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,209 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: constants.py:7 +msgid "None" +msgstr "" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "" + +#: documents.py:75 +msgid "Web panel:" +msgstr "" + +#: documents.py:78 +msgid "Username" +msgstr "" + +#: documents.py:79 +msgid "Password" +msgstr "" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "" + +#: forms.py:20 +msgid "Documents storage" +msgstr "" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "" + +#: forms.py:28 +msgid "Security options" +msgstr "" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "" + +#: forms.py:49 +msgid "Customization options" +msgstr "" + +#: forms.py:52 +msgid "Title" +msgstr "" + +#: forms.py:54 +msgid "The document's title" +msgstr "" + +#: forms.py:58 +msgid "Web panel url" +msgstr "" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "" + +#: forms.py:63 +msgid "Custom message" +msgstr "" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "" + +#: views.py:30 +msgid "No document available for this user" +msgstr "" diff --git a/modoboa/pdfcredentials/locale/fr/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 000000000..01b723e42 --- /dev/null +++ b/modoboa/pdfcredentials/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,210 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Antoine Nguyen , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2017-10-16 18:51+0000\n" +"Last-Translator: Antoine Nguyen \n" +"Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "Aucune" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Informations de compte personnel" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Propulsé par Modoboa - L'hébergement mail simplifié" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nCher %s, ce document contient les identifiants dont vous aurez\nbesoin pour vous connecter à Modoboa. Apprenez les puis détruisez\nce document le plus rapidement possible.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Console web :" + +#: documents.py:78 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: documents.py:79 +msgid "Password" +msgstr "Mot de passe" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nD'ici vous pouvez consulter vos emails en ligne n'importe quand, créer des filtres ou gérer vos contacts.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Merci de changer votre mot de passe !" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "Configuration PC/Tablette/Smartphone :" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Adresse du serveur SMTP" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Port du serveur SMTP" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Sécurité de la connexion SMTP" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "Adresse du serveur IMAP" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "Port du serveur IMAP" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Sécurité de la connexion IMAP" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Utilisez ces paramètres pour votre ordinateur, votre tablette ou votre téléphone." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Stockage des documents" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Répertoire dans lequel les documents sont sauvegardés" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Chemin d'accès vers le répertoire ou seront stockés les documents" + +#: forms.py:28 +msgid "Security options" +msgstr "Options de sécurité" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Supprimer les documents après le premier téléchargement" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Supprimer automatiquement un document juste après son premier téléchargement depuis cette interface" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Générer les documents à la création des comptes uniquement" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Génère un nouveau document uniquement lors de la création d'un compte. Si défini à non, un nouveau document sera généré chaque fois qu'un mot de passe est changé." + +#: forms.py:49 +msgid "Customization options" +msgstr "Options de personnalisation" + +#: forms.py:52 +msgid "Title" +msgstr "Titre" + +#: forms.py:54 +msgid "The document's title" +msgstr "Le titre du document" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL de la console web" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL de la console web Modoboa" + +#: forms.py:63 +msgid "Custom message" +msgstr "Message personnalisé" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Un message personnalisé qui apparaîtra en bas des documents." + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Inclure les paramètres de connexion pour client mail" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Inclure les paramètres de connexion nécessaires pour configurer un client mail, une tablette ou un téléphone" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Adresse du serveur SMTP (nom d'hôte ou IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Port d'écoute du serveur SMTP" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Mécanisme de sécurisation de la connexion" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Adresse du serveur IMAP (nom d'hôte ou IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Port d'écoute du serveur IMAP" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Récupérer les identifiant de l'utilisateur sous forme d'un document PDF" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Echec lors de la création du répertoire qui contiendra les documents PDF (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "Identifiants en PDF" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Génère des documents PDF contenant les identifiants des utilisateurs" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Aucun document disponible pour cet utilisateur" diff --git a/modoboa/pdfcredentials/locale/it/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/it/LC_MESSAGES/django.po new file mode 100644 index 000000000..fb1878d7e --- /dev/null +++ b/modoboa/pdfcredentials/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# marcotrevisan , 2018 +# Rocco , 2015 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-11-02 15:15+0000\n" +"Last-Translator: marcotrevisan \n" +"Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "Nessun valore" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Informazioni Personali" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Powered by Modoboa - Mail hosting made simple" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nGentile %s, questo documento contiene le credenziali di accesso \nper accedere a Modoboa. Leggilo e elimina\n il documento il prima possibile.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Pannello web:" + +#: documents.py:78 +msgid "Username" +msgstr "Nome Utente" + +#: documents.py:79 +msgid "Password" +msgstr "Password" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nQui puoi sempre visualizzare le tue email onlime, creare filtri\no gestire i tuoi contatti.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Per favore cambia la tua password!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "Configurazione PC/Tablet/Smartphone:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Indirizzo del server SMTP" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Porta del server SMTP" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Sicurezza della connessione al server SMTP" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "indirizzo del server IMAP" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "Porta del server IMAP" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Sicurezza della connessione al server IMAP" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Utilizza quelle impostazioni per il tuo computer, tablet o telefono." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Memorizzazione Documenti" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Cartella nella quale salvare i documenti" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Indirizzo della cartella dove i documenti PDF saranno salvati" + +#: forms.py:28 +msgid "Security options" +msgstr "Opzioni di sicurezza" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Cancella i documenti dopo averli scaricati" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Elimina automaticamente il documento dopo che è stato scaricato da questa interfaccia" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Genera documenti solo dopo la creazione dell'account" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Generare un nuovo documento solo quando si crea un nuovo account. Se impostato su no , un nuovo documento verrà creato ogni volta che la password viene aggiornata." + +#: forms.py:49 +msgid "Customization options" +msgstr "Opzioni di personalizzazione" + +#: forms.py:52 +msgid "Title" +msgstr "Titolo" + +#: forms.py:54 +msgid "The document's title" +msgstr "Il titolo del documento" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL del pannello di controllo web" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL del pannello di controllo web di Modoboa" + +#: forms.py:63 +msgid "Custom message" +msgstr "Messaggio personalizzato" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Un messaggio personalizzato comparirà alla fine dei documenti" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Includi le impostazioni di connessione del client di posta" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Includi le informazioni di connessione SMTP e IMAP richieste per configurare un client di posta, un tablet o telefono" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Indirizzo del server SMTP (nome host o indirizzo IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Porta di ascolto del server SMTP" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Meccanismo di sicurezza della connessione" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Indirizzo del server IMAP (nome host o indirizzo IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Porta di ascolto del server IMAP" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Recuperare le credenziali dell'utente come documento PDF" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Impossibile creare la cartella che conterrà i documenti PDF (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "Credenziali PDF" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Genera i documenti PDF con le credenziali dell'utente" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Non ci sono documenti disponibili er questo utente" diff --git a/modoboa/pdfcredentials/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/ja_JP/LC_MESSAGES/django.po new file mode 100644 index 000000000..2ec0ba19a --- /dev/null +++ b/modoboa/pdfcredentials/locale/ja_JP/LC_MESSAGES/django.po @@ -0,0 +1,210 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# cwatanab , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2017-09-27 10:02+0000\n" +"Last-Translator: Antoine Nguyen \n" +"Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/language/ja_JP/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja_JP\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: constants.py:7 +msgid "None" +msgstr "" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "個人アカウント情報" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Powered by Modoboa - メールホスティングをシンプルに" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\n%s さん\n\nこのドキュメントには、Modoboa へ接続するための必要な認証情報が書かれています。\n内容を理解したら、すみやかに廃棄してください。\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "" + +#: documents.py:78 +msgid "Username" +msgstr "ユーザ名" + +#: documents.py:79 +msgid "Password" +msgstr "パスワード" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "" + +#: forms.py:20 +msgid "Documents storage" +msgstr "ドキュメントストレージ" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "ドキュメントを保存するためのディレクトリ" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "PDF ドキュメントを保存するためのディレクトリのパス" + +#: forms.py:28 +msgid "Security options" +msgstr "セキュリティオプション" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "最初のダウンロードの後にドキュメントを削除する" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "このインターフェースから最初にダウンロードされたあとにドキュメントを自動的に削除する" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "アカウントを作成するときだけドキュメントを生成する" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "アカウントの作成されたときだけ、新しいドキュメントを生成します。\nもし「いいえ」設定すれば、新しい文書は、パスワードが更新されるたびに作成されます。" + +#: forms.py:49 +msgid "Customization options" +msgstr "" + +#: forms.py:52 +msgid "Title" +msgstr "" + +#: forms.py:54 +msgid "The document's title" +msgstr "" + +#: forms.py:58 +msgid "Web panel url" +msgstr "" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "" + +#: forms.py:63 +msgid "Custom message" +msgstr "" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "PDF ドキュメントとしてユーザー認証情報を取得します" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "PDFドキュメントを格納するディレクトリの作成に失敗しました (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "PDF 認証情報" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "ユーザーの認証情報を書かれた PDF ドキュメントを生成" + +#: views.py:30 +msgid "No document available for this user" +msgstr "このユーザーにはドキュメンがありません" diff --git a/modoboa/pdfcredentials/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/nl_NL/LC_MESSAGES/django.po new file mode 100644 index 000000000..0a828652a --- /dev/null +++ b/modoboa/pdfcredentials/locale/nl_NL/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# R Kloosterman , 2016 +# Tuxis Internet Engineering V.O.F. , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-01-31 08:43+0000\n" +"Last-Translator: Tuxis Internet Engineering V.O.F. \n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/tonio/modoboa/language/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Persoonlijke account informatie" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Aangeboden door Modoboa - Mail hosting made simple" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nBeste %s, dit document bevat alle gegevens dat u nodig\nheeft voor het gebruiken van Modoboa. Onthoud deze gegevens\nen verwijder dit document zo snel mogelijk.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Webpaneel:" + +#: documents.py:78 +msgid "Username" +msgstr "Gebruikersnaam" + +#: documents.py:79 +msgid "Password" +msgstr "Wachtwoord" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nHier kunt u uw e-mails online bekijken, filters aanmaken, of contactpersonen beheren.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Wijzig uw wachtwoord aub!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "PC/Tablet/Smartphone configuratie:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "SMTP serveradres" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "SMTP server poort" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "SMTP verbinding beveiliging" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "IMAP serveradres" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "IMAP server poort" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "IMAP verbinding beveiliging" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Gebruik deze instellingen voor uw computer, tablet of telefoon." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Document opslag" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Map voor het opslaan van de documenten" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Pad naar de map waar de PDF documenten worden opgeslagen" + +#: forms.py:28 +msgid "Security options" +msgstr "Beveiligings-opties" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Documenten verwijderen na eerste download" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Verwijder een document automatisch nadat het eenmalig is gedownload van paneel" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Genereer een document enkel bij het aanmaken van een account" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Genereer een document enkel wanneer een account is nieuw aangemaakt. Indien 'nee' is geselecteerd zal bij iedere wachtwoord wijziging een nieuw document worden gemaakt. " + +#: forms.py:49 +msgid "Customization options" +msgstr "Personaliseringsopties" + +#: forms.py:52 +msgid "Title" +msgstr "Titel" + +#: forms.py:54 +msgid "The document's title" +msgstr "Titel van het document" + +#: forms.py:58 +msgid "Web panel url" +msgstr "Webpaneel URL" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL van het Modoboa webpaneel" + +#: forms.py:63 +msgid "Custom message" +msgstr "Aangepast bericht" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Een aangepast bericht dat aan het einde van de documenten komt te staan" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Vraag de gebruikers gegevens op als een PDF document" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Het aanmaken van de map voor de PDF documenten is mislukt (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "PDF gegevens" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Genereer PDF document met de gegevens voor de gebruiker" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Geen document beschikbaar voor deze gebruiker" diff --git a/modoboa/pdfcredentials/locale/pl_PL/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/pl_PL/LC_MESSAGES/django.po new file mode 100644 index 000000000..20c3f866e --- /dev/null +++ b/modoboa/pdfcredentials/locale/pl_PL/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# sin88 , 2016 +# Tomasz Proć , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2017-12-02 10:36+0000\n" +"Last-Translator: Tomasz Proć \n" +"Language-Team: Polish (Poland) (http://www.transifex.com/tonio/modoboa/language/pl_PL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +#: constants.py:7 +msgid "None" +msgstr "Brak" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Informacje o koncie osobistym" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Powered by Modoboa - Mail hosting made simple" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nDrogi użytkowniku %s, ten dokument zawiera dane uwierzytelniające które będzeisz potrzebował to połączenia się. Zapoznaj się z nim i usuń go najszybciej jak to możliwe.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Panel web:" + +#: documents.py:78 +msgid "Username" +msgstr "Nazwa użytkownika" + +#: documents.py:79 +msgid "Password" +msgstr "Hasło" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nPod tym adresem możesz online przeczytać swoje wiadomości, stworzyć filtry lub zarządzać\n listą kontaktów.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Proszę zmienić swoje hasło!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "konfiguracją PC/Tabletu/Smartfonu:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Adres serwera SMTP" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Port serwera SMTP" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Zabezpieczenia połączenia SMTP" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "Adres serwera IMAP" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "Port serwera IMAP" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Zabezpieczenie połączenia IMAP" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Użyj tych ustawień w swoim komputerze, tablecie lub telefonie." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Magazyn dokumentów" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Lokalizacja gdzie zapisywać dokumenty" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Ścieżka do lokalizacji, gdzie będą zapisywane PDF'y" + +#: forms.py:28 +msgid "Security options" +msgstr "Opcje bezpieczeństwa" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Usuwaj dokumenty po ich pierwszym pobraniu" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Automatycznie usuwaj dokumenty jak tylko zostaną pobranie przez ten interfejs" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Generuj dokumenty tylko podczas zakładania konta" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Generuj nowy dokument tylko wtedy, kiedy nowe konto jest zakładane. Jeśli ustawione na nie, to nowy dokument będzie tworzony przy każdej zmianie hasła." + +#: forms.py:49 +msgid "Customization options" +msgstr "Opcje dostosowania" + +#: forms.py:52 +msgid "Title" +msgstr "Tytuł" + +#: forms.py:54 +msgid "The document's title" +msgstr "Tytuł dokumentu" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL panelu Web" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL panelu Modoboa" + +#: forms.py:63 +msgid "Custom message" +msgstr "Własna wiadomość" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Dodatkowa wiadomość która pojawi się na końcu dokumentu." + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Załącz ustawienia połączenia dla programu pocztowego klienta" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Załącz wymagane do konfiguracji, informacje o połączeniu SMTP i IMAP " + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Adres serwera SMTP (nazwa hosta lub IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Port nasłuchujący serwera SMTP" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Mechanizm zabezpieczenia połączenia" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Adres serwera IMAP (nazwa hosta lub IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Port nasłuchujący serwera IMAP" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Pobieranie danych uwierzytelniających użytkownika w formacie PDF" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Nie można utworzyć katalogu do przechowywania PDF'ów (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "Poświadczenia PDF" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Generuj dokumenty PDF zawierające dane uwierzytelniające użytkowników" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Brak dokumentu dla tego użytkownika" diff --git a/modoboa/pdfcredentials/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 000000000..41a9b5b47 --- /dev/null +++ b/modoboa/pdfcredentials/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Rafael Barretto , 2015 +# Rafael Barretto , 2017-2018 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-09-25 03:25+0000\n" +"Last-Translator: Rafael Barretto \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "Nenhuma" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Informações da conta pessoal" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Desenvolvido por Modoboa - Hospedagem de email de forma simples" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nCaro(a) %s, este documento contem as credenciais que você irá precisar\npara conectar ao Modoboa. Verifique o conteúdo e destrua\neste documento assim que possível.\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Painel web:" + +#: documents.py:78 +msgid "Username" +msgstr "Nome de usuário" + +#: documents.py:79 +msgid "Password" +msgstr "Senha" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nAqui você poderá ver seus emails a qualquer momento online, crie filtros ou gerencie \nseus contatos.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Por favor mude sua senha!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "Configuração para PC/Tablet/Smartphone:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "Endereço do servidor SMTP" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "Porta do servidor SMTP" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "Conexão segura SMTP" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "Endereço do servidor IMAP" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "Porta do servidor IMAP" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "Conexão segura IMAP" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Use essas configurações para seu computador, tablet ou telefone." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Armazenamento de documentos" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Diretório para salvar documentos" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Caminho para o diretório onde os arquivos PDF serão salvos" + +#: forms.py:28 +msgid "Security options" +msgstr "Opções de segurança" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Deletar documentos após o primeiro download" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Excluir automaticamente um documento logo após a sua primeira transferência a partir desta interface" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Apenas gerar documentos na criação da conta" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Gerar um novo documento apenas quando uma nova conta é criada. Se definido como não, um novo documento será criado cada vez que uma senha é atualizada." + +#: forms.py:49 +msgid "Customization options" +msgstr "Opções de customização" + +#: forms.py:52 +msgid "Title" +msgstr "Título" + +#: forms.py:54 +msgid "The document's title" +msgstr "Título do documento" + +#: forms.py:58 +msgid "Web panel url" +msgstr "URL do painel web" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL do painel web do Modoboa" + +#: forms.py:63 +msgid "Custom message" +msgstr "Mensagem personalizada" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Uma mensagem personalizada irá aparecer no fim do documento" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Incluir configurações de conexão do cliente de email" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Incluir informações de conexão SMTP e IMAP necessárias para configurar um cliente de e-mail, um tablet ou um telefone" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Endereço do servidor SMTP (hostname ou IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Mecanismo de conexão segura" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Recuperar credenciais do usuário como um documento PDF" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Falha ao criar o diretório que conterá documentos PDF (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "Credenciais PDF" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Gerar documentos em PDF contendo as credenciais dos usuários" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Nenhum documento disponível para esse usuário" diff --git a/modoboa/pdfcredentials/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/pt_PT/LC_MESSAGES/django.po new file mode 100644 index 000000000..feb9e5fbd --- /dev/null +++ b/modoboa/pdfcredentials/locale/pt_PT/LC_MESSAGES/django.po @@ -0,0 +1,209 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2017-09-27 10:02+0000\n" +"Last-Translator: Antoine Nguyen \n" +"Language-Team: Portuguese (Portugal) (http://www.transifex.com/tonio/modoboa/language/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "" + +#: documents.py:75 +msgid "Web panel:" +msgstr "" + +#: documents.py:78 +msgid "Username" +msgstr "" + +#: documents.py:79 +msgid "Password" +msgstr "" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "" + +#: forms.py:20 +msgid "Documents storage" +msgstr "" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "" + +#: forms.py:28 +msgid "Security options" +msgstr "" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "" + +#: forms.py:49 +msgid "Customization options" +msgstr "" + +#: forms.py:52 +msgid "Title" +msgstr "" + +#: forms.py:54 +msgid "The document's title" +msgstr "" + +#: forms.py:58 +msgid "Web panel url" +msgstr "" + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "" + +#: forms.py:63 +msgid "Custom message" +msgstr "" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "" + +#: views.py:30 +msgid "No document available for this user" +msgstr "" diff --git a/modoboa/pdfcredentials/locale/sv/LC_MESSAGES/django.po b/modoboa/pdfcredentials/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 000000000..804ce42ff --- /dev/null +++ b/modoboa/pdfcredentials/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,211 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Olle Gustafsson , 2016,2018 +# Tomas Olsson , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Modoboa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-27 12:01+0200\n" +"PO-Revision-Date: 2018-08-14 08:40+0000\n" +"Last-Translator: Olle Gustafsson \n" +"Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: constants.py:7 +msgid "None" +msgstr "Ingen" + +#: documents.py:52 forms.py:53 +msgid "Personal account information" +msgstr "Personlig kontoinformation" + +#: documents.py:55 +msgid "Powered by Modoboa - Mail hosting made simple" +msgstr "Drivs av Modoboa - Mail hosting gjort enkelt" + +#: documents.py:69 +#, python-format +msgid "" +"\n" +"Dear %s, this document contains the credentials you will need\n" +"to connect to Modoboa. Learn the content and destroy\n" +"the document as soon as possible.\n" +msgstr "\nKära %s, detta dokument innehåller de kontouppgifter du behöver för att ansluta till Modoboa. Lär dig innehållet i detta dokument och förstör detta dokument så snart som möjligt\n" + +#: documents.py:75 +msgid "Web panel:" +msgstr "Webbpanel" + +#: documents.py:78 +msgid "Username" +msgstr "Användarnamn" + +#: documents.py:79 +msgid "Password" +msgstr "Lösenord" + +#: documents.py:89 +msgid "" +"\n" +"Here you can view your emails anytime online, create filters or manage\n" +"your contacts.\n" +msgstr "\nHär kan du se dina e-postmeddelanden när som helst online, skapa filter eller hantera\ndina kontakter.\n" + +#: documents.py:96 +msgid "Please change your password!" +msgstr "Vänligen ändra ditt lösenord!" + +#: documents.py:102 +msgid "PC/Tablet/Smartphone configuration:" +msgstr "PC/Tablet/Smartphone inställningar:" + +#: documents.py:105 forms.py:79 +msgid "SMTP server address" +msgstr "SMTP server adress" + +#: documents.py:106 forms.py:84 +msgid "SMTP server port" +msgstr "SMTP server port" + +#: documents.py:107 forms.py:90 +msgid "SMTP connection security" +msgstr "SMTP anslutningssäkerhet" + +#: documents.py:108 forms.py:97 +msgid "IMAP server address" +msgstr "IMAP server adress" + +#: documents.py:109 forms.py:102 +msgid "IMAP server port" +msgstr "IMAP server port" + +#: documents.py:110 forms.py:108 +msgid "IMAP connection security" +msgstr "IMAP anslutningssäkerhet" + +#: documents.py:120 +msgid "Use those settings for your computer, tablet or phone." +msgstr "Använd dessa inställningar för din dator, surfplatta eller telefon." + +#: forms.py:20 +msgid "Documents storage" +msgstr "Dokumentlagring" + +#: forms.py:23 +msgid "Directory to save documents into" +msgstr "Katalog att spara dokument till" + +#: forms.py:25 +msgid "Path to a directory where PDF documents will be saved" +msgstr "Sökväg till en katalog där PDF dokument kommer sparas" + +#: forms.py:28 +msgid "Security options" +msgstr "Säkerhetsinställningar" + +#: forms.py:31 +msgid "Delete documents after the first download" +msgstr "Radera dokument efter första nedladdning" + +#: forms.py:34 +msgid "" +"Automatically delete a document just after its first download from this " +"interface" +msgstr "Radera dokument automatiskt efter första nedladdningen" + +#: forms.py:40 +msgid "Generate documents only at account creation" +msgstr "Generera dokument endast vid kontoskapande" + +#: forms.py:43 +msgid "" +"Generate a new document only when a new account is created. If set to no, a " +"new document will be created each time a password is updated." +msgstr "Generera bara nya dokument när ett nytt konto skapas. Om detta sätts till nej, kommer ett nytt dokument skapas varje gång ett lösenord uppdateras." + +#: forms.py:49 +msgid "Customization options" +msgstr "Anpassningsalternativ" + +#: forms.py:52 +msgid "Title" +msgstr "Titel" + +#: forms.py:54 +msgid "The document's title" +msgstr "Dokumentets titel" + +#: forms.py:58 +msgid "Web panel url" +msgstr "Webbpanels länk " + +#: forms.py:59 +msgid "URL of the Modoboa web panel" +msgstr "URL till Modoboa webbpanel" + +#: forms.py:63 +msgid "Custom message" +msgstr "Anpassat meddelande" + +#: forms.py:65 +msgid "A custom message that will appear at the end of documents" +msgstr "Ett anpassat meddelande som kommer visas i slutet på dokumentet" + +#: forms.py:70 +msgid "Include mail client connection settings" +msgstr "Inkludera e-post klient inställningar" + +#: forms.py:73 +msgid "" +"Include required SMTP and IMAP connection information to configure a mail " +"client, a tablet or a phone" +msgstr "Inkludera SMTP och IMAP anslutningsinformation för att konfigurera en e-postklient, surfplatta eller telefon" + +#: forms.py:80 +msgid "Address of the SMTP server (hostname or IP)" +msgstr "Adress till SMTP servern (värdnamn eller IP)" + +#: forms.py:86 +msgid "Listening port of the SMTP server" +msgstr "Lyssningsport för SMTP servern" + +#: forms.py:93 forms.py:111 +msgid "Connection security mechanism" +msgstr "Anslutningssäkerhetsmekanism" + +#: forms.py:98 +msgid "Address of the IMAP server (hostname or IP)" +msgstr "Adress till IMAP servern (värdnamn eller IP)" + +#: forms.py:104 +msgid "Listening port of the IMAP server" +msgstr "Lyssningsport för IMAP servern" + +#: handlers.py:46 +msgid "Retrieve user's credentials as a PDF document" +msgstr "Hämta användares kontouppgifter som ett PDF dokument" + +#: lib.py:29 +#, python-format +msgid "Failed to create the directory that will contain PDF documents (%s)" +msgstr "Kunde inte skapa katalogen som innehåller PDF dokumenten (%s)" + +#: modo_extension.py:16 modo_extension.py:24 +msgid "PDF credentials" +msgstr "PDF kontouppgifter" + +#: modo_extension.py:19 +msgid "Generate PDF documents containing users' credentials" +msgstr "Generera PDF dokument innehållande användares kontouppgifter" + +#: views.py:30 +msgid "No document available for this user" +msgstr "Inga dokument tillgängliga för den här användaren" diff --git a/modoboa/pdfcredentials/models.py b/modoboa/pdfcredentials/models.py new file mode 100644 index 000000000..71a836239 --- /dev/null +++ b/modoboa/pdfcredentials/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/modoboa/pdfcredentials/rfc6266.py b/modoboa/pdfcredentials/rfc6266.py new file mode 100644 index 000000000..c0dacb2d1 --- /dev/null +++ b/modoboa/pdfcredentials/rfc6266.py @@ -0,0 +1,109 @@ +""" +Copy of the original rfc6266 package, just the generation part. + +Orginal code is available at https://github.com/g2p/rfc6266. +""" + +from urllib.parse import quote + + +# RFC 2616 +separator_chars = "()<>@,;:\\\"/[]?={} \t" +# RFC 5987 +attr_chars_nonalnum = '!#$&+-.^_`|~' + + +def percent_encode(string, safe, encoding): + return quote(string, safe, encoding, errors='strict') + + +def is_token_char(ch): + # Must be ascii, and neither a control char nor a separator char + asciicode = ord(ch) + # < 128 means ascii, exclude control chars at 0-31 and 127, + # exclude separator characters. + return 31 < asciicode < 127 and ch not in separator_chars + + +def is_token(candidate): + return all(is_token_char(ch) for ch in candidate) + + +def is_ascii(text): + return all(ord(ch) < 128 for ch in text) + + +def fits_inside_codec(text, codec): + try: + text.encode(codec) + except UnicodeEncodeError: + return False + else: + return True + + +def is_lws_safe(text): + return normalize_ws(text) == text + + +def normalize_ws(text): + return ' '.join(text.split()) + + +def qd_quote(text): + return text.replace('\\', '\\\\').replace('"', '\\"') + + +def build_header( + filename, disposition='attachment', filename_compat=None +): + """Generate a Content-Disposition header for a given filename. + For legacy clients that don't understand the filename* parameter, + a filename_compat value may be given. + It should either be ascii-only (recommended) or iso-8859-1 only. + In the later case it should be a character string + (unicode in Python 2). + Options for generating filename_compat (only useful for legacy clients): + - ignore (will only send filename*); + - strip accents using unicode's decomposing normalisations, + which can be done from unicode data (stdlib), and keep only ascii; + - use the ascii transliteration tables from Unidecode (PyPI); + - use iso-8859-1 + Ignore is the safest, and can be used to trigger a fallback + to the document location (which can be percent-encoded utf-8 + if you control the URLs). + See https://tools.ietf.org/html/rfc6266#appendix-D + """ + + # While this method exists, it could also sanitize the filename + # by rejecting slashes or other weirdness that might upset a receiver. + + if disposition != 'attachment': + assert is_token(disposition) + + rv = disposition + + if is_token(filename): + rv += '; filename=%s' % (filename, ) + return rv + elif is_ascii(filename) and is_lws_safe(filename): + qd_filename = qd_quote(filename) + rv += '; filename="%s"' % (qd_filename, ) + if qd_filename == filename: + # RFC 6266 claims some implementations are iffy on qdtext's + # backslash-escaping, we'll include filename* in that case. + return rv + elif filename_compat: + if is_token(filename_compat): + rv += '; filename=%s' % (filename_compat, ) + else: + assert is_lws_safe(filename_compat) + rv += '; filename="%s"' % (qd_quote(filename_compat), ) + + # alnum are already considered always-safe, but the rest isn't. + # Python encodes ~ when it shouldn't, for example. + rv += "; filename*=utf-8''%s" % (percent_encode( + filename, safe=attr_chars_nonalnum, encoding='utf-8'), ) + + # This will only encode filename_compat, if it used non-ascii iso-8859-1. + return rv.encode('iso-8859-1') diff --git a/modoboa/pdfcredentials/tests.py b/modoboa/pdfcredentials/tests.py new file mode 100644 index 000000000..885528ffa --- /dev/null +++ b/modoboa/pdfcredentials/tests.py @@ -0,0 +1,147 @@ +"""PDF credentials tests.""" + +import os +import shutil +import tempfile + +from django.test import override_settings +from django.urls import reverse + +from modoboa.admin import factories as admin_factories +from modoboa.core import models as core_models + +from modoboa.lib.tests import ModoTestCase + + +class EventsTestCase(ModoTestCase): + """Test event handlers.""" + + @classmethod + def setUpTestData(cls): + """Create some data.""" + super(EventsTestCase, cls).setUpTestData() + admin_factories.DomainFactory(name="test.com") + + def setUp(self): + """Create temp. directory to store files.""" + super(EventsTestCase, self).setUp() + self.workdir = tempfile.mkdtemp() + self.set_global_parameter("storage_dir", self.workdir) + + def tearDown(self): + """Reset test env.""" + shutil.rmtree(self.workdir) + + def _create_account(self, username, expected_status=200): + """Create a test account.""" + values = { + "username": username, + "first_name": "Tester", "last_name": "Toto", + "role": "SimpleUsers", "quota_act": True, + "is_active": True, "email": username, + "random_password": True, "stepid": 2 + } + response = self.client.post( + reverse("admin:account_add"), values, + HTTP_X_REQUESTED_WITH="XMLHttpRequest") + self.assertEqual(response.status_code, expected_status) + return values + + def test_password_updated(self): + """Check that document is generated at account creation/update.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + + # Check if link is present in listing page + response = self.ajax_get(reverse("admin:_identity_list")) + self.assertIn('name="get_credentials"', response["rows"]) + + # Try to download the file + response = self.client.get( + reverse("pdfcredentials:account_credentials", + args=[account.pk])) + self.assertEqual(response.status_code, 200) + self.assertEqual(response["Content-Type"], "application/pdf") + + # File have been deleted? + self.assertFalse(os.path.exists(fname)) + + # Try to download a second time + response = self.client.get( + reverse("pdfcredentials:account_credentials", + args=[account.pk])) + self.assertContains(response, "No document available for this user") + + # Update account + values.update({"language": "en"}) + self.ajax_post( + reverse("admin:account_change", args=[account.pk]), values + ) + self.assertFalse(os.path.exists(fname)) + + self.set_global_parameter("generate_at_creation", False) + self.ajax_post( + reverse("admin:account_change", args=[account.pk]), values + ) + self.assertTrue(os.path.exists(fname)) + + def test_with_connection_settings(self): + """Add connection settings to documents.""" + self.set_global_parameter("include_connection_settings", True) + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_with_custom_message(self): + """Add custom message to documents.""" + self.set_global_parameter("custom_message", "This is a test message.") + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_account_delete(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + self.ajax_post( + reverse("admin:account_delete", args=[account.pk]), {} + ) + self.assertFalse(os.path.exists(fname)) + + @override_settings(MODOBOA_LOGO="modoboa.png") + def test_with_custom_logo(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + + def test_download_and_delete_account(self): + """Check that document is deleted with account.""" + values = self._create_account("leon@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertTrue(os.path.exists(fname)) + account = core_models.User.objects.get(username=values["username"]) + + # Try to download the file + response = self.client.get( + reverse("pdfcredentials:account_credentials", + args=[account.pk])) + self.assertEqual(response.status_code, 200) + self.assertEqual(response["Content-Type"], "application/pdf") + + # File have been deleted? + self.assertFalse(os.path.exists(fname)) + + # Delete account + self.ajax_post( + reverse("admin:account_delete", args=[account.pk]), {} + ) + + def test_storage_dir_creation(self): + """Test storage directory creation.""" + self.set_global_parameter("storage_dir", "/nonexistentdir") + self._create_account("leon@test.com", expected_status=500) diff --git a/modoboa/pdfcredentials/urls.py b/modoboa/pdfcredentials/urls.py new file mode 100644 index 000000000..9a13a5b3c --- /dev/null +++ b/modoboa/pdfcredentials/urls.py @@ -0,0 +1,10 @@ +from django.urls import path + +from . import views + +app_name = "pdfcredentials" + +urlpatterns = [ + path('credentials//', views.get_account_credentials, + name="account_credentials"), +] diff --git a/modoboa/pdfcredentials/views.py b/modoboa/pdfcredentials/views.py new file mode 100644 index 000000000..584675db7 --- /dev/null +++ b/modoboa/pdfcredentials/views.py @@ -0,0 +1,37 @@ +"""modoboa.pdfcredentials views.""" + +import os + +from django.http import HttpResponse +from django.utils.translation import ugettext as _ + +from django.contrib.auth.decorators import ( + login_required, permission_required +) + +from modoboa.core.models import User +from modoboa.lib.exceptions import ModoboaException, PermDeniedException +from modoboa.parameters import tools as param_tools + +from .lib import decrypt_file, get_creds_filename +from .rfc6266 import build_header + + +@login_required +@permission_required("core.add_user") +def get_account_credentials(request, accountid): + """View to download a document.""" + account = User.objects.get(pk=accountid) + if not request.user.can_access(account): + raise PermDeniedException() + fname = get_creds_filename(account) + if not os.path.exists(fname): + raise ModoboaException(_("No document available for this user")) + content = decrypt_file(fname) + if param_tools.get_global_parameter("delete_first_dl"): + os.remove(fname) + resp = HttpResponse(content) + resp["Content-Type"] = "application/pdf" + resp["Content-Length"] = len(content) + resp["Content-Disposition"] = build_header(os.path.basename(fname)) + return resp diff --git a/modoboa/urls.py b/modoboa/urls.py index 159d2583e..75ce14626 100644 --- a/modoboa/urls.py +++ b/modoboa/urls.py @@ -27,6 +27,7 @@ urlpatterns = [ path('', include("modoboa.core.urls")), path('admin/', include("modoboa.admin.urls")), path('dnstools/', include("modoboa.dnstools.urls")), + path('pdfcredentials', include("modoboa.pdfcredentials.urls")), path('stats/', include("modoboa.maillog.urls")), path('user/forward/', user_views.forward, name="user_forward"), diff --git a/modoboa/urls_api_v2.py b/modoboa/urls_api_v2.py index b6376b088..06ee56864 100644 --- a/modoboa/urls_api_v2.py +++ b/modoboa/urls_api_v2.py @@ -15,6 +15,7 @@ urlpatterns = [ path('', include("modoboa.dnstools.api.v2.urls")), path('', include("modoboa.maillog.api.v2.urls")), path('', include("modoboa.transport.api.v2.urls")), + path('', include("modoboa.pdfcredentials.api.v2.urls")), ] urlpatterns += exts_pool.get_urls(category="api") diff --git a/requirements.txt b/requirements.txt index 4e4c4de50..db8e88ad5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,3 +37,6 @@ qrcode aiosmtplib aioredis==2.0.1 + +# PDF credentials +reportlab \ No newline at end of file diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index 4b74c587a..46b5699fe 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -89,6 +89,7 @@ MODOBOA_APPS = ( 'modoboa.dnstools', 'modoboa.policyd', 'modoboa.maillog', + 'modoboa.pdfcredentials', # Modoboa extensions here. ) From 33e10248addef15f8c88e83f8cffea48897d7e7a Mon Sep 17 00:00:00 2001 From: Spitap Date: Sat, 18 Feb 2023 11:11:16 +0100 Subject: [PATCH 06/25] fixed tests --- modoboa/admin/api/v2/serializers.py | 2 +- modoboa/core/tests/test_views.py | 14 ++++++++++++++ modoboa/lib/tests/__init__.py | 5 +++++ modoboa/parameters/api/v2/tests.py | 4 ++-- modoboa/pdfcredentials/api/v2/tests.py | 7 ------- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py index a6d2c0e06..e1310ebf9 100644 --- a/modoboa/admin/api/v2/serializers.py +++ b/modoboa/admin/api/v2/serializers.py @@ -540,7 +540,7 @@ class WritableAccountSerializer(v1_serializers.WritableAccountSerializer): instance.set_password(password) if mailbox_data: creator = self.context["request"].user - if hasattr(instance, "mailbox") and "mailbox" in validated_data: + if hasattr(instance, "mailbox"): if "username" in validated_data: mailbox_data["email"] = validated_data["username"] instance.email = validated_data["username"] diff --git a/modoboa/core/tests/test_views.py b/modoboa/core/tests/test_views.py index 1c14f2d8f..19fbb306c 100644 --- a/modoboa/core/tests/test_views.py +++ b/modoboa/core/tests/test_views.py @@ -93,6 +93,20 @@ SETTINGS_SAMPLE = { "maillog-logfile": "/var/log/mail.log", "maillog-rrd_rootdir": "/tmp", "maillog-greylist": False, + "pdfcredentials-enabled_pdfcredentials": True, + "pdfcredentials-storage_dir": "./", + "pdfcredentials-delete_first_dl": True, + "pdfcredentials-generate_at_creation": True, + "pdfcredentials-title": "Modoboa", + "pdfcredentials-webpanel_url": "local.host/", + "pdfcredentials-custom_message": "test", + "pdfcredentials-include_connection_settings": False, + "pdfcredentials-smtp_server_address": "127.0.0.1", + "pdfcredentials-smtp_server_port": 666, + "pdfcredentials-smtp_connection_security": "starttls", + "pdfcredentials-imap_server_address": "127.0.0.1", + "pdfcredentials-imap_server_port": 667, + "pdfcredentials-imap_connection_security": "starttls" } diff --git a/modoboa/lib/tests/__init__.py b/modoboa/lib/tests/__init__.py index 608197a41..eda6d56bf 100644 --- a/modoboa/lib/tests/__init__.py +++ b/modoboa/lib/tests/__init__.py @@ -1,6 +1,7 @@ """Testing utilities.""" import socket +import tempfile from django.conf import settings from django.core import management @@ -65,6 +66,8 @@ class ModoTestCase(ParametersMixin, TestCase): """Initiate test context.""" self.assertEqual( self.client.login(username=username, password=password), True) + self.workdir = tempfile.mkdtemp() + self.set_global_parameter("storage_dir", self.workdir, app="pdfcredentials") def ajax_request(self, method, url, params=None, status=200): if params is None: @@ -102,6 +105,8 @@ class ModoAPITestCase(ParametersMixin, APITestCase): """Setup.""" super(ModoAPITestCase, self).setUp() self.client.credentials(HTTP_AUTHORIZATION="Token " + self.token.key) + self.workdir = tempfile.mkdtemp() + self.set_global_parameter("storage_dir", self.workdir, app="pdfcredentials") def create_session(self): """Enable session storage across requests.""" diff --git a/modoboa/parameters/api/v2/tests.py b/modoboa/parameters/api/v2/tests.py index 0803b650d..33cf993be 100644 --- a/modoboa/parameters/api/v2/tests.py +++ b/modoboa/parameters/api/v2/tests.py @@ -11,8 +11,8 @@ class ParametersAPITestCase(ModoAPITestCase): url = reverse("v2:parameter-applications") resp = self.client.get(url) self.assertEqual(resp.status_code, 200) - # core, admin, limits - self.assertEqual(len(resp.json()), 3) + # core, admin, limits, pdf credentials + self.assertEqual(len(resp.json()), 4) def test_get_structure(self): url = reverse("v2:parameter-structure") diff --git a/modoboa/pdfcredentials/api/v2/tests.py b/modoboa/pdfcredentials/api/v2/tests.py index c970eaf9a..aa5cf5391 100644 --- a/modoboa/pdfcredentials/api/v2/tests.py +++ b/modoboa/pdfcredentials/api/v2/tests.py @@ -1,6 +1,5 @@ """API v2 tests.""" -import tempfile import shutil import os @@ -20,12 +19,6 @@ class PDFCredentialViewTestCase(ModoAPITestCase): super().setUpTestData() factories.populate_database() - def setUp(self): - """Create temp. directory to store files.""" - super().setUp() - self.workdir = tempfile.mkdtemp() - self.set_global_parameter("storage_dir", self.workdir) - def tearDown(self): """Reset test env.""" shutil.rmtree(self.workdir) From acfa666b921b86c6658208fc7b1fcb51ac620c81 Mon Sep 17 00:00:00 2001 From: Spitap Date: Sat, 18 Feb 2023 11:22:27 +0100 Subject: [PATCH 07/25] simpler fail if logo is not found --- modoboa/pdfcredentials/documents.py | 4 +++- modoboa/pdfcredentials/lib.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/modoboa/pdfcredentials/documents.py b/modoboa/pdfcredentials/documents.py index 21399a6d6..adaf9b572 100644 --- a/modoboa/pdfcredentials/documents.py +++ b/modoboa/pdfcredentials/documents.py @@ -62,7 +62,9 @@ def credentials(account, password): buff = BytesIO() doc = SimpleDocTemplate(buff, pagesize=A4) story = [] - story.append(resized_image(lib.get_document_logo(), 8*cm)) + logo = lib.get_document_logo() + if logo is not None: + story.append(resized_image(logo, 8*cm)) story.append(Spacer(1, 1 * cm)) story.append(Paragraph(conf["title"], styles["Title"])) story.append(Spacer(1, 1 * cm)) diff --git a/modoboa/pdfcredentials/lib.py b/modoboa/pdfcredentials/lib.py index 2d9785bbf..937dd6731 100644 --- a/modoboa/pdfcredentials/lib.py +++ b/modoboa/pdfcredentials/lib.py @@ -96,6 +96,9 @@ def get_document_logo(): logo = settings.MODOBOA_CUSTOM_LOGO logo = os.path.join(settings.MEDIA_ROOT, os.path.basename(logo)) except AttributeError: - logo = os.path.join(settings.STATIC_ROOT, "css/modoboa.png") + try: + logo = os.path.join(settings.STATIC_ROOT, "css/modoboa.png") + except OSError: + return None finally: return logo From 29f1111ee2609291b52a0d1eb98687e1f41208b6 Mon Sep 17 00:00:00 2001 From: Spitap Date: Sat, 18 Feb 2023 11:41:17 +0100 Subject: [PATCH 08/25] prevent crash if logo is not found --- modoboa/pdfcredentials/lib.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/modoboa/pdfcredentials/lib.py b/modoboa/pdfcredentials/lib.py index 937dd6731..a7bd85a4d 100644 --- a/modoboa/pdfcredentials/lib.py +++ b/modoboa/pdfcredentials/lib.py @@ -96,9 +96,7 @@ def get_document_logo(): logo = settings.MODOBOA_CUSTOM_LOGO logo = os.path.join(settings.MEDIA_ROOT, os.path.basename(logo)) except AttributeError: - try: - logo = os.path.join(settings.STATIC_ROOT, "css/modoboa.png") - except OSError: - return None - finally: - return logo + logo = os.path.join(settings.STATIC_ROOT, "css/modoboa.png") + if not os.path.isfile(logo): + return None + return logo From 229382467b7d6ee27a4573e01f6b90d3d2ec96bc Mon Sep 17 00:00:00 2001 From: Spitap Date: Sat, 18 Feb 2023 12:41:12 +0100 Subject: [PATCH 09/25] Removed old forms.py, better UX when custom actions are availible on v2 --- .../components/identities/IdentityList.vue | 21 +-- modoboa/pdfcredentials/forms.py | 145 ------------------ 2 files changed, 11 insertions(+), 155 deletions(-) diff --git a/frontend/src/components/identities/IdentityList.vue b/frontend/src/components/identities/IdentityList.vue index 991fba2fc..b181387f1 100644 --- a/frontend/src/components/identities/IdentityList.vue +++ b/frontend/src/components/identities/IdentityList.vue @@ -54,16 +54,17 @@ diff --git a/modoboa/pdfcredentials/forms.py b/modoboa/pdfcredentials/forms.py index 8546a25f5..3969b323e 100644 --- a/modoboa/pdfcredentials/forms.py +++ b/modoboa/pdfcredentials/forms.py @@ -1,146 +1 @@ """PDF credentials forms.""" - -from django import forms -from django.conf import settings -from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ - -from django.contrib.sites import models as sites_models - -from modoboa.lib import form_utils -from modoboa.parameters import forms as param_forms - -from . import constants - - -class ParametersForm(param_forms.AdminParametersForm): - """Admin parameters form.""" - - app = "pdfcredentials" - - docstore = form_utils.SeparatorField(label=_("Documents storage")) - - storage_dir = forms.CharField( - label=_("Directory to save documents into"), - initial="/var/lib/modoboa/pdf_credentials", - help_text=_("Path to a directory where PDF documents will be saved"), - ) - - security = form_utils.SeparatorField(label=_("Security options")) - - delete_first_dl = form_utils.YesNoField( - label=_("Delete documents after the first download"), - initial=True, - help_text=_( - "Automatically delete a document just after its first download " - "from this interface" - ) - ) - - generate_at_creation = form_utils.YesNoField( - label=_("Generate documents only at account creation"), - initial=True, - help_text=_( - "Generate a new document only when a new account is created. " - "If set to no, a new document will be created each time a " - "password is updated." - ) - ) - - customization = form_utils.SeparatorField(label=_("Customization options")) - - title = forms.CharField( - label=_("Title"), - initial=_("Personal account information"), - help_text=_("The document's title") - ) - - webpanel_url = forms.URLField( - label=_("Web panel url"), - help_text=_("URL of the Modoboa web panel") - ) - - custom_message = forms.CharField( - label=_("Custom message"), - help_text=_( - "A custom message that will appear at the end of documents"), - required=False - ) - - include_connection_settings = form_utils.YesNoField( - label=_("Include mail client connection settings"), - initial=False, - help_text=_( - "Include required SMTP and IMAP connection information to " - "configure a mail client, a tablet or a phone" - ) - ) - - smtp_server_address = forms.CharField( - label=_("SMTP server address"), - help_text=_("Address of the SMTP server (hostname or IP)") - ) - - smtp_server_port = forms.IntegerField( - label=_("SMTP server port"), - initial=587, - help_text=_("Listening port of the SMTP server") - ) - - smtp_connection_security = forms.ChoiceField( - label=_("SMTP connection security"), - choices=constants.CONNECTION_SECURITY_MODES, - initial="starttls", - help_text=_("Connection security mechanism") - ) - - imap_server_address = forms.CharField( - label=_("IMAP server address"), - help_text=_("Address of the IMAP server (hostname or IP)") - ) - - imap_server_port = forms.IntegerField( - label=_("IMAP server port"), - initial=143, - help_text=_("Listening port of the IMAP server") - ) - - imap_connection_security = forms.ChoiceField( - label=_("IMAP connection security"), - choices=constants.CONNECTION_SECURITY_MODES, - initial="starttls", - help_text=_("Connection security mechanism") - ) - - visibility_rules = { - "smtp_server_address": "include_connection_settings=True", - "smtp_server_port": "include_connection_settings=True", - "smtp_connection_security": "include_connection_settings=True", - "imap_server_address": "include_connection_settings=True", - "imap_server_port": "include_connection_settings=True", - "imap_connection_security": "include_connection_settings=True", - } - - @cached_property - def hostname(self): - """Return local hostname.""" - return sites_models.Site.objects.get_current().domain - - def __init__(self, *args, **kwargs): - """Set initial values.""" - super(ParametersForm, self).__init__(*args, **kwargs) - if not self.fields["webpanel_url"].initial: - url = "https://{}{}".format(self.hostname, settings.LOGIN_URL) - self.fields["webpanel_url"].initial = url - if not self.fields["smtp_server_address"].initial: - self.fields["smtp_server_address"].initial = self.hostname - if not self.fields["imap_server_address"].initial: - self.fields["imap_server_address"].initial = self.hostname - - -def load_settings(): - """Load app settings.""" - from modoboa.parameters import tools as param_tools - - param_tools.registry.add( - "global", ParametersForm, _("PDF credentials")) \ No newline at end of file From 696971fb802df26def96ec483c7a60ae39ac9312 Mon Sep 17 00:00:00 2001 From: Spitap Date: Sat, 18 Feb 2023 16:27:05 +0100 Subject: [PATCH 10/25] Added delete action for selected ids --- .../components/identities/IdentityList.vue | 110 +++++++++++++----- 1 file changed, 78 insertions(+), 32 deletions(-) diff --git a/frontend/src/components/identities/IdentityList.vue b/frontend/src/components/identities/IdentityList.vue index b181387f1..78e1d9261 100644 --- a/frontend/src/components/identities/IdentityList.vue +++ b/frontend/src/components/identities/IdentityList.vue @@ -8,6 +8,7 @@ + @@ -105,52 +106,92 @@ export default { } }, methods: { - async deleteAlias (alias) { - const confirm = await this.$refs.confirmAlias.open( - this.$gettext('Warning'), - this.$gettext( - 'Do you really want to delete the alias %{ alias }?', - { alias: alias.identity } - ), - { - color: 'error', - cancelLabel: this.$gettext('No'), - agreeLabel: this.$gettext('Yes') + sleep (milliseconds) { + return new Promise((resolve) => setTimeout(resolve, milliseconds)) + }, + async deleteAlias (alias, confirmDialog = true) { + if (confirmDialog) { + const confirm = await this.$refs.confirmAlias.open( + this.$gettext('Warning'), + this.$gettext( + 'Do you really want to delete the alias %{ alias }?', + { alias: alias.identity } + ), + { + color: 'error', + cancelLabel: this.$gettext('No'), + agreeLabel: this.$gettext('Yes') + } + ) + if (!confirm) { + return } - ) - if (!confirm) { - return } aliases.delete(alias.pk).then(() => { - bus.$emit('notification', { msg: this.$gettext('Alias deleted') }) - this.fetchIdentities() + if (confirmDialog) { + this.fetchIdentities() + bus.$emit('notification', { msg: this.$gettext('Alias deleted') }) + } }) }, - async deleteAccount (account) { - const confirm = await this.$refs.confirmAccount.open( - this.$gettext('Warning'), - this.$gettextInterpolate( - 'Do you really want to delete the account %{ account }?', - { account: account.identity } - ), - { - color: 'error', - cancelLabel: this.$gettext('No'), - agreeLabel: this.$gettext('Yes') + async deleteAccount (account, confirmDialog = true) { + if (confirmDialog) { + const confirm = await this.$refs.confirmAccount.open( + this.$gettext('Warning'), + this.$gettextInterpolate( + 'Do you really want to delete the account %{ account }?', + { account: account.identity } + ), + { + color: 'error', + cancelLabel: this.$gettext('No'), + agreeLabel: this.$gettext('Yes') + } + ) + if (!confirm) { + return } - ) - if (!confirm) { - return } const data = { keepdir: this.keepAccountFolder } accounts.delete(account.pk, data).then(() => { - bus.$emit('notification', { msg: this.$gettext('Account deleted') }) this.keepAccountFolder = false - this.fetchIdentities() + if (confirmDialog) { + bus.$emit('notification', { msg: this.$gettext('Account deleted') }) + this.fetchIdentities() + } }).catch(error => { bus.$emit('notification', { msg: error.response.data, type: 'error' }) }) }, + async deleteIdentities () { + if (this.selected.length === 0) { + return + } + const confirm = await this.$refs.confirmAlias.open( + this.$gettext('Warning'), + this.$gettext( + 'Do you really want to delete the selected identities?' + ), + { + color: 'error', + cancelLabel: this.$gettext('No'), + agreeLabel: this.$gettext('Yes') + } + ) + if (!confirm) { + return + } + for (const item of this.selected) { + if (item.type === 'account') { + this.deleteAccount(item, false) + } else if (item.type === 'alias') { + this.deleteAlias(item, false) + } + await this.sleep(100) + } + bus.$emit('notification', { msg: this.$gettext('Identities deleted') }) + this.fetchIdentities() + }, editAccount (account) { this.$router.push({ name: 'AccountEdit', params: { id: account.pk } }) }, @@ -183,6 +224,11 @@ export default { result.push({ label: this.$gettext('Delete'), icon: 'mdi-delete-outline', onClick: this.deleteAlias, color: 'red' }) } return result + }, + getActionMenuItems () { + const result = [] + result.push({ label: this.$gettext('Delete'), icon: 'mdi-delete-outline', onClick: this.deleteIdentities, color: 'red' }) + return result } }, mounted () { From 88743896ce3217646861a64137ac57bca1a9233b Mon Sep 17 00:00:00 2001 From: Spitap Date: Sun, 19 Feb 2023 10:09:17 +0100 Subject: [PATCH 11/25] clear selection when fetching identities --- frontend/src/components/identities/IdentityList.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/components/identities/IdentityList.vue b/frontend/src/components/identities/IdentityList.vue index 78e1d9261..508cbb9b7 100644 --- a/frontend/src/components/identities/IdentityList.vue +++ b/frontend/src/components/identities/IdentityList.vue @@ -201,6 +201,7 @@ export default { fetchIdentities () { identities.getAll().then(resp => { this.identities = resp.data + this.selected = [] }) }, getMenuItems (item) { @@ -228,6 +229,7 @@ export default { getActionMenuItems () { const result = [] result.push({ label: this.$gettext('Delete'), icon: 'mdi-delete-outline', onClick: this.deleteIdentities, color: 'red' }) + result.push({ label: 'Reload', icon: 'mdi-reload', onClick: this.fetchIdentities }) return result } }, From c40470660df30718555a9db89b6a0a850607f968 Mon Sep 17 00:00:00 2001 From: Spitap Date: Sun, 19 Feb 2023 10:23:14 +0100 Subject: [PATCH 12/25] increase coverage, removed old workarround --- modoboa/pdfcredentials/api/v2/serializers.py | 7 +- modoboa/pdfcredentials/api/v2/tests.py | 42 +++++-- modoboa/pdfcredentials/rfc6266.py | 109 ------------------- modoboa/pdfcredentials/views.py | 3 +- 4 files changed, 35 insertions(+), 126 deletions(-) delete mode 100644 modoboa/pdfcredentials/rfc6266.py diff --git a/modoboa/pdfcredentials/api/v2/serializers.py b/modoboa/pdfcredentials/api/v2/serializers.py index fba0a7809..5d5202978 100644 --- a/modoboa/pdfcredentials/api/v2/serializers.py +++ b/modoboa/pdfcredentials/api/v2/serializers.py @@ -23,7 +23,7 @@ class PDFCredentialsSettingsSerializer(serializers.Serializer): # Document storage storage_dir = serializers.CharField(default="/var/lib/modoboa/pdf_credentials") - + # Security options delete_first_dl = serializers.BooleanField(default=True) generate_at_creation = serializers.BooleanField(default=True) @@ -44,7 +44,7 @@ class PDFCredentialsSettingsSerializer(serializers.Serializer): class GetAccountCredentialsSerializer(serializers.Serializer): """A serializer for get account credential view.""" - account_id = serializers.IntegerField() + account_id = serializers.IntegerField() def validate(self, data): request = self.context["request"] @@ -54,7 +54,6 @@ class GetAccountCredentialsSerializer(serializers.Serializer): self.context["account"] = account return data - def save(self): fname = get_creds_filename(self.context["account"]) if not os.path.exists(fname): @@ -62,4 +61,4 @@ class GetAccountCredentialsSerializer(serializers.Serializer): self.context["content"] = decrypt_file(fname) if param_tools.get_global_parameter("delete_first_dl"): os.remove(fname) - self.context["fname"] = fname \ No newline at end of file + self.context["fname"] = fname diff --git a/modoboa/pdfcredentials/api/v2/tests.py b/modoboa/pdfcredentials/api/v2/tests.py index aa5cf5391..68491098c 100644 --- a/modoboa/pdfcredentials/api/v2/tests.py +++ b/modoboa/pdfcredentials/api/v2/tests.py @@ -7,7 +7,7 @@ from django.test import override_settings from django.urls import reverse from modoboa.admin import factories -from modoboa.core import models as core_models +from modoboa.core import models as core_models from modoboa.lib.tests import ModoAPITestCase @@ -37,7 +37,26 @@ class PDFCredentialViewTestCase(ModoAPITestCase): resp = self.client.post(url, data, format="json") self.assertEqual(resp.status_code, expected_status) return data - + + def test_pdfcredentials_disabled(self): + self.set_global_parameter("enabled_pdfcredentials", False) + values = self._create_account("leon5@test.com") + fname = os.path.join(self.workdir, "{}.pdf".format(values["username"])) + self.assertFalse(os.path.exists(fname)) + + # Check that link is not present in listing page + response = self.client.get(reverse("v2:identities-list"), format="json") + assert_action_in_response = False + for res_dict in response.json(): + for action in res_dict["possible_actions"]: + try: + if action.get("icon") == "mdi-file-download-outline": + assert_action_in_response = True + break + except KeyError: + continue + self.assertFalse(assert_action_in_response) + def test_password_updated(self): """Check that document is generated at account creation/update.""" values = self._create_account("leon@test.com") @@ -49,14 +68,14 @@ class PDFCredentialViewTestCase(ModoAPITestCase): response = self.client.get(reverse("v2:identities-list"), format="json") assert_action_in_response = False for res_dict in response.json(): - for action in res_dict["possible_actions"]: - try: - if action.get("icon") == "mdi-file-download-outline": - assert_action_in_response = True - break - except KeyError: - continue - self.assertEqual(assert_action_in_response, True) + for action in res_dict["possible_actions"]: + try: + if action.get("icon") == "mdi-file-download-outline": + assert_action_in_response = True + break + except KeyError: + continue + self.assertTrue(assert_action_in_response) # Try to download the file response = self.client.get( @@ -72,7 +91,8 @@ class PDFCredentialViewTestCase(ModoAPITestCase): response = self.client.get( reverse("v2:get-credentials", args=[account.pk])) - self.assertEqual(response.json()["detail"], "No document available for this user") + self.assertEqual(response.json()["detail"], + "No document available for this user") # Update account values.update({"language": "en"}) diff --git a/modoboa/pdfcredentials/rfc6266.py b/modoboa/pdfcredentials/rfc6266.py deleted file mode 100644 index c0dacb2d1..000000000 --- a/modoboa/pdfcredentials/rfc6266.py +++ /dev/null @@ -1,109 +0,0 @@ -""" -Copy of the original rfc6266 package, just the generation part. - -Orginal code is available at https://github.com/g2p/rfc6266. -""" - -from urllib.parse import quote - - -# RFC 2616 -separator_chars = "()<>@,;:\\\"/[]?={} \t" -# RFC 5987 -attr_chars_nonalnum = '!#$&+-.^_`|~' - - -def percent_encode(string, safe, encoding): - return quote(string, safe, encoding, errors='strict') - - -def is_token_char(ch): - # Must be ascii, and neither a control char nor a separator char - asciicode = ord(ch) - # < 128 means ascii, exclude control chars at 0-31 and 127, - # exclude separator characters. - return 31 < asciicode < 127 and ch not in separator_chars - - -def is_token(candidate): - return all(is_token_char(ch) for ch in candidate) - - -def is_ascii(text): - return all(ord(ch) < 128 for ch in text) - - -def fits_inside_codec(text, codec): - try: - text.encode(codec) - except UnicodeEncodeError: - return False - else: - return True - - -def is_lws_safe(text): - return normalize_ws(text) == text - - -def normalize_ws(text): - return ' '.join(text.split()) - - -def qd_quote(text): - return text.replace('\\', '\\\\').replace('"', '\\"') - - -def build_header( - filename, disposition='attachment', filename_compat=None -): - """Generate a Content-Disposition header for a given filename. - For legacy clients that don't understand the filename* parameter, - a filename_compat value may be given. - It should either be ascii-only (recommended) or iso-8859-1 only. - In the later case it should be a character string - (unicode in Python 2). - Options for generating filename_compat (only useful for legacy clients): - - ignore (will only send filename*); - - strip accents using unicode's decomposing normalisations, - which can be done from unicode data (stdlib), and keep only ascii; - - use the ascii transliteration tables from Unidecode (PyPI); - - use iso-8859-1 - Ignore is the safest, and can be used to trigger a fallback - to the document location (which can be percent-encoded utf-8 - if you control the URLs). - See https://tools.ietf.org/html/rfc6266#appendix-D - """ - - # While this method exists, it could also sanitize the filename - # by rejecting slashes or other weirdness that might upset a receiver. - - if disposition != 'attachment': - assert is_token(disposition) - - rv = disposition - - if is_token(filename): - rv += '; filename=%s' % (filename, ) - return rv - elif is_ascii(filename) and is_lws_safe(filename): - qd_filename = qd_quote(filename) - rv += '; filename="%s"' % (qd_filename, ) - if qd_filename == filename: - # RFC 6266 claims some implementations are iffy on qdtext's - # backslash-escaping, we'll include filename* in that case. - return rv - elif filename_compat: - if is_token(filename_compat): - rv += '; filename=%s' % (filename_compat, ) - else: - assert is_lws_safe(filename_compat) - rv += '; filename="%s"' % (qd_quote(filename_compat), ) - - # alnum are already considered always-safe, but the rest isn't. - # Python encodes ~ when it shouldn't, for example. - rv += "; filename*=utf-8''%s" % (percent_encode( - filename, safe=attr_chars_nonalnum, encoding='utf-8'), ) - - # This will only encode filename_compat, if it used non-ascii iso-8859-1. - return rv.encode('iso-8859-1') diff --git a/modoboa/pdfcredentials/views.py b/modoboa/pdfcredentials/views.py index 584675db7..7fe1b7d8e 100644 --- a/modoboa/pdfcredentials/views.py +++ b/modoboa/pdfcredentials/views.py @@ -14,7 +14,6 @@ from modoboa.lib.exceptions import ModoboaException, PermDeniedException from modoboa.parameters import tools as param_tools from .lib import decrypt_file, get_creds_filename -from .rfc6266 import build_header @login_required @@ -33,5 +32,5 @@ def get_account_credentials(request, accountid): resp = HttpResponse(content) resp["Content-Type"] = "application/pdf" resp["Content-Length"] = len(content) - resp["Content-Disposition"] = build_header(os.path.basename(fname)) + resp["Content-Disposition"] = f"attachment; filename={fname};" return resp From 34b0423f010c53a710cc7d215675f894135430dd Mon Sep 17 00:00:00 2001 From: Spitap Date: Thu, 23 Feb 2023 20:52:48 +0100 Subject: [PATCH 13/25] Run all tests on github action --- .github/workflows/modoboa.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/modoboa.yml b/.github/workflows/modoboa.yml index 5752b645f..09a60a020 100644 --- a/.github/workflows/modoboa.yml +++ b/.github/workflows/modoboa.yml @@ -101,7 +101,7 @@ jobs: run: | python ./tests.py cd test_project - python3 manage.py test modoboa.core modoboa.lib modoboa.admin modoboa.limits modoboa.transport modoboa.relaydomains modoboa.dnstools modoboa.ldapsync modoboa.policyd modoboa.maillog modoboa.parameters modoboa.dmarc + python3 manage.py test modoboa env: # use localhost for the host here because we are running the job on the VM. # If we were running the job on in a container this would be postgres From 0e2ff3007b89e8b69fdf2732bc8978192ef369f7 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 24 Feb 2023 12:49:01 +0100 Subject: [PATCH 14/25] Few enhancements. --- modoboa/admin/api/v2/serializers.py | 8 +++-- modoboa/dmarc/api/v2/serializers.py | 6 ++++ modoboa/dmarc/forms.py | 23 ++++++++++++++ modoboa/pdfcredentials/api/v2/handlers.py | 32 -------------------- modoboa/pdfcredentials/api/v2/serializers.py | 17 +++++++---- modoboa/pdfcredentials/app_settings.py | 11 +++++-- modoboa/pdfcredentials/apps.py | 2 +- modoboa/pdfcredentials/handlers.py | 19 ++++++++++++ 8 files changed, 73 insertions(+), 45 deletions(-) delete mode 100644 modoboa/pdfcredentials/api/v2/handlers.py diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py index e1310ebf9..129bc466c 100644 --- a/modoboa/admin/api/v2/serializers.py +++ b/modoboa/admin/api/v2/serializers.py @@ -306,22 +306,24 @@ class IdentitySerializer(serializers.Serializer): def __init__(self, instance=None, data=..., **kwargs): super().__init__(instance, data, **kwargs) self.fields["possible_actions"] = serializers.SerializerMethodField() - + def get_possible_actions(self, identity): if not isinstance(identity, core_models.User): - # Return empty action list if identity type is an alias (not used for now) + # Return empty action list if identity type is an alias + # (not used for now) return [] actions = admin_signals.extra_account_identities_actions.send( self.__class__, account=identity) cleaned_actions = [] for action in actions: - try : + try: serialized_data = IdPossibleActionsSerializer(action[1]).data cleaned_actions.append(serialized_data) except (ValidationError, AttributeError): continue return cleaned_actions + class AccountResourceSerializer(serializers.ModelSerializer): """Serializer for user resource.""" diff --git a/modoboa/dmarc/api/v2/serializers.py b/modoboa/dmarc/api/v2/serializers.py index 701a51c45..06bc14d31 100644 --- a/modoboa/dmarc/api/v2/serializers.py +++ b/modoboa/dmarc/api/v2/serializers.py @@ -30,3 +30,9 @@ class DMARCAligmentSerializer(serializers.Serializer): failed = serializers.DictField( child=serializers.DictField(child=SourceSerializer()) ) + + +class DmarcGlobalParametersSerializer(serializers.Serializer): + """Serializer for global parameters.""" + + enable_rlookups = serializers.BooleanField(default=False) diff --git a/modoboa/dmarc/forms.py b/modoboa/dmarc/forms.py index f3679994e..29b2842d0 100644 --- a/modoboa/dmarc/forms.py +++ b/modoboa/dmarc/forms.py @@ -1,9 +1,12 @@ """Custom forms.""" +import collections + from django import forms from django.utils import timezone from django.utils.translation import ugettext_lazy as _ +from modoboa.dmarc.api.v2 import serializers from modoboa.lib import form_utils from modoboa.parameters import forms as param_forms @@ -43,9 +46,29 @@ class ParametersForm(param_forms.AdminParametersForm): ) +GLOBAL_PARAMETERS_STRUCT = collections.OrderedDict([ + ("dns", { + "label": _("DNS settings"), + "params": collections.OrderedDict([ + ("enable_rlookups", { + "label": _("Enable reverse lookups"), + "help_text": _( + "Enable reverse DNS lookups (reports will be longer to display)" + ) + }) + ]) + }) +]) + + def load_settings(): """Load app settings.""" from modoboa.parameters import tools as param_tools param_tools.registry.add( "global", ParametersForm, _("DMARC")) + param_tools.registry.add2( + "global", "dmarc", _("DMARC"), + GLOBAL_PARAMETERS_STRUCT, + serializers.DmarcGlobalParametersSerializer + ) diff --git a/modoboa/pdfcredentials/api/v2/handlers.py b/modoboa/pdfcredentials/api/v2/handlers.py deleted file mode 100644 index 453136216..000000000 --- a/modoboa/pdfcredentials/api/v2/handlers.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Handlers for PDF credientials api v2.""" - -import os - -from django.urls import reverse -from django.dispatch import receiver -from django.utils.translation import ugettext as _ - -from modoboa.admin import signals as admin_signals -from modoboa.parameters import tools as param_tools - -from ...lib import get_creds_filename - - -@receiver(admin_signals.extra_account_identities_actions) -def extra_identities_actions(sender, account, **kwargs): - """ - Add download credential action for identity. - Used for api v2. - """ - if not param_tools.get_global_parameter("enabled_pdfcredentials"): - return [] - fname = get_creds_filename(account) - if not os.path.exists(fname): - return [] - return { - "name": "get_credentials", - "url": reverse("v2:get-credentials", - args=[account.id]), - "icon": "mdi-file-download-outline", - "label": _("Download PDF credentials.") - } diff --git a/modoboa/pdfcredentials/api/v2/serializers.py b/modoboa/pdfcredentials/api/v2/serializers.py index 5d5202978..8bc0f20e7 100644 --- a/modoboa/pdfcredentials/api/v2/serializers.py +++ b/modoboa/pdfcredentials/api/v2/serializers.py @@ -7,11 +7,10 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers, status from rest_framework.exceptions import PermissionDenied, APIException - from modoboa.core.models import User from modoboa.parameters import tools as param_tools -from ...lib import decrypt_file, get_creds_filename +from ...lib import decrypt_file, get_creds_filename from ...constants import CONNECTION_SECURITY_MODES @@ -31,14 +30,17 @@ class PDFCredentialsSettingsSerializer(serializers.Serializer): # Customization options title = serializers.CharField(default=_("Personal account information")) webpanel_url = serializers.URLField() - custom_message = serializers.CharField(required=False, allow_blank=True) + custom_message = serializers.CharField( + required=False, allow_blank=True, allow_null=True) include_connection_settings = serializers.BooleanField(default=False) smtp_server_address = serializers.CharField() smtp_server_port = serializers.IntegerField(default=587) - smtp_connection_security = serializers.ChoiceField(choices=CONNECTION_SECURITY_MODES, default="starttls") + smtp_connection_security = serializers.ChoiceField( + choices=CONNECTION_SECURITY_MODES, default="starttls") imap_server_address = serializers.CharField() imap_server_port = serializers.IntegerField(default=143) - imap_connection_security = serializers.ChoiceField(choices=CONNECTION_SECURITY_MODES, default="starttls") + imap_connection_security = serializers.ChoiceField( + choices=CONNECTION_SECURITY_MODES, default="starttls") class GetAccountCredentialsSerializer(serializers.Serializer): @@ -57,7 +59,10 @@ class GetAccountCredentialsSerializer(serializers.Serializer): def save(self): fname = get_creds_filename(self.context["account"]) if not os.path.exists(fname): - raise APIException( _("No document available for this user"), status.HTTP_400_BAD_REQUEST) + raise APIException( + _("No document available for this user"), + status.HTTP_400_BAD_REQUEST + ) self.context["content"] = decrypt_file(fname) if param_tools.get_global_parameter("delete_first_dl"): os.remove(fname) diff --git a/modoboa/pdfcredentials/app_settings.py b/modoboa/pdfcredentials/app_settings.py index b5bd958ba..d0055c055 100644 --- a/modoboa/pdfcredentials/app_settings.py +++ b/modoboa/pdfcredentials/app_settings.py @@ -82,26 +82,32 @@ PDF_CREDENTIALS_PARAMETERS_STRUCT = collections.OrderedDict([ }), ("smtp_server_address", { "label": _("SMTP server address"), + "display": "include_connection_settings=True", "help_text": _("Address of the SMTP server (hostname or IP)") }), ("smtp_server_port", { "label": _("SMTP server port"), - "help_port": _("Listening port of the SMTP server") + "display": "include_connection_settings=true", + "help_text": _("Listening port of the SMTP server") }), ("smtp_connection_security", { "label": _("SMTP connection security"), + "display": "include_connection_settings=true", "help_text": _("Connection security mechanism") }), ("imap_server_address", { "label": _("IMAP server address"), + "display": "include_connection_settings=true", "help_text": _("Address of the IMAP server (hostname or IP)") }), ("imap_server_port", { "label": _("IMAP server port"), + "display": "include_connection_settings=true", "help_text": _("Listening port of the IMAP server") }), ("imap_connection_security", { "label": _("IMAP connection security"), + "display": "include_connection_settings=true", "help_text": _("Connection security mechanism") }) ]) @@ -109,7 +115,6 @@ PDF_CREDENTIALS_PARAMETERS_STRUCT = collections.OrderedDict([ ]) - class ParametersForm(param_forms.AdminParametersForm): """Admin parameters form.""" @@ -118,7 +123,7 @@ class ParametersForm(param_forms.AdminParametersForm): general = form_utils.SeparatorField(label=_("General")) enabled_pdfcredentials = form_utils.YesNoField( - label= _("Enable PDF credentials"), + label=_("Enable PDF credentials"), initial=True, help_text=_("Enabled PDF credentials document generation on account creation.") ) diff --git a/modoboa/pdfcredentials/apps.py b/modoboa/pdfcredentials/apps.py index 761eb4fe1..d8dc2ff9a 100644 --- a/modoboa/pdfcredentials/apps.py +++ b/modoboa/pdfcredentials/apps.py @@ -31,5 +31,5 @@ class PDFCredentialsConfig(AppConfig): def ready(self): from . import handlers - from .api.v2 import handlers + load_pdfcredential_settings() diff --git a/modoboa/pdfcredentials/handlers.py b/modoboa/pdfcredentials/handlers.py index 448cea6bd..db3646871 100644 --- a/modoboa/pdfcredentials/handlers.py +++ b/modoboa/pdfcredentials/handlers.py @@ -7,6 +7,7 @@ from django.db.models import signals from django.dispatch import receiver from django.utils.translation import ugettext as _ +from modoboa.admin import signals as admin_signals from modoboa.core import models as core_models from modoboa.core import signals as core_signals from modoboa.parameters import tools as param_tools @@ -51,3 +52,21 @@ def extra_account_actions(sender, account, **kwargs): }] +@receiver(admin_signals.extra_account_identities_actions) +def extra_identities_actions(sender, account, **kwargs): + """ + Add download credential action for identity. + Used for api v2. + """ + if not param_tools.get_global_parameter("enabled_pdfcredentials"): + return [] + fname = get_creds_filename(account) + if not os.path.exists(fname): + return [] + return { + "name": "get_credentials", + "url": reverse("v2:get-credentials", + args=[account.id]), + "icon": "mdi-file-download-outline", + "label": _("Download PDF credentials") + } From e74834175f36944dab3f55cb01cdcfe6146c3ab8 Mon Sep 17 00:00:00 2001 From: Spitap Date: Fri, 24 Feb 2023 13:39:15 +0100 Subject: [PATCH 15/25] better file download handling --- frontend/src/api/credentials.js | 7 +++++++ .../components/identities/IdentityList.vue | 21 +++++++++++++++---- modoboa/admin/api/v2/serializers.py | 2 +- modoboa/pdfcredentials/api/v2/views.py | 4 ++-- modoboa/pdfcredentials/handlers.py | 3 +-- 5 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 frontend/src/api/credentials.js diff --git a/frontend/src/api/credentials.js b/frontend/src/api/credentials.js new file mode 100644 index 000000000..b8f0f7e1a --- /dev/null +++ b/frontend/src/api/credentials.js @@ -0,0 +1,7 @@ +import repository from './repository' + +export default { + getCredentials (id) { + return repository.get(`credentials/${id}/`) + } +} diff --git a/frontend/src/components/identities/IdentityList.vue b/frontend/src/components/identities/IdentityList.vue index 508cbb9b7..657d1a951 100644 --- a/frontend/src/components/identities/IdentityList.vue +++ b/frontend/src/components/identities/IdentityList.vue @@ -83,6 +83,7 @@ import { bus } from '@/main' import identities from '@/api/identities' import accounts from '@/api/accounts' import aliases from '@/api/aliases' +import credentials from '@/api/credentials' import ConfirmDialog from '@/components/layout/ConfirmDialog' import MenuItems from '@/components/tools/MenuItems' @@ -211,10 +212,20 @@ export default { result.push({ label: this.$gettext(element.label), icon: element.icon, - link: element.url, onClick: () => { - window.open(element.url) - this.fetchIdentities() + if (element.body.type === 'pdfcredentials') { + credentials.getCredentials(item.pk) + .then((response) => { + const blob = new Blob([response.data], { + type: 'application/pdf' + }) + const _url = window.URL.createObjectURL(blob) + window.open(_url, '_blank').focus() + }).catch((err) => { + console.log(err) + }) + this.fetchIdentities() + } } }) }) @@ -228,7 +239,9 @@ export default { }, getActionMenuItems () { const result = [] - result.push({ label: this.$gettext('Delete'), icon: 'mdi-delete-outline', onClick: this.deleteIdentities, color: 'red' }) + if (this.selected.length > 0) { + result.push({ label: this.$gettext('Delete'), icon: 'mdi-delete-outline', onClick: this.deleteIdentities, color: 'red' }) + } result.push({ label: 'Reload', icon: 'mdi-reload', onClick: this.fetchIdentities }) return result } diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py index 129bc466c..7f943e67f 100644 --- a/modoboa/admin/api/v2/serializers.py +++ b/modoboa/admin/api/v2/serializers.py @@ -291,7 +291,7 @@ class IdPossibleActionsSerializer(serializers.Serializer): name = serializers.CharField() icon = serializers.CharField() label = serializers.CharField() - url = serializers.URLField() + body = serializers.DictField() class IdentitySerializer(serializers.Serializer): diff --git a/modoboa/pdfcredentials/api/v2/views.py b/modoboa/pdfcredentials/api/v2/views.py index eb8b844eb..4dbae2757 100644 --- a/modoboa/pdfcredentials/api/v2/views.py +++ b/modoboa/pdfcredentials/api/v2/views.py @@ -1,7 +1,7 @@ """PDF Credentials API v2 views.""" from django.utils.translation import ugettext as _ -from django.http import HttpResponse +from django.http import HttpResponse from rest_framework import permissions from rest_framework.views import APIView @@ -33,7 +33,7 @@ class PDFCredentialView(APIView): content = serializer.context["content"] fname = serializer.context["fname"] resp = HttpResponse(content) - resp["Content-Type"] = "application/pdf" + resp["Content-Type"] = "application/pdf;base64" resp["Content-Length"] = len(content) resp["Content-Disposition"] = f"attachment; filename={fname};" return resp diff --git a/modoboa/pdfcredentials/handlers.py b/modoboa/pdfcredentials/handlers.py index db3646871..ad809b9d2 100644 --- a/modoboa/pdfcredentials/handlers.py +++ b/modoboa/pdfcredentials/handlers.py @@ -65,8 +65,7 @@ def extra_identities_actions(sender, account, **kwargs): return [] return { "name": "get_credentials", - "url": reverse("v2:get-credentials", - args=[account.id]), + "body": {"type": "pdfcredentials"}, "icon": "mdi-file-download-outline", "label": _("Download PDF credentials") } From 4e7a956996e73eefe43af3715bedb51ec13a8a85 Mon Sep 17 00:00:00 2001 From: Spitap Date: Fri, 24 Feb 2023 13:48:11 +0100 Subject: [PATCH 16/25] added parameter --- modoboa/parameters/api/v2/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/parameters/api/v2/tests.py b/modoboa/parameters/api/v2/tests.py index 33cf993be..0bcb34a83 100644 --- a/modoboa/parameters/api/v2/tests.py +++ b/modoboa/parameters/api/v2/tests.py @@ -12,7 +12,7 @@ class ParametersAPITestCase(ModoAPITestCase): resp = self.client.get(url) self.assertEqual(resp.status_code, 200) # core, admin, limits, pdf credentials - self.assertEqual(len(resp.json()), 4) + self.assertEqual(len(resp.json()), 5) def test_get_structure(self): url = reverse("v2:parameter-structure") From 6c1c6194ab2501e8ab732baa95500d510b34dfbd Mon Sep 17 00:00:00 2001 From: Spitap Date: Fri, 24 Feb 2023 18:02:06 +0100 Subject: [PATCH 17/25] Updated doc and translation --- doc/upgrade.rst | 11 +- frontend/locale/br/LC_MESSAGES/app.po | 309 ++++++++---------- frontend/locale/cs/LC_MESSAGES/app.po | 286 ++++++++-------- frontend/locale/de/LC_MESSAGES/app.po | 306 ++++++++---------- frontend/locale/el/LC_MESSAGES/app.po | 286 ++++++++-------- frontend/locale/en/LC_MESSAGES/app.po | 191 ++++++----- frontend/locale/es/LC_MESSAGES/app.po | 302 ++++++++--------- frontend/locale/fi/LC_MESSAGES/app.po | 360 +++++++++------------ frontend/locale/fr/LC_MESSAGES/app.po | 319 ++++++++---------- frontend/locale/it/LC_MESSAGES/app.po | 308 ++++++++---------- frontend/locale/ja/LC_MESSAGES/app.po | 286 ++++++++-------- frontend/locale/nl/LC_MESSAGES/app.po | 286 ++++++++-------- frontend/locale/pl/LC_MESSAGES/app.po | 286 ++++++++-------- frontend/locale/po/LC_MESSAGES/app.po | 286 ++++++++-------- frontend/locale/pt-br/LC_MESSAGES/app.po | 286 ++++++++-------- frontend/locale/pt/LC_MESSAGES/app.po | 286 ++++++++-------- frontend/locale/ru/LC_MESSAGES/app.po | 297 ++++++++--------- frontend/locale/sv/LC_MESSAGES/app.po | 302 ++++++++--------- frontend/locale/tr/LC_MESSAGES/app.po | 294 ++++++++--------- frontend/locale/zh-hant/LC_MESSAGES/app.po | 286 ++++++++-------- 20 files changed, 2547 insertions(+), 3026 deletions(-) diff --git a/doc/upgrade.rst b/doc/upgrade.rst index 4422d2244..b58b702f0 100644 --- a/doc/upgrade.rst +++ b/doc/upgrade.rst @@ -111,9 +111,9 @@ Specific instructions 2.1.0 ===== -The ``modoboa-dmarc`` plugin has been merged into the core. +The ``modoboa-dmarc`` and ``modoboa.pdfcredentials`` plugins have been merged into the core. -Add ``'modoboa.dmarc'`` to ``MODOBOA_APPS``: +Add ``'modoboa.dmarc'`` and ``'modoboa.pdfcredentials'`` to ``MODOBOA_APPS``: .. sourcecode:: python @@ -130,18 +130,19 @@ Add ``'modoboa.dmarc'`` to ``MODOBOA_APPS``: 'modoboa.policyd', 'modoboa.maillog', 'modoboa.dmarc', + 'modoboa.pdfcredentials' ) -And remove any reference to ``modoboa_dmarc`` in this same variable. +And remove any reference to ``'modoboa_dmarc'`` or ``'modoboa.pdfcredentials'`` in this same variable. -FIXME: INSTALLATION django-rename-app +After upgrading modoboa, run the following commands from your virtual environment: .. sourcecode:: bash python manage.py rename_app modoboa_dmarc dmarc -2.0.4t +2.0.4 ===== The following modifications must be applied to the :file:`settings.py` file: diff --git a/frontend/locale/br/LC_MESSAGES/app.po b/frontend/locale/br/LC_MESSAGES/app.po index 84bae4cca..133985391 100644 --- a/frontend/locale/br/LC_MESSAGES/app.po +++ b/frontend/locale/br/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:17+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -27,29 +27,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -65,8 +58,8 @@ msgstr "Kont" msgid "Account created" msgstr "Kont krouet" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -78,9 +71,9 @@ msgstr "Kont hizivaet" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "Oberioù" @@ -105,9 +98,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "Chomlec'h" @@ -145,8 +138,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -160,8 +154,8 @@ msgstr "Alias" msgid "Alias created" msgstr "Alias krouet" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -172,9 +166,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -183,10 +175,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "Aliasoù" @@ -282,12 +274,9 @@ msgstr "Cheñch ger-tremen" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" -"Kochit an dibarzh ma ne vez ket kriptet ar gerioù-tremen endalc'het en ho " -"restr" +msgstr "Kochit an dibarzh ma ne vez ket kriptet ar gerioù-tremen endalc'het en ho restr" #: src/components/domains/DomainAliasForm.vue:56 #: src/components/domains/DomainAliasForm.vue:26 @@ -298,8 +287,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -308,8 +296,7 @@ msgstr "" msgid "Close" msgstr "Serriñ" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "Serriñ" @@ -324,8 +311,7 @@ msgstr "Kadarnadur" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -381,8 +367,7 @@ msgstr "" msgid "Creation date" msgstr "Deiziad krouidigezh" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "Kriptañ ar gerioù-tremen" @@ -406,8 +391,8 @@ msgstr "Taolenn-stur" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -424,20 +409,18 @@ msgid "Default mailbox quota" msgstr "Kota boest-posteloù dre-ziouer" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." -msgstr "" -"Kota arloet d'ar boestoù-postel. Gellout a ra bezañ ezpleget e Ko, Mo " -"(diouer) pe Go c'hoazh. Un dalvoudegezh \"0\" a dalvez kota ebet." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Kota arloet d'ar boestoù-postel. Gellout a ra bezañ ezpleget e Ko, Mo (diouer) pe Go c'hoazh. Un dalvoudegezh \"0\" a dalvez kota ebet." #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -449,9 +432,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "Deskrivadur" @@ -488,8 +471,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -555,7 +537,7 @@ msgstr "" msgid "DNS status" msgstr "Statud DNS" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -563,16 +545,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "Domani" @@ -635,11 +622,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -660,6 +647,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -703,8 +691,8 @@ msgstr "Enaouiñ ar gwiriañ DNS" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "Enaouet" @@ -719,9 +707,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -745,8 +731,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "Diamzeriet da" @@ -767,10 +753,9 @@ msgstr "C'hwitet" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -786,9 +771,7 @@ msgstr "Treuzkas" #: src/components/user/ForwardForm.vue:6 msgid "Forward messages and store copies into your local mailbox" -msgstr "" -"Treuzkas kemennadennoù ha stokiñ eiladennoù e-barzh ar voest-posteloù " -"lec'hel" +msgstr "Treuzkas kemennadennoù ha stokiñ eiladennoù e-barzh ar voest-posteloù lec'hel" #: src/components/user/ForwardForm.vue:19 #: src/components/user/ForwardForm.vue:52 @@ -817,8 +800,8 @@ msgstr "" msgid "Full name" msgstr "Anv klok" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -837,11 +820,11 @@ msgstr "Linennet penn-da-benn" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "Hollek" @@ -874,9 +857,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -897,17 +878,19 @@ msgstr "" msgid "Identities" msgstr "Identelezhioù" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +#, fuzzy +msgid "Identities deleted" +msgstr "Identelezhioù" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -995,9 +978,9 @@ msgstr "Deiziad aozañ diwezhañ" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1031,7 +1014,7 @@ msgid "Logger" msgstr "Enroller" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "Digevreañ" @@ -1043,9 +1026,9 @@ msgstr "Marilhoù" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "Boest-posteloù" @@ -1067,8 +1050,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1104,14 +1087,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "Anv" @@ -1128,8 +1111,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1155,14 +1137,16 @@ msgstr "Da-heul" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1180,13 +1164,11 @@ msgid "Not generated" msgstr "Neket ganet" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1203,8 +1185,7 @@ msgstr "" msgid "One or more updates are available" msgstr "Hegerz ez eus un hizivadenn pe muioc'h" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1244,9 +1225,9 @@ msgstr "Ger-tremen" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1312,8 +1293,7 @@ msgstr "Profil hizivaet" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1323,31 +1303,20 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "Kota" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." -msgstr "" -"Kota evit ar voest-posteloù-mañ. Gellout a ra bezañ ezpleget e Ko, Mo " -"(diouer) pe Go c'hoazh. Termeniñ un dalvoudegezh ispisial pe implijit " -"talvoudegezh an domani. Laoskit goullo evit termeniñ un dalvoudegezh " -"divevenn (berzet evit ar verourien zomani)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." +msgstr "Kota evit ar voest-posteloù-mañ. Gellout a ra bezañ ezpleget e Ko, Mo (diouer) pe Go c'hoazh. Termeniñ un dalvoudegezh ispisial pe implijit talvoudegezh an domani. Laoskit goullo evit termeniñ un dalvoudegezh divevenn (berzet evit ar verourien zomani)." #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." -msgstr "" -"Kota rannet kenetre ar boestoù-postel. Gellout a ra bezañ ezpleget e Ko, Mo " -"(diouer) pe Go c'hoazh. Un dalvoudegezh \"0\" a dalvez kota ebet." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Kota rannet kenetre ar boestoù-postel. Gellout a ra bezañ ezpleget e Ko, Mo (diouer) pe Go c'hoazh. Un dalvoudegezh \"0\" a dalvez kota ebet." #: src/components/domains/DomainForm.vue:68 #: src/components/identities/AccountForm.vue:64 @@ -1367,8 +1336,8 @@ msgstr "Chomlec'h dre-zegouezh" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "Ger-tremen dre-zegouezh" @@ -1451,8 +1420,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1579,8 +1548,7 @@ msgstr "" msgid "Statistics" msgstr "Statud" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1602,15 +1570,13 @@ msgstr "Berradenn" msgid "Super administrator" msgstr "Dreist-merour" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 msgid "Tags" msgstr "Balizoù" #: 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." +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 @@ -1646,10 +1612,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1673,8 +1639,7 @@ msgstr "" msgid "Transport" msgstr "Treuzdougen" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1689,9 +1654,7 @@ 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." +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 @@ -1758,9 +1721,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "Anv implier" @@ -1783,14 +1746,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1819,14 +1784,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1846,18 +1813,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "Disklotadurioù gerioù-tremen" @@ -1874,6 +1829,18 @@ msgstr "Ar vaezienn-mañ a zo rekiset" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/cs/LC_MESSAGES/app.po b/frontend/locale/cs/LC_MESSAGES/app.po index def0af8b5..7792e3717 100644 --- a/frontend/locale/cs/LC_MESSAGES/app.po +++ b/frontend/locale/cs/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -283,8 +275,7 @@ msgstr "" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" @@ -297,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -307,8 +297,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -323,8 +312,7 @@ msgstr "" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -380,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "" @@ -405,8 +392,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -423,18 +410,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -446,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -485,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -552,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -560,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -632,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -657,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -700,8 +692,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -716,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -742,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -764,10 +754,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -811,8 +800,8 @@ msgstr "" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -830,11 +819,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "" @@ -867,9 +856,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -890,17 +877,18 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -988,9 +976,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1024,7 +1012,7 @@ msgid "Logger" msgstr "" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "" @@ -1036,9 +1024,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1060,8 +1048,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1097,14 +1085,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "" @@ -1121,8 +1109,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1148,14 +1135,16 @@ msgstr "" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1173,13 +1162,11 @@ msgid "Not generated" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1196,8 +1183,7 @@ msgstr "" msgid "One or more updates are available" msgstr "" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1237,9 +1223,9 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1305,8 +1291,7 @@ msgstr "" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1316,24 +1301,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." msgstr "" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1354,8 +1334,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1438,8 +1418,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1565,8 +1545,7 @@ msgstr "" msgid "Statistics" msgstr "" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1588,15 +1567,13 @@ msgstr "" msgid "Super administrator" msgstr "" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1632,10 +1609,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1659,8 +1636,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1674,9 +1650,7 @@ 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." +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 @@ -1743,9 +1717,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "" @@ -1768,14 +1742,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1804,14 +1780,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1831,18 +1809,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "" @@ -1859,6 +1825,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/de/LC_MESSAGES/app.po b/frontend/locale/de/LC_MESSAGES/app.po index 9f679df92..b638e700f 100644 --- a/frontend/locale/de/LC_MESSAGES/app.po +++ b/frontend/locale/de/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:17+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "Konto" msgid "Account created" msgstr "Konto erstellt" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "Konto aktualisiert" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "Aktionen" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "Adresse" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "Alias" msgid "Alias created" msgstr "Alias erstellt" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "Aliase" @@ -283,8 +275,7 @@ msgstr "Passwort ändern" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "Auswählen, wenn Kennwörter in Datei nicht verschlüsselt sind" @@ -297,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -307,8 +297,7 @@ msgstr "" msgid "Close" msgstr "Schließen" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "Schließen" @@ -323,11 +312,8 @@ msgstr "Bestätigung" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." -msgstr "" -"Glückwunsch! Die Zwei-Faktor-Authentifizierung ist nun für diesen Account " -"aktiviert." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." +msgstr "Glückwunsch! Die Zwei-Faktor-Authentifizierung ist nun für diesen Account aktiviert." #: src/views/Login.vue:23 msgid "Connect" @@ -382,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "Erstellungsdatum" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "Passwörter verschlüsseln" @@ -407,8 +392,8 @@ msgstr "Dashboard" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "Datum" @@ -425,20 +410,18 @@ msgid "Default mailbox quota" msgstr "Standard Postfach Kontingent" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." -msgstr "" -"Auf Postfächer angewendete Quota. Kann in KB, MB (Voreinstellung) oder GB " -"angegeben werden. 0 eingeben, um keine Quota zu verwenden." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Auf Postfächer angewendete Quota. Kann in KB, MB (Voreinstellung) oder GB angegeben werden. 0 eingeben, um keine Quota zu verwenden." #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -450,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "Beschreibung" @@ -489,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -556,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "DNS Status" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -564,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "Domain" @@ -636,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -661,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -704,8 +692,8 @@ msgstr "Aktiviere DNS Prüfungen" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "Aktiviert" @@ -720,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -746,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "Läuft ab am" @@ -768,10 +754,9 @@ msgstr "Fehlgeschlagen" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -816,8 +801,8 @@ msgstr "Von" msgid "Full name" msgstr "Vollständiger Name" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -836,11 +821,11 @@ msgstr "Voll zugeordnet" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "Allgemein" @@ -873,9 +858,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -896,17 +879,19 @@ msgstr "" msgid "Identities" msgstr "Identitäten" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +#, fuzzy +msgid "Identities deleted" +msgstr "Identitäten" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -994,9 +979,9 @@ msgstr "Datum der letzten Änderung" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1030,7 +1015,7 @@ msgid "Logger" msgstr "Logger" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "Logout" @@ -1042,9 +1027,9 @@ msgstr "Logs" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "Postfächer" @@ -1066,8 +1051,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1103,14 +1088,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "Name" @@ -1127,8 +1112,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1154,14 +1138,16 @@ msgstr "Weiter" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1179,13 +1165,11 @@ msgid "Not generated" msgstr "Nicht generiert" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1202,8 +1186,7 @@ msgstr "" msgid "One or more updates are available" msgstr "Eine oder mehrere Aktualisierungen sind verfügbar" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1243,9 +1226,9 @@ msgstr "Passwort" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1311,8 +1294,7 @@ msgstr "Profil aktualisiert" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1322,32 +1304,20 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." -msgstr "" -"Quota dieses Postfachs. Kann in KB, MB (Voreinstellung) oder GB angegeben " -"werden. Eigenen Wert eingeben oder Voreinstellung der Domain verwenden " -"lassen. Frei lassen, um Quota auf unlimitiert zu setzen (nur Super-" -"Administratoren)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." +msgstr "Quota dieses Postfachs. Kann in KB, MB (Voreinstellung) oder GB angegeben werden. Eigenen Wert eingeben oder Voreinstellung der Domain verwenden lassen. Frei lassen, um Quota auf unlimitiert zu setzen (nur Super-Administratoren)." #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." -msgstr "" -"Von Postfächern gemeinsam genutzte Quota/Speicherplatz. Kann in KB, MB " -"(Voreinstellung) oder GB angegeben werden. 0 eingeben, um keine Quota zu " -"verwenden." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Von Postfächern gemeinsam genutzte Quota/Speicherplatz. Kann in KB, MB (Voreinstellung) oder GB angegeben werden. 0 eingeben, um keine Quota zu verwenden." #: src/components/domains/DomainForm.vue:68 #: src/components/identities/AccountForm.vue:64 @@ -1367,8 +1337,8 @@ msgstr "Zufällige Adresse" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "Zufälliges Passwort" @@ -1451,8 +1421,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1579,8 +1549,7 @@ msgstr "" msgid "Statistics" msgstr "Statistiken" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1602,15 +1571,13 @@ msgstr "Zusammenfassung" msgid "Super administrator" msgstr "Super-Administrator" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1646,10 +1613,10 @@ msgstr "Bis" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1673,8 +1640,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1689,9 +1655,7 @@ 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." +msgid "Two-Factor Authentication (2FA) is not yet activated for your account. Enabling this feature will increase your account's security." msgstr "" "Zwei-Faktor-Authentifizierung (2FA) ist noch nicht für diesen Account aktiviert.\n" "Aktiviere dieses Feature, um die Account-Sicherheit zu erhöhen." @@ -1760,9 +1724,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "Benutzername" @@ -1785,14 +1749,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1821,14 +1787,16 @@ msgstr "Jahr" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1848,18 +1816,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "Passwörter stimmen nicht überein" @@ -1876,6 +1832,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/el/LC_MESSAGES/app.po b/frontend/locale/el/LC_MESSAGES/app.po index 65e2a1562..da6d6386d 100644 --- a/frontend/locale/el/LC_MESSAGES/app.po +++ b/frontend/locale/el/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -283,8 +275,7 @@ msgstr "" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" @@ -297,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -307,8 +297,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -323,8 +312,7 @@ msgstr "" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -380,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "" @@ -405,8 +392,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -423,18 +410,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -446,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -485,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -552,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -560,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -632,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -657,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -700,8 +692,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -716,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -742,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -764,10 +754,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -811,8 +800,8 @@ msgstr "" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -830,11 +819,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "" @@ -867,9 +856,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -890,17 +877,18 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -988,9 +976,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1024,7 +1012,7 @@ msgid "Logger" msgstr "" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "" @@ -1036,9 +1024,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1060,8 +1048,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1097,14 +1085,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "" @@ -1121,8 +1109,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1148,14 +1135,16 @@ msgstr "" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1173,13 +1162,11 @@ msgid "Not generated" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1196,8 +1183,7 @@ msgstr "" msgid "One or more updates are available" msgstr "" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1237,9 +1223,9 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1305,8 +1291,7 @@ msgstr "" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1316,24 +1301,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." msgstr "" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1354,8 +1334,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1438,8 +1418,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1565,8 +1545,7 @@ msgstr "" msgid "Statistics" msgstr "" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1588,15 +1567,13 @@ msgstr "" msgid "Super administrator" msgstr "" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1632,10 +1609,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1659,8 +1636,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1674,9 +1650,7 @@ 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." +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 @@ -1743,9 +1717,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "" @@ -1768,14 +1742,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1804,14 +1780,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1831,18 +1809,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "" @@ -1859,6 +1825,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/en/LC_MESSAGES/app.po b/frontend/locale/en/LC_MESSAGES/app.po index dd9047bd4..10fd17dae 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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en\n" @@ -54,8 +54,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -67,9 +67,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -94,9 +94,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -134,8 +134,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -149,8 +150,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -170,10 +171,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -386,8 +387,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -409,11 +410,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -425,9 +428,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -530,7 +533,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -538,16 +541,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -610,11 +618,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -635,6 +643,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -678,8 +687,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -718,8 +727,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -740,10 +749,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -787,8 +795,8 @@ msgstr "" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -806,11 +814,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "" @@ -864,6 +872,11 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 msgid "If you close this form now, your modifications won't be saved. Do you confirm?" @@ -958,9 +971,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -994,7 +1007,7 @@ msgid "Logger" msgstr "" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "" @@ -1006,9 +1019,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1030,8 +1043,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1067,14 +1080,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "" @@ -1117,14 +1130,16 @@ msgstr "" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1203,9 +1218,9 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1281,10 +1296,10 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" @@ -1314,8 +1329,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1398,8 +1413,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1547,8 +1562,8 @@ msgstr "" msgid "Super administrator" msgstr "" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 msgid "Tags" msgstr "" @@ -1589,10 +1604,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1697,9 +1712,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "" @@ -1722,14 +1737,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1758,14 +1775,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1785,18 +1804,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "" @@ -1813,6 +1820,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/es/LC_MESSAGES/app.po b/frontend/locale/es/LC_MESSAGES/app.po index 3bd1ece2a..68f8fc250 100644 --- a/frontend/locale/es/LC_MESSAGES/app.po +++ b/frontend/locale/es/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "Cuenta" msgid "Account created" msgstr "Cuenta creada" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "Cuenta actualizada" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "Acciones" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "Dirección" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "Alias" msgid "Alias created" msgstr "Alias creado" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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" @@ -283,12 +275,9 @@ msgstr "Cambiar contraseña" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" -"Marque esta opción si las contraseñas que contiene su fichero no están " -"cifradas" +msgstr "Marque esta opción si las contraseñas que contiene su fichero no están cifradas" #: src/components/domains/DomainAliasForm.vue:56 #: src/components/domains/DomainAliasForm.vue:26 @@ -299,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -309,8 +297,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -325,8 +312,7 @@ msgstr "Confirmación" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -382,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "Fecha de creación" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "Contraseñas cifradas" @@ -407,8 +392,8 @@ msgstr "Panel de Control" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -425,19 +410,18 @@ msgid "Default mailbox quota" msgstr "Cuota de mailbox por defecto" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." -msgstr "" -"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite." #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -449,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "Descripción" @@ -488,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -555,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "Estado de DNS" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -563,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "Dominio" @@ -635,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -660,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -703,8 +692,8 @@ msgstr "Activar comprobación de DNS" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "Activado" @@ -719,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -745,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "Caduca en" @@ -767,10 +754,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -815,8 +801,8 @@ msgstr "" msgid "Full name" msgstr "Nombre completo" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -835,11 +821,11 @@ msgstr "Nombre completo" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "General" @@ -872,9 +858,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -895,17 +879,19 @@ msgstr "" msgid "Identities" msgstr "Identidades" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +#, fuzzy +msgid "Identities deleted" +msgstr "Identidades" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -993,9 +979,9 @@ msgstr "Última fecha de modificación" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1029,7 +1015,7 @@ msgid "Logger" msgstr "Logger" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "Salir" @@ -1041,9 +1027,9 @@ msgstr "Logs" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "Mailboxes" @@ -1065,8 +1051,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1102,14 +1088,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "Nombre" @@ -1126,8 +1112,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1153,14 +1138,16 @@ msgstr "Siguiente" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1178,13 +1165,11 @@ msgid "Not generated" msgstr "Sin definir" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1201,8 +1186,7 @@ msgstr "" msgid "One or more updates are available" msgstr "Una o más actualizaciones están disponibles" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1242,9 +1226,9 @@ msgstr "Contraseña" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1310,8 +1294,7 @@ msgstr "Perfil actualizado" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1321,29 +1304,20 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." -msgstr "" -"Cuota en MB para este mailbox. Defina un valor por defecto o use el del " -"dominio por defecto. Déjelo vacío para definir un valor ilimitado (no " -"permitido para los administradores del dominio)" +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." +msgstr "Cuota en MB para este mailbox. Defina un valor por defecto o use el del dominio por defecto. Déjelo vacío para definir un valor ilimitado (no permitido para los administradores del dominio)" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." -msgstr "" -"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite." #: src/components/domains/DomainForm.vue:68 #: src/components/identities/AccountForm.vue:64 @@ -1363,8 +1337,8 @@ msgstr "Dirección aleatoria" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "Dirección aleatoria" @@ -1447,8 +1421,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1575,8 +1549,7 @@ msgstr "" msgid "Statistics" msgstr "Estadísticas" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1598,15 +1571,13 @@ msgstr "Resumen" msgid "Super administrator" msgstr "Super administrador" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1642,10 +1613,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1669,8 +1640,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1685,9 +1655,7 @@ 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." +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 @@ -1754,9 +1722,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "Nombre de usuario" @@ -1779,14 +1747,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1815,14 +1785,16 @@ msgstr "Año" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1842,18 +1814,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "Las contraseñas no coinciden" @@ -1870,6 +1830,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/fi/LC_MESSAGES/app.po b/frontend/locale/fi/LC_MESSAGES/app.po index 895930353..34a342c06 100644 --- a/frontend/locale/fi/LC_MESSAGES/app.po +++ b/frontend/locale/fi/LC_MESSAGES/app.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: \n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -26,39 +26,23 @@ msgstr "API:n dokumentaatio on saatavilla" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +msgid "A new key will be generated soon. Refresh the page in a moment to see it." msgstr "Uusi avain luodaan pian. Päivitä sivu hetken kuluttua nähdäksesi sen." #: src/components/identities/AccountRoleForm.vue:39 #: 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 "" -"Käyttäjä, jolla on kaikki oikeudet, voi tehdä mitä tahansa. Oletusarvoisesti" -" tällaisella käyttäjällä ei ole postilaatikkoa, joten hän ei voi käyttää " -"loppukäyttäjän ominaisuuksia." +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 "Käyttäjä, jolla on kaikki oikeudet, voi tehdä mitä tahansa. Oletusarvoisesti tällaisella käyttäjällä ei ole postilaatikkoa, joten hän ei voi käyttää loppukäyttäjän ominaisuuksia." #: src/components/identities/AccountRoleForm.vue:34 #: 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 "" -"Käyttäjä, jolla ei ole oikeuksia mutta jolla on postilaatikko. Hän saa " -"käyttää kaikkia loppukäyttäjän ominaisuuksia: webmail, kalenteri, " -"yhteystiedot, suodattimet." +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 "Käyttäjä, jolla ei ole oikeuksia mutta jolla on postilaatikko. Hän saa käyttää kaikkia loppukäyttäjän ominaisuuksia: webmail, kalenteri, yhteystiedot, suodattimet." #: src/components/identities/AccountRoleForm.vue:24 #: 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 "" -"Käyttäjä, jolla on oikeuksia yhdessä tai useammassa verkkotunnuksessa. " -"Hänellä on oikeus hallinnoida postilaatikoita ja hänellä voi myös olla " -"postilaatikko." +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 "Käyttäjä, jolla on oikeuksia yhdessä tai useammassa verkkotunnuksessa. Hänellä on oikeus hallinnoida postilaatikoita ja hänellä voi myös olla postilaatikko." #: src/components/tools/TimeSerieChart.vue:16 msgid "Absolute time range" @@ -73,8 +57,8 @@ msgstr "Tili" msgid "Account created" msgstr "Tili luotu" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -86,9 +70,9 @@ msgstr "Tili päivitetty" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "Toiminnot" @@ -113,9 +97,9 @@ msgstr "Lisää lähettäjän osoite" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "Osoite" @@ -153,8 +137,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "{{ domain.name }}:n ylläpitäjät" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "Hälytykset" @@ -168,8 +153,8 @@ msgstr "Alias" msgid "Alias created" msgstr "Alias luotu" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -180,12 +165,8 @@ msgstr "Alias päivitetty" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." -msgstr "" -"Tämän postilaatikon alias-nimet. Jos haluat luoda catchall-aliaksen, " -"kirjoita vain verkkotunnus (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." +msgstr "Tämän postilaatikon alias-nimet. Jos haluat luoda catchall-aliaksen, kirjoita vain verkkotunnus (@domain.tld)." #: src/components/domains/DomainList.vue:25 #: src/components/domains/DomainSummary.vue:31 @@ -193,10 +174,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "Aliakset" @@ -293,12 +274,9 @@ msgstr "Vaihda salasana" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" -"Valitse tämä vaihtoehto, jos tiedostosi sisältämiä salasanoja ei ole " -"salakirjoitettu" +msgstr "Valitse tämä vaihtoehto, jos tiedostosi sisältämiä salasanoja ei ole salakirjoitettu" #: src/components/domains/DomainAliasForm.vue:56 #: src/components/domains/DomainAliasForm.vue:26 @@ -309,8 +287,7 @@ msgstr "Valitse verkkotunnus" msgid "Choose a role" msgstr "Valitse käyttäjätyyppisi" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -319,8 +296,7 @@ msgstr "Valitse käyttäjätyyppisi" msgid "Close" msgstr "Sulje" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 #, fuzzy msgid "Closed" msgstr "Suljettu" @@ -336,8 +312,7 @@ msgstr "Vahvistus" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "Onnittelut! Kaksivaiheinen tunnistus on nyt käytössä tililläsi." #: src/views/Login.vue:23 @@ -393,8 +368,7 @@ msgstr "Luo verkkotunnuksen tavanomaiset aliakset." msgid "Creation date" msgstr "Luontipäivä" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "Salakirjoita salasanat" @@ -418,8 +392,8 @@ msgstr "Työpöytä" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "Päivämäärä" @@ -436,21 +410,18 @@ msgid "Default mailbox quota" msgstr "Oletuspostilaatikkokiintiö" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." -msgstr "" -"Postilaatikoihin sovellettava oletuskiintiö. Voidaan ilmaista kilotavuina, " -"megatavuina (oletus) tai gigatavuina. Arvo 0 tarkoittaa, ettei kiintiötä " -"ole." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Postilaatikoihin sovellettava oletuskiintiö. Voidaan ilmaista kilotavuina, megatavuina (oletus) tai gigatavuina. Arvo 0 tarkoittaa, ettei kiintiötä ole." #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "Poista" @@ -462,9 +433,9 @@ msgstr "Poista avain" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "Kuvaus" @@ -501,10 +472,8 @@ msgstr "DKIM-avaimen valitsin-tietue" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" -msgstr "" -"DKIM-avaimet ovat jo olemassa tälle verkkotunnukselle. Haluatko korvata ne?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" +msgstr "DKIM-avaimet ovat jo olemassa tälle verkkotunnukselle. Haluatko korvata ne?" #: src/components/domains/DomainDKIMKey.vue:4 msgid "DKIM public key for" @@ -569,7 +538,7 @@ msgstr "DNS-määritysapu" msgid "DNS status" msgstr "DNS-tila" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "Älä poista tilikansiota" @@ -577,16 +546,22 @@ msgstr "Älä poista tilikansiota" msgid "Do not delete domain folder" msgstr "Älä poista verkkotunnuksen kansiota" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "Haluatko todella poistaa aliaksen %{ alias }?" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +#, fuzzy +msgid "Do you really want to delete the selected identities?" +msgstr "Haluatko todella poistaa aliaksen %{ alias }?" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "Verkkotunnus" @@ -649,11 +624,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "Älä käsittele päällekkäisiä objekteja virheinä" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:88 -#: src/components/identities/IdentityList.vue:91 -#: src/components/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "Muokkaa" @@ -674,6 +649,7 @@ msgstr "Muokkaa verkkotunnusta" msgid "Edit domain alias" msgstr "Muokkaa verkkotunnusta" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -717,8 +693,8 @@ msgstr "Ota DNS-tarkistukset käyttöön" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "Käytössä" @@ -733,12 +709,8 @@ msgid "Enter an email address" msgstr "Syötä oikean muotoinen sähköpostiosoite" #: 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 "" -"Syötä koodi mobiililaitteesi kaksivaiheisen tunnistuksen sovelluksesta. Jos " -"olet hukannut laitteesi, voit syöttää yhden palautuskoodeistasi." +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 "Syötä koodi mobiililaitteesi kaksivaiheisen tunnistuksen sovelluksesta. Jos olet hukannut laitteesi, voit syöttää yhden palautuskoodeistasi." #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 msgid "Enter the code you've just received by SMS" @@ -761,8 +733,8 @@ msgstr "Esim: 10 MB. Jätä tyhjäksi, jos et halua rajoitusta" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "Vanhenee" @@ -783,10 +755,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "Etunimi" @@ -831,8 +802,8 @@ msgstr "Lähde" msgid "Full name" msgstr "Koko nimi" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "Koko nimi/saaja" @@ -851,11 +822,11 @@ msgstr "Koko nimi" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "Yleiset" @@ -888,12 +859,8 @@ msgid "help" msgstr "ohje" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." -msgstr "" -"Tässä on esimerkki DNS-määrityksistä (bind-muodossa). Korvaa [ ]:n välissä " -"olevat arvot sopivilla arvoilla." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." +msgstr "Tässä on esimerkki DNS-määrityksistä (bind-muodossa). Korvaa [ ]:n välissä olevat arvot sopivilla arvoilla." #: src/components/domains/DomainDNSConfig.vue:33 #: src/components/domains/DomainDNSConfig.vue:34 @@ -913,18 +880,19 @@ msgstr "Tunniste" msgid "Identities" msgstr "Identiteetit" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +#, fuzzy +msgid "Identities deleted" +msgstr "Identiteetit" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" -msgstr "" -"Jos suljet tämän lomakkeen nyt, muutokset eivät tallennu. Vahvistatko?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" +msgstr "Jos suljet tämän lomakkeen nyt, muutokset eivät tallennu. Vahvistatko?" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -1018,9 +986,9 @@ msgstr "Viimeisin muutospäivä" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "Sukunimi" @@ -1054,7 +1022,7 @@ msgid "Logger" msgstr "Lokikirja" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "Kirjaudu ulos" @@ -1066,9 +1034,9 @@ msgstr "Lokit" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "Postilaatikko" @@ -1090,8 +1058,8 @@ msgstr "Viestien historia" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "Viestien lähetysraja" @@ -1127,14 +1095,14 @@ msgstr "MX-tietueet" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "Nimi" @@ -1151,8 +1119,7 @@ msgid "Never logged-in" msgstr "Ei koskaan kirjautunut sisään" #: src/views/domains/Domains.vue:15 src/views/domains/Domains.vue:3 -#: src/views/identities/Identities.vue:15 -#: src/views/identities/Identities.vue:3 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "Uusi" @@ -1178,14 +1145,16 @@ msgstr "Seuraava" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "Ei" @@ -1203,18 +1172,12 @@ msgid "Not generated" msgstr "Ei luotu" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." -msgstr "" -"Viestien määrä, jonka tämä verkkotunnus voi lähettää päivässä. Jätä " -"tyhjäksi, jos et halua rajoitusta." +msgid "Number of messages this domain can send per day. Leave empty for no limit." +msgstr "Viestien määrä, jonka tämä verkkotunnus voi lähettää päivässä. Jätä tyhjäksi, jos et halua rajoitusta." #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." -msgstr "" -"Viestien määrä, jonka tämä postilaatikko voi lähettää päivässä. Jätä " -"tyhjäksi, jos et halua rajoitusta." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." +msgstr "Viestien määrä, jonka tämä postilaatikko voi lähettää päivässä. Jätä tyhjäksi, jos et halua rajoitusta." #: src/views/user/PasswordRecoveryForm.vue:31 #: src/views/user/PasswordRecoveryForm.vue:77 @@ -1230,8 +1193,7 @@ msgstr "OK" msgid "One or more updates are available" msgstr "Yksi tai useampi päivitys on saatavilla" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 #, fuzzy msgid "Opened" msgstr "Avattu" @@ -1272,9 +1234,9 @@ msgstr "Salasana" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "Salasana kopioitu leikepöydälle" @@ -1339,11 +1301,9 @@ msgstr "Profiili päivitetty" #: src/components/tools/ImportForm.vue:7 msgid "Provide a CSV file where lines respect one of the following formats:" -msgstr "" -"Toimita CSV-tiedosto, jonka rivit ovat jossakin seuraavista muodoista:" +msgstr "Toimita CSV-tiedosto, jonka rivit ovat jossakin seuraavista muodoista:" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "Jonon ID" @@ -1353,32 +1313,20 @@ msgstr "Jonon ID" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "Verkkotunnuksen oletuskiintiö" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." -msgstr "" -"Tämän postilaatikon kiintiö, joka voidaan ilmaista kilotavuina, megatavuina " -"(oletus) tai gigatavuina. Määritä oma arvo tai käytä toimialueen " -"oletusarvoa. Jätä tyhjäksi, jos haluat määrittää rajoittamattoman arvon (ei " -"sallittu toimialueen ylläpitäjille)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." +msgstr "Tämän postilaatikon kiintiö, joka voidaan ilmaista kilotavuina, megatavuina (oletus) tai gigatavuina. Määritä oma arvo tai käytä toimialueen oletusarvoa. Jätä tyhjäksi, jos haluat määrittää rajoittamattoman arvon (ei sallittu toimialueen ylläpitäjille)." #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." -msgstr "" -"Postilaatikoiden kesken jaettu kiintiö. Voidaan ilmaista kilotavuina (KB), " -"megatavuina (MB) (oletus) tai gigatavuina (GB). Arvo 0 tarkoittaa, ettei " -"kiintiötä ole." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Postilaatikoiden kesken jaettu kiintiö. Voidaan ilmaista kilotavuina (KB), megatavuina (MB) (oletus) tai gigatavuina (GB). Arvo 0 tarkoittaa, ettei kiintiötä ole." #: src/components/domains/DomainForm.vue:68 #: src/components/identities/AccountForm.vue:64 @@ -1398,8 +1346,8 @@ msgstr "Satunnainen osoite" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "Satunnainen salasana" @@ -1482,8 +1430,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1610,8 +1558,7 @@ msgstr "Aloita nimen kirjoittaminen tästä..." msgid "Statistics" msgstr "Tilastot" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1633,18 +1580,14 @@ msgstr "Yhteenveto" msgid "Super administrator" msgstr "Pääylläpitäjä" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 msgid "Tags" msgstr "Tunnisteet" #: 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 "" -"Kunkin rivin ensimmäinen elementti on pakollinen, ja sen on oltava yhtä " -"suuri kuin jokin edellisistä arvoista." +msgid "The first element of each line is mandatory and must be equal to one of the previous values." +msgstr "Kunkin rivin ensimmäinen elementti on pakollinen, ja sen on oltava yhtä suuri kuin jokin edellisistä arvoista." #: src/components/user/TwoFactorAuthForm.vue:39 #: src/components/user/TwoFactorAuthForm.vue:7 @@ -1687,10 +1630,10 @@ msgstr "Vastaanottaja" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1714,8 +1657,7 @@ msgstr "" msgid "Transport" msgstr "Siirto" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1730,12 +1672,8 @@ msgstr "Kaksivaiheinent tunnistus" #: 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 "" -"Kaksivaiheista tunnistusta (2FA) ei ole vielä aktivoitu tilillesi. Tämän " -"ominaisuuden käyttöönotto lisää tilisi turvallisuutta." +msgid "Two-Factor Authentication (2FA) is not yet activated for your account. Enabling this feature will increase your account's security." +msgstr "Kaksivaiheista tunnistusta (2FA) ei ole vielä aktivoitu tilillesi. Tämän ominaisuuden käyttöönotto lisää tilisi turvallisuutta." #: src/views/TwoFA.vue:11 msgid "Two-factor authentication code" @@ -1802,9 +1740,9 @@ msgstr "Tuntematon" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "Käyttäjätunnus" @@ -1827,14 +1765,16 @@ msgstr "Tarkista koodi" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "Varoitus" @@ -1863,14 +1803,16 @@ msgstr "Vuosi" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "Kyllä" @@ -1890,18 +1832,6 @@ msgstr "API-pääsytunnistetta ei ole vielä luotu." msgid "Your API token is:" msgstr "API-pääsytunnisteesi on:" -#: src/filters/index.js:7 -msgid "yes" -msgstr "kyllä" - -#: src/filters/index.js:7 -msgid "no" -msgstr "ei" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "Asetukset: " - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "Salasanat eivät täsmää" @@ -1918,6 +1848,18 @@ msgstr "Tämä kenttä on pakollinen" msgid "Invalid password" msgstr "Virheellinen salasana" +#: src/filters/index.js:7 +msgid "yes" +msgstr "kyllä" + +#: src/filters/index.js:7 +msgid "no" +msgstr "ei" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "Asetukset: " + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/fr/LC_MESSAGES/app.po b/frontend/locale/fr/LC_MESSAGES/app.po index 957b0e001..0cc27028d 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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2021-07-01 16:15+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "Compte" msgid "Account created" msgstr "Compte créé" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "Compte mis à jour" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "Actions" @@ -107,9 +100,9 @@ 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:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "Adresse" @@ -148,8 +141,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -163,8 +157,8 @@ msgstr "Alias" msgid "Alias created" msgstr "Alias créé" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -175,9 +169,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -186,10 +178,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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" @@ -287,12 +279,9 @@ msgstr "Changer le mot de passe" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" -"Cocher cette option si les mots de passe contenus dans votre fichier ne sont" -" pas chiffrés" +msgstr "Cocher cette option si les mots de passe contenus dans votre fichier ne sont pas chiffrés" #: src/components/domains/DomainAliasForm.vue:56 #: src/components/domains/DomainAliasForm.vue:26 @@ -303,8 +292,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -313,8 +301,7 @@ msgstr "" msgid "Close" msgstr "Fermer" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 #, fuzzy msgid "Closed" msgstr "Fermée" @@ -330,11 +317,8 @@ 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 "" -"Félicitations ! L'authentification à deux facteurs est maintenant activée " -"pour votre compte." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." +msgstr "Félicitations ! L'authentification à deux facteurs est maintenant activée pour votre compte." #: src/views/Login.vue:23 msgid "Connect" @@ -389,8 +373,7 @@ msgstr "" msgid "Creation date" msgstr "Date de création" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 #, fuzzy msgid "Crypt passwords" msgstr "Chiffrer les mots de passe" @@ -416,8 +399,8 @@ msgstr "Tableau de bord" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "Date" @@ -434,20 +417,18 @@ msgid "Default mailbox quota" msgstr "Quota par défaut pour une boîte aux lettres" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." -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." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +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:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -459,9 +440,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "Description" @@ -499,10 +480,8 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" -msgstr "" -"Des clés DKIM existent déjà pour ce domaine. Voulez vous les écraser ?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" +msgstr "Des clés DKIM existent déjà pour ce domaine. Voulez vous les écraser ?" #: src/components/domains/DomainDKIMKey.vue:4 msgid "DKIM public key for" @@ -567,7 +546,7 @@ msgstr "" msgid "DNS status" msgstr "Statut DNS" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -575,16 +554,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "Domaine" @@ -647,11 +631,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -672,6 +656,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -716,8 +701,8 @@ msgstr "Activer les tests DNS" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "Activé" @@ -732,9 +717,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -758,8 +741,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "Expire le" @@ -780,10 +763,9 @@ msgstr "En échec" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -799,8 +781,7 @@ msgstr "Transfert" #: src/components/user/ForwardForm.vue:6 msgid "Forward messages and store copies into your local mailbox" -msgstr "" -"Transférer les messages et conserver une copie dans votre boite locale" +msgstr "Transférer les messages et conserver une copie dans votre boite locale" #: src/components/user/ForwardForm.vue:19 #: src/components/user/ForwardForm.vue:52 @@ -830,8 +811,8 @@ msgstr "De" msgid "Full name" msgstr "Nom complet" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -850,11 +831,11 @@ msgstr "Alignement complet" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "Général" @@ -889,9 +870,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -912,17 +891,19 @@ msgstr "" msgid "Identities" msgstr "Identités" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +#, fuzzy +msgid "Identities deleted" +msgstr "Identités" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -1013,9 +994,9 @@ msgstr "Date de dernière modification" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1049,7 +1030,7 @@ msgid "Logger" msgstr "Logger" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "Déconnexion" @@ -1061,9 +1042,9 @@ msgstr "Journaux" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "Boîte aux lettres" @@ -1085,8 +1066,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "Limite d'envoi des messages" @@ -1122,14 +1103,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "Nom" @@ -1146,8 +1127,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1173,14 +1153,16 @@ msgstr "Suivant" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "Non" @@ -1198,13 +1180,11 @@ msgid "Not generated" msgstr "Non générée" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1221,8 +1201,7 @@ msgstr "" msgid "One or more updates are available" msgstr "Une ou plusieurs mises à jour sont disponibles!" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "Ouverte" @@ -1262,9 +1241,9 @@ msgstr "Mot de passe" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1333,8 +1312,7 @@ msgstr "Profil mis à jour" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "ID de file" @@ -1344,31 +1322,20 @@ msgstr "ID de file" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "Quota" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." -msgstr "" -"Quota pour cette boite. Peut être exprimé en Ko, Mo (défaut) ou Go. Définir " -"une valeur spécifique ou utiliser la valeur par défaut du domaine. Laisser " -"vide pour définir une valeur illimitée (interdit pour les admins. de " -"domaine)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." +msgstr "Quota pour cette boite. Peut être exprimé en Ko, Mo (défaut) ou Go. Définir une valeur spécifique ou utiliser la valeur par défaut du domaine. Laisser vide pour définir une valeur illimitée (interdit pour les admins. de domaine)." #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." -msgstr "" -"Quota partagé entre les boîtes aux lettres. Peut être exprimé en Ko, Mo " -"(défaut) ou Go. Une valeur à 0 signifie pas de quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Quota partagé entre les boîtes aux lettres. Peut être exprimé en Ko, Mo (défaut) ou Go. Une valeur à 0 signifie pas de quota." #: src/components/domains/DomainForm.vue:68 #: src/components/identities/AccountForm.vue:64 @@ -1388,8 +1355,8 @@ msgstr "Adresse aléatoire" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "Mot de passe aléatoire" @@ -1474,8 +1441,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1604,8 +1571,7 @@ msgstr "" msgid "Statistics" msgstr "Statistiques" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1627,15 +1593,13 @@ msgstr "Résumé" msgid "Super administrator" msgstr "Super administrateur" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1671,10 +1635,10 @@ msgstr "A" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1698,8 +1662,7 @@ msgstr "" msgid "Transport" msgstr "Transport" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1715,12 +1678,8 @@ 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 "" -"L'authentification à 2 facteurs n'est pas encore activée pour votre compte. " -"Activer cette fonctionnalité renforcera la sécurité de votre compte." +msgid "Two-Factor Authentication (2FA) is not yet activated for your account. Enabling this feature will increase your account's security." +msgstr "L'authentification à 2 facteurs n'est pas encore activée pour votre compte. Activer cette fonctionnalité renforcera la sécurité de votre compte." #: src/views/TwoFA.vue:11 msgid "Two-factor authentication code" @@ -1789,9 +1748,9 @@ msgstr "Inconnu" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "Nom d'utilisateur" @@ -1814,14 +1773,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "Attention" @@ -1850,14 +1811,16 @@ msgstr "Année" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "Oui" @@ -1877,18 +1840,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 #, fuzzy msgid "Passwords mismatch" @@ -1907,6 +1858,18 @@ msgstr "Ce champ est requis" msgid "Invalid password" msgstr "Mot de passe aléatoire" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/it/LC_MESSAGES/app.po b/frontend/locale/it/LC_MESSAGES/app.po index d22d84284..641910c10 100644 --- a/frontend/locale/it/LC_MESSAGES/app.po +++ b/frontend/locale/it/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "Account" msgid "Account created" msgstr "Account creato" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "Account aggiornato" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "Azioni" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "Indirizzo" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "Alias" msgid "Alias created" msgstr "Alias creato" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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" @@ -283,11 +275,9 @@ msgstr "Cambia password" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" -"Seleziona questa opzione se le password contenute nel file non sono criptate" +msgstr "Seleziona questa opzione se le password contenute nel file non sono criptate" #: src/components/domains/DomainAliasForm.vue:56 #: src/components/domains/DomainAliasForm.vue:26 @@ -298,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -308,8 +297,7 @@ msgstr "" msgid "Close" msgstr "Chiudi" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "Chiudi" @@ -324,8 +312,7 @@ msgstr "Conferma" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -381,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "Data di creazione" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "Cripta le password" @@ -406,8 +392,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -424,21 +410,18 @@ msgid "Default mailbox quota" msgstr "Dimensione massima predefinita per le mailbox" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." -msgstr "" -"Valore predefinito per lo spazio massimo confiviso tra le mailbox. Può " -"essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun " -"limite." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Valore predefinito per lo spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun limite." #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -450,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "Descrizione" @@ -489,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -556,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "Stato del DNS" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -564,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "Dominio" @@ -636,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -661,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -704,8 +692,8 @@ msgstr "Abilita i controlli DNS" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "Abilitato" @@ -720,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -746,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "Scade il" @@ -768,10 +754,9 @@ msgstr "Fallito" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -787,8 +772,7 @@ msgstr "Inoltra" #: src/components/user/ForwardForm.vue:6 msgid "Forward messages and store copies into your local mailbox" -msgstr "" -"Inoltra i messaggi e memorizza le copie nella tua casella di posta locale" +msgstr "Inoltra i messaggi e memorizza le copie nella tua casella di posta locale" #: src/components/user/ForwardForm.vue:19 #: src/components/user/ForwardForm.vue:52 @@ -817,8 +801,8 @@ msgstr "" msgid "Full name" msgstr "Nome completo" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -837,11 +821,11 @@ msgstr "Completamente allineato" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "Generale" @@ -874,9 +858,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -897,17 +879,19 @@ msgstr "" msgid "Identities" msgstr "Identità" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +#, fuzzy +msgid "Identities deleted" +msgstr "Identità" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -995,9 +979,9 @@ msgstr "Data dell'ultima modifica" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1031,7 +1015,7 @@ msgid "Logger" msgstr "Logger" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "Esci" @@ -1043,9 +1027,9 @@ msgstr "Log" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "Caselle di posta" @@ -1067,8 +1051,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1104,14 +1088,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "Nome" @@ -1128,8 +1112,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1155,14 +1138,16 @@ msgstr "Successivo" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1180,13 +1165,11 @@ msgid "Not generated" msgstr "Non generata" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1203,8 +1186,7 @@ msgstr "" msgid "One or more updates are available" msgstr "Sono disponibili nuovi aggiornamenti" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1244,9 +1226,9 @@ msgstr "Password" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1312,8 +1294,7 @@ msgstr "Profilo aggiornato" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1323,31 +1304,20 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "Dimensione massima" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." -msgstr "" -"Dimensione massima per questa mailbox, può essere espressa in KB, MB " -"(predefinito) o GB. Definire un valore personalizzato o utilizzare quello " -"predefinito per il dominio. Lasciare vuoto per specificare un valore non " -"limitato (non permesso per amministratori di dominio)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." +msgstr "Dimensione massima per questa mailbox, può essere espressa in KB, MB (predefinito) o GB. Definire un valore personalizzato o utilizzare quello predefinito per il dominio. Lasciare vuoto per specificare un valore non limitato (non permesso per amministratori di dominio)." #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." -msgstr "" -"Spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB " -"(predefinito) o GB. Il valore 0 indica nessun limite." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun limite." #: src/components/domains/DomainForm.vue:68 #: src/components/identities/AccountForm.vue:64 @@ -1367,8 +1337,8 @@ msgstr "Indirizzo casuale" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "Password casuale" @@ -1451,8 +1421,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1579,8 +1549,7 @@ msgstr "" msgid "Statistics" msgstr "Statistiche" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1602,15 +1571,13 @@ msgstr "Sommario" msgid "Super administrator" msgstr "Super amministratore" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 msgid "Tags" msgstr "Tag" #: 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." +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 @@ -1646,10 +1613,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1673,8 +1640,7 @@ msgstr "" msgid "Transport" msgstr "Trasporto" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1689,9 +1655,7 @@ 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." +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 @@ -1758,9 +1722,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "Nome utente" @@ -1783,14 +1747,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1819,14 +1785,16 @@ msgstr "Anno" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1846,18 +1814,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "Le password non corrispondono" @@ -1874,6 +1830,18 @@ msgstr "Questo campo è obbligatorio" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/ja/LC_MESSAGES/app.po b/frontend/locale/ja/LC_MESSAGES/app.po index fc775a343..b88fecccd 100644 --- a/frontend/locale/ja/LC_MESSAGES/app.po +++ b/frontend/locale/ja/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -283,8 +275,7 @@ msgstr "" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" @@ -297,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -307,8 +297,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -323,8 +312,7 @@ msgstr "" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -380,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "" @@ -405,8 +392,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -423,18 +410,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -446,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -485,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -552,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -560,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -632,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -657,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -700,8 +692,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -716,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -742,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -764,10 +754,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -811,8 +800,8 @@ msgstr "" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -830,11 +819,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "" @@ -867,9 +856,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -890,17 +877,18 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -988,9 +976,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1024,7 +1012,7 @@ msgid "Logger" msgstr "" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "" @@ -1036,9 +1024,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1060,8 +1048,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1097,14 +1085,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "" @@ -1121,8 +1109,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1148,14 +1135,16 @@ msgstr "" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1173,13 +1162,11 @@ msgid "Not generated" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1196,8 +1183,7 @@ msgstr "" msgid "One or more updates are available" msgstr "" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1237,9 +1223,9 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1305,8 +1291,7 @@ msgstr "" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1316,24 +1301,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." msgstr "" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1354,8 +1334,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1438,8 +1418,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1565,8 +1545,7 @@ msgstr "" msgid "Statistics" msgstr "" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1588,15 +1567,13 @@ msgstr "" msgid "Super administrator" msgstr "" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1632,10 +1609,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1659,8 +1636,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1674,9 +1650,7 @@ 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." +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 @@ -1743,9 +1717,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "" @@ -1768,14 +1742,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1804,14 +1780,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1831,18 +1809,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "" @@ -1859,6 +1825,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/nl/LC_MESSAGES/app.po b/frontend/locale/nl/LC_MESSAGES/app.po index 0c155a019..0a16d64de 100644 --- a/frontend/locale/nl/LC_MESSAGES/app.po +++ b/frontend/locale/nl/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -283,8 +275,7 @@ msgstr "" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" @@ -297,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -307,8 +297,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -323,8 +312,7 @@ msgstr "" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -380,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "" @@ -405,8 +392,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -423,18 +410,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -446,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -485,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -552,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -560,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -632,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -657,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -700,8 +692,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -716,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -742,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -764,10 +754,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -811,8 +800,8 @@ msgstr "" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -830,11 +819,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "" @@ -867,9 +856,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -890,17 +877,18 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -988,9 +976,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1024,7 +1012,7 @@ msgid "Logger" msgstr "" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "" @@ -1036,9 +1024,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1060,8 +1048,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1097,14 +1085,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "" @@ -1121,8 +1109,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1148,14 +1135,16 @@ msgstr "" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1173,13 +1162,11 @@ msgid "Not generated" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1196,8 +1183,7 @@ msgstr "" msgid "One or more updates are available" msgstr "" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1237,9 +1223,9 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1305,8 +1291,7 @@ msgstr "" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1316,24 +1301,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." msgstr "" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1354,8 +1334,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1438,8 +1418,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1565,8 +1545,7 @@ msgstr "" msgid "Statistics" msgstr "" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1588,15 +1567,13 @@ msgstr "" msgid "Super administrator" msgstr "" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1632,10 +1609,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1659,8 +1636,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1674,9 +1650,7 @@ 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." +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 @@ -1743,9 +1717,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "" @@ -1768,14 +1742,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1804,14 +1780,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1831,18 +1809,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "" @@ -1859,6 +1825,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/pl/LC_MESSAGES/app.po b/frontend/locale/pl/LC_MESSAGES/app.po index f2868c9cc..4f175d4c7 100644 --- a/frontend/locale/pl/LC_MESSAGES/app.po +++ b/frontend/locale/pl/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -283,8 +275,7 @@ msgstr "" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" @@ -297,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -307,8 +297,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -323,8 +312,7 @@ msgstr "" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -380,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "" @@ -405,8 +392,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -423,18 +410,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -446,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -485,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -552,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -560,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -632,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -657,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -700,8 +692,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -716,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -742,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -764,10 +754,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -811,8 +800,8 @@ msgstr "" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -830,11 +819,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "" @@ -867,9 +856,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -890,17 +877,18 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -988,9 +976,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1024,7 +1012,7 @@ msgid "Logger" msgstr "" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "" @@ -1036,9 +1024,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1060,8 +1048,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1097,14 +1085,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "" @@ -1121,8 +1109,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1148,14 +1135,16 @@ msgstr "" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1173,13 +1162,11 @@ msgid "Not generated" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1196,8 +1183,7 @@ msgstr "" msgid "One or more updates are available" msgstr "" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1237,9 +1223,9 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1305,8 +1291,7 @@ msgstr "" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1316,24 +1301,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." msgstr "" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1354,8 +1334,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1438,8 +1418,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1565,8 +1545,7 @@ msgstr "" msgid "Statistics" msgstr "" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1588,15 +1567,13 @@ msgstr "" msgid "Super administrator" msgstr "" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1632,10 +1609,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1659,8 +1636,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1674,9 +1650,7 @@ 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." +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 @@ -1743,9 +1717,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "" @@ -1768,14 +1742,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1804,14 +1780,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1831,18 +1809,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "" @@ -1859,6 +1825,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/po/LC_MESSAGES/app.po b/frontend/locale/po/LC_MESSAGES/app.po index 602e2e25a..2607ca119 100644 --- a/frontend/locale/po/LC_MESSAGES/app.po +++ b/frontend/locale/po/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -27,29 +27,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -65,8 +58,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -78,9 +71,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -105,9 +98,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -145,8 +138,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -160,8 +154,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -172,9 +166,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -183,10 +175,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -282,8 +274,7 @@ msgstr "" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" @@ -296,8 +287,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -306,8 +296,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -322,8 +311,7 @@ msgstr "" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -379,8 +367,7 @@ msgstr "" msgid "Creation date" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "" @@ -404,8 +391,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -422,18 +409,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -445,9 +432,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -484,8 +471,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -551,7 +537,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -559,16 +545,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -631,11 +622,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -656,6 +647,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -699,8 +691,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -715,9 +707,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -741,8 +731,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -763,10 +753,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -810,8 +799,8 @@ msgstr "" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -829,11 +818,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "" @@ -866,9 +855,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -889,17 +876,18 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -987,9 +975,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1023,7 +1011,7 @@ msgid "Logger" msgstr "" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "" @@ -1035,9 +1023,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1059,8 +1047,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1096,14 +1084,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "" @@ -1120,8 +1108,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1147,14 +1134,16 @@ msgstr "" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1172,13 +1161,11 @@ msgid "Not generated" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1195,8 +1182,7 @@ msgstr "" msgid "One or more updates are available" msgstr "" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1236,9 +1222,9 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1304,8 +1290,7 @@ msgstr "" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1315,24 +1300,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." msgstr "" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1353,8 +1333,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1437,8 +1417,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1564,8 +1544,7 @@ msgstr "" msgid "Statistics" msgstr "" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1587,15 +1566,13 @@ msgstr "" msgid "Super administrator" msgstr "" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1631,10 +1608,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1658,8 +1635,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1673,9 +1649,7 @@ 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." +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 @@ -1742,9 +1716,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "" @@ -1767,14 +1741,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1803,14 +1779,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1830,18 +1808,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "" @@ -1858,6 +1824,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/pt-br/LC_MESSAGES/app.po b/frontend/locale/pt-br/LC_MESSAGES/app.po index d5198000f..5b91cce55 100644 --- a/frontend/locale/pt-br/LC_MESSAGES/app.po +++ b/frontend/locale/pt-br/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -27,29 +27,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -65,8 +58,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -78,9 +71,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -105,9 +98,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -145,8 +138,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -160,8 +154,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -172,9 +166,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -183,10 +175,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -282,8 +274,7 @@ msgstr "" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" @@ -296,8 +287,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -306,8 +296,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -322,8 +311,7 @@ msgstr "" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -379,8 +367,7 @@ msgstr "" msgid "Creation date" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "" @@ -404,8 +391,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -422,18 +409,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -445,9 +432,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -484,8 +471,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -551,7 +537,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -559,16 +545,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -631,11 +622,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -656,6 +647,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -699,8 +691,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -715,9 +707,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -741,8 +731,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -763,10 +753,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -810,8 +799,8 @@ msgstr "" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -829,11 +818,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "" @@ -866,9 +855,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -889,17 +876,18 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -987,9 +975,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1023,7 +1011,7 @@ msgid "Logger" msgstr "" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "" @@ -1035,9 +1023,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1059,8 +1047,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1096,14 +1084,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "" @@ -1120,8 +1108,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1147,14 +1134,16 @@ msgstr "" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1172,13 +1161,11 @@ msgid "Not generated" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1195,8 +1182,7 @@ msgstr "" msgid "One or more updates are available" msgstr "" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1236,9 +1222,9 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1304,8 +1290,7 @@ msgstr "" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1315,24 +1300,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." msgstr "" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1353,8 +1333,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1437,8 +1417,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1564,8 +1544,7 @@ msgstr "" msgid "Statistics" msgstr "" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1587,15 +1566,13 @@ msgstr "" msgid "Super administrator" msgstr "" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1631,10 +1608,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1658,8 +1635,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1673,9 +1649,7 @@ 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." +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 @@ -1742,9 +1716,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "" @@ -1767,14 +1741,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1803,14 +1779,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1830,18 +1808,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "" @@ -1858,6 +1824,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/pt/LC_MESSAGES/app.po b/frontend/locale/pt/LC_MESSAGES/app.po index df8dfe13a..1fb2992e3 100644 --- a/frontend/locale/pt/LC_MESSAGES/app.po +++ b/frontend/locale/pt/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -283,8 +275,7 @@ msgstr "" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" @@ -297,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -307,8 +297,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -323,8 +312,7 @@ msgstr "" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -380,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "" @@ -405,8 +392,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -423,18 +410,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -446,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -485,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -552,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -560,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -632,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -657,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -700,8 +692,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -716,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -742,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -764,10 +754,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -811,8 +800,8 @@ msgstr "" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -830,11 +819,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "" @@ -867,9 +856,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -890,17 +877,18 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -988,9 +976,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1024,7 +1012,7 @@ msgid "Logger" msgstr "" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "" @@ -1036,9 +1024,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1060,8 +1048,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1097,14 +1085,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "" @@ -1121,8 +1109,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1148,14 +1135,16 @@ msgstr "" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1173,13 +1162,11 @@ msgid "Not generated" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1196,8 +1183,7 @@ msgstr "" msgid "One or more updates are available" msgstr "" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1237,9 +1223,9 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1305,8 +1291,7 @@ msgstr "" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1316,24 +1301,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." msgstr "" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1354,8 +1334,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1438,8 +1418,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1565,8 +1545,7 @@ msgstr "" msgid "Statistics" msgstr "" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1588,15 +1567,13 @@ msgstr "" msgid "Super administrator" msgstr "" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1632,10 +1609,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1659,8 +1636,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1674,9 +1650,7 @@ 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." +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 @@ -1743,9 +1717,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "" @@ -1768,14 +1742,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1804,14 +1780,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1831,18 +1809,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "" @@ -1859,6 +1825,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/ru/LC_MESSAGES/app.po b/frontend/locale/ru/LC_MESSAGES/app.po index 8697ac903..b7166a33c 100644 --- a/frontend/locale/ru/LC_MESSAGES/app.po +++ b/frontend/locale/ru/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "Добавить аккаунт" msgid "Account created" msgstr "Аккаунт создан" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "аккаунт изменен" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "Действие" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "Адрес" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "Синоним" msgid "Alias created" msgstr "Синоним создан" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "Синоним(ы)" @@ -283,8 +275,7 @@ msgstr "Изменить пароль" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "Выберите эту опцию если пароль в вашем файле не зашифрован " @@ -297,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -307,8 +297,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -323,8 +312,7 @@ msgstr "Подтверждение" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -380,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "Дата создания" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "Шифровать пароль" @@ -405,8 +392,8 @@ msgstr "Приборная панель" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -423,18 +410,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -446,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -485,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -552,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "Статистика" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -560,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -632,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -657,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -700,8 +692,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "Разрешено" @@ -716,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -742,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -764,10 +754,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -783,9 +772,7 @@ msgstr "Перенаправленые" #: src/components/user/ForwardForm.vue:6 msgid "Forward messages and store copies into your local mailbox" -msgstr "" -"Перенаправление сообщения, и сохранение копии в вашем локальном почтовом " -"ящике" +msgstr "Перенаправление сообщения, и сохранение копии в вашем локальном почтовом ящике" #: src/components/user/ForwardForm.vue:19 #: src/components/user/ForwardForm.vue:52 @@ -814,8 +801,8 @@ msgstr "" msgid "Full name" msgstr "Имя файла" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -834,11 +821,11 @@ msgstr "Имя файла" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "Основные" @@ -871,9 +858,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -894,17 +879,19 @@ msgstr "" msgid "Identities" msgstr "Пользователи" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +#, fuzzy +msgid "Identities deleted" +msgstr "Пользователи" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -992,9 +979,9 @@ msgstr "Дата последней модификации" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1028,7 +1015,7 @@ msgid "Logger" msgstr "Логгер" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "Завершить сеанс" @@ -1040,9 +1027,9 @@ msgstr "Логи" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "Почтовые ящики" @@ -1064,8 +1051,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1101,14 +1088,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "Логин" @@ -1125,8 +1112,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1152,14 +1138,16 @@ msgstr "Следующая" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1177,13 +1165,11 @@ msgid "Not generated" msgstr "Получатель не определен" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1200,8 +1186,7 @@ msgstr "" msgid "One or more updates are available" msgstr "Доступны одно или более обновлений." -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1241,9 +1226,9 @@ msgstr "Пароль" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1309,8 +1294,7 @@ msgstr "Профиль обновлен" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1320,28 +1304,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." -msgstr "" -"Квота в мегабайтах для этого почтового ящика. Определите собственное " -"значение или используйте значение по умолчанию для родительского домена. " -"Оставьте пустым для неограниченного значения. (Не разрешено администраторам" -" домена)" +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." +msgstr "Квота в мегабайтах для этого почтового ящика. Определите собственное значение или используйте значение по умолчанию для родительского домена. Оставьте пустым для неограниченного значения. (Не разрешено администраторам домена)" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1362,8 +1337,8 @@ msgstr "Ошибочный запрос" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "Ошибочный запрос" @@ -1446,8 +1421,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1574,8 +1549,7 @@ msgstr "" msgid "Statistics" msgstr "Статистика" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1597,15 +1571,13 @@ msgstr "" msgid "Super administrator" msgstr "Супер администратор" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1641,10 +1613,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1668,8 +1640,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1684,9 +1655,7 @@ 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." +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 @@ -1753,9 +1722,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "Логин пользователя" @@ -1778,14 +1747,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1814,14 +1785,16 @@ msgstr "Год" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1841,18 +1814,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "Пароли не совпадают" @@ -1869,6 +1830,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/sv/LC_MESSAGES/app.po b/frontend/locale/sv/LC_MESSAGES/app.po index 858b3d10a..d231d26dc 100644 --- a/frontend/locale/sv/LC_MESSAGES/app.po +++ b/frontend/locale/sv/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "Konto" msgid "Account created" msgstr "Konto skapat" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "Konto uppdaterat" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "Åtgärder" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "Adress" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "Alias" msgid "Alias created" msgstr "Alias skapat" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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" @@ -283,8 +275,7 @@ msgstr "Ändra lösenord" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "Markera det här alternativet om lösenord i filen inte är krypterad" @@ -297,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -307,8 +297,7 @@ msgstr "" msgid "Close" msgstr "Stäng" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "Stäng" @@ -323,8 +312,7 @@ msgstr "Bekräftelse" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "Grattis! Tvåfaktorsautentisering är nu aktiverat för ditt konto." #: src/views/Login.vue:23 @@ -380,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "Skapelsedatum" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "Krypterade lösenord" @@ -405,8 +392,8 @@ msgstr "Kontrollpanel" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -423,19 +410,18 @@ msgid "Default mailbox quota" msgstr "Standard brevlåde kvota" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." -msgstr "" -"Standardkvota i MB applicerad på nya brevlådor. 0 betyder ingen kvota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Standardkvota i MB applicerad på nya brevlådor. 0 betyder ingen kvota." #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -447,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "Beskrivning" @@ -486,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -553,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "DNS status" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -561,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "Domän" @@ -633,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -658,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -701,8 +692,8 @@ msgstr "Aktivera DNS kontroller" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "Aktiverad" @@ -717,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -743,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "Går ut" @@ -765,10 +754,9 @@ msgstr "Misslyckades" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -813,8 +801,8 @@ msgstr "" msgid "Full name" msgstr "Fullständigt nam" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -833,11 +821,11 @@ msgstr "Helt i linje" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "Generellt" @@ -870,9 +858,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -893,17 +879,19 @@ msgstr "" msgid "Identities" msgstr "Konton" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +#, fuzzy +msgid "Identities deleted" +msgstr "Konton" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -991,9 +979,9 @@ msgstr "Senast ändrad" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1027,7 +1015,7 @@ msgid "Logger" msgstr "Loggare" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "Logga ut" @@ -1039,9 +1027,9 @@ msgstr "Loggar" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "Brevlådor" @@ -1063,8 +1051,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1100,14 +1088,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "Namn" @@ -1124,8 +1112,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1151,14 +1138,16 @@ msgstr "Nästa" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1176,13 +1165,11 @@ msgid "Not generated" msgstr "Ej genererad" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1199,8 +1186,7 @@ msgstr "" msgid "One or more updates are available" msgstr "En eller fler uppdateringar finns tillgängliga" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1240,9 +1226,9 @@ msgstr "Lösenord" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1308,8 +1294,7 @@ msgstr "Profil uppdaterad" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1319,29 +1304,20 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." -msgstr "" -"Kvot i MB för denna brevlåda. Definiera ett anpassat värde eller använda " -"domänens förvalda. Lämna tomt för att definiera ett obegränsat värde (ej " -"tillåtet för domänadministratörer)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." +msgstr "Kvot i MB för denna brevlåda. Definiera ett anpassat värde eller använda domänens förvalda. Lämna tomt för att definiera ett obegränsat värde (ej tillåtet för domänadministratörer)." #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." -msgstr "" -"Standardkvota i MB applicerad på nya brevlådor. 0 betyder ingen kvota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." +msgstr "Standardkvota i MB applicerad på nya brevlådor. 0 betyder ingen kvota." #: src/components/domains/DomainForm.vue:68 #: src/components/identities/AccountForm.vue:64 @@ -1361,8 +1337,8 @@ msgstr "Slumpmässig adress" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "Slumpmässigt lösenord" @@ -1445,8 +1421,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1573,8 +1549,7 @@ msgstr "" msgid "Statistics" msgstr "Statistik" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1596,15 +1571,13 @@ msgstr "Sammanställning" msgid "Super administrator" msgstr "Super administratör" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 msgid "Tags" msgstr "Tagg" #: 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." +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 @@ -1640,10 +1613,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1667,8 +1640,7 @@ msgstr "" msgid "Transport" msgstr "Transport" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1683,12 +1655,8 @@ 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 "" -"Tvåfaktorsautentisering (2FA) har inte aktiverats för ditt konto. Aktivering" -" ökar ditt kontos säkerhet." +msgid "Two-Factor Authentication (2FA) is not yet activated for your account. Enabling this feature will increase your account's security." +msgstr "Tvåfaktorsautentisering (2FA) har inte aktiverats för ditt konto. Aktivering ökar ditt kontos säkerhet." #: src/views/TwoFA.vue:11 msgid "Two-factor authentication code" @@ -1754,9 +1722,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "Användarnamn" @@ -1779,14 +1747,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1815,14 +1785,16 @@ msgstr "År" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1842,18 +1814,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "Lösenord matchar inte" @@ -1870,6 +1830,18 @@ msgstr "Detta fält är obligatoriskt" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/tr/LC_MESSAGES/app.po b/frontend/locale/tr/LC_MESSAGES/app.po index 91fb22440..5a1f3ad56 100644 --- a/frontend/locale/tr/LC_MESSAGES/app.po +++ b/frontend/locale/tr/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -28,29 +28,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -66,8 +59,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -79,9 +72,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -106,9 +99,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -146,8 +139,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -161,8 +155,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -173,9 +167,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -184,10 +176,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -283,8 +275,7 @@ msgstr "Parolayı değiştirin" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" @@ -297,8 +288,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -307,8 +297,7 @@ msgstr "" msgid "Close" msgstr "Kapat" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -323,11 +312,8 @@ msgstr "Onayla" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." -msgstr "" -"Tebrikler! Artık hesabınız için İki Faktörlü Kimlik Doğrulama " -"etkinleştirildi." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." +msgstr "Tebrikler! Artık hesabınız için İki Faktörlü Kimlik Doğrulama etkinleştirildi." #: src/views/Login.vue:23 msgid "Connect" @@ -382,8 +368,7 @@ msgstr "" msgid "Creation date" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "" @@ -407,8 +392,8 @@ msgstr "Gösterge Paneli" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "Tarih" @@ -425,18 +410,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -448,9 +433,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "Tanım" @@ -487,8 +472,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -554,7 +538,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -562,16 +546,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -634,11 +623,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -659,6 +648,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -702,8 +692,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -718,9 +708,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -744,8 +732,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -766,10 +754,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -813,8 +800,8 @@ msgstr "Kimden" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -832,11 +819,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "Genel" @@ -869,9 +856,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -892,17 +877,18 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -990,9 +976,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1026,7 +1012,7 @@ msgid "Logger" msgstr "Kayıtçı" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "Çıkış Yapın" @@ -1038,9 +1024,9 @@ msgstr "Kayıtlar" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1062,8 +1048,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1099,14 +1085,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "İsim" @@ -1123,8 +1109,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1150,14 +1135,16 @@ msgstr "Sonraki" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "Hayır" @@ -1175,13 +1162,11 @@ msgid "Not generated" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1198,8 +1183,7 @@ msgstr "" msgid "One or more updates are available" msgstr "Bir veya daha fazla güncelleme mevcut" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1239,9 +1223,9 @@ msgstr "Parola" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1307,8 +1291,7 @@ msgstr "Profil güncellendi" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1318,24 +1301,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." msgstr "" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1356,8 +1334,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1440,8 +1418,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1567,8 +1545,7 @@ msgstr "" msgid "Statistics" msgstr "" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1590,15 +1567,13 @@ msgstr "" msgid "Super administrator" msgstr "Süper Yönetici" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1634,10 +1609,10 @@ msgstr "Kime" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1661,8 +1636,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1676,12 +1650,8 @@ 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 "" -"Hesabınız için İki Faktörlü Kimlik Doğrulama (2FA) henüz etkinleştirilmedi. " -"Bu özelliği etkinleştirmek hesabınızın güvenliğini artıracaktır." +msgid "Two-Factor Authentication (2FA) is not yet activated for your account. Enabling this feature will increase your account's security." +msgstr "Hesabınız için İki Faktörlü Kimlik Doğrulama (2FA) henüz etkinleştirilmedi. Bu özelliği etkinleştirmek hesabınızın güvenliğini artıracaktır." #: src/views/TwoFA.vue:11 msgid "Two-factor authentication code" @@ -1747,9 +1717,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "Kullanıcı adı" @@ -1772,14 +1742,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1808,14 +1780,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "Evet" @@ -1835,18 +1809,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "Parolalar uyuşmuyor" @@ -1863,6 +1825,18 @@ msgstr "Bu alan gerekli" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" diff --git a/frontend/locale/zh-hant/LC_MESSAGES/app.po b/frontend/locale/zh-hant/LC_MESSAGES/app.po index 21487b644..9b40178fa 100644 --- a/frontend/locale/zh-hant/LC_MESSAGES/app.po +++ b/frontend/locale/zh-hant/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: 2023-02-23 18:08+0100\n" +"POT-Creation-Date: 2023-02-24 18:00+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -27,29 +27,22 @@ msgstr "" #: src/components/domains/DNSDetail.vue:47 #: src/components/domains/DNSDetail.vue:205 -msgid "" -"A new key will be generated soon. Refresh the page in a moment to see it." +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: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." +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: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." +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: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." +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 "" #: src/components/tools/TimeSerieChart.vue:16 @@ -65,8 +58,8 @@ msgstr "" msgid "Account created" msgstr "" -#: src/components/identities/IdentityList.vue:67 -#: src/components/identities/IdentityList.vue:146 +#: src/components/identities/IdentityList.vue:79 +#: src/components/identities/IdentityList.vue:160 msgid "Account deleted" msgstr "" @@ -78,9 +71,9 @@ msgstr "" #: 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/identities/IdentityList.vue:98 +#: src/components/identities/IdentityList.vue:20 #: src/components/domains/DomainList.vue:171 +#: src/components/identities/IdentityList.vue:101 msgid "Actions" msgstr "" @@ -105,9 +98,9 @@ msgstr "" #: src/components/domains/DNSDetail.vue:19 #: src/components/identities/AccountSenderAddresses.vue:12 #: src/components/identities/AliasCreationForm.vue:20 +#: src/components/domains/DNSDetail.vue:177 #: src/components/identities/AliasCreationForm.vue:40 #: src/components/identities/AccountSenderAddresses.vue:63 -#: src/components/domains/DNSDetail.vue:177 msgid "Address" msgstr "" @@ -145,8 +138,9 @@ msgid "Administrators of {{ domain.name }}" msgstr "" #: src/components/domains/DomainList.vue:119 -#: src/components/layout/Navbar.vue:63 src/components/layout/Navbar.vue:178 +#: src/components/layout/Navbar.vue:63 #: src/components/domains/DomainList.vue:261 +#: src/components/layout/Navbar.vue:178 msgid "Alarms" msgstr "" @@ -160,8 +154,8 @@ msgstr "" msgid "Alias created" msgstr "" -#: src/components/identities/IdentityList.vue:45 -#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:53 +#: src/components/identities/IdentityList.vue:134 msgid "Alias deleted" msgstr "" @@ -172,9 +166,7 @@ msgstr "" #: src/components/identities/AccountAliasForm.vue:3 #: src/components/identities/AliasRecipientForm.vue:3 -msgid "" -"Alias(es) of this mailbox. To create a catchall alias, just enter the domain" -" name (@domain.tld)." +msgid "Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)." msgstr "" #: src/components/domains/DomainList.vue:25 @@ -183,10 +175,10 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:62 #: src/components/identities/AccountCreationForm.vue:65 #: src/components/identities/AccountCreationForm.vue:93 +#: src/components/domains/DomainList.vue:167 #: 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 "" @@ -282,8 +274,7 @@ msgstr "" msgid "Check out the following list to find related components" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: 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 "" @@ -296,8 +287,7 @@ msgstr "" msgid "Choose a role" msgstr "" -#: src/App.vue:18 src/App.vue:2 -#: src/components/domains/AdministratorList.vue:36 +#: src/App.vue:18 src/App.vue:2 src/components/domains/AdministratorList.vue:36 #: src/components/domains/DomainAliasForm.vue:21 #: src/components/domains/DomainDKIMKey.vue:22 #: src/components/domains/DomainDNSConfig.vue:40 @@ -306,8 +296,7 @@ msgstr "" msgid "Close" msgstr "" -#: src/components/alarms/AlarmList.vue:21 -#: src/components/alarms/AlarmList.vue:5 +#: src/components/alarms/AlarmList.vue:21 src/components/alarms/AlarmList.vue:5 msgid "Closed" msgstr "" @@ -322,8 +311,7 @@ msgstr "" #: src/components/user/TwoFactorAuthForm.vue:34 #: src/components/user/TwoFactorAuthForm.vue:2 -msgid "" -"Congratulations! Two-Factor Authentication is now enabled for your account." +msgid "Congratulations! Two-Factor Authentication is now enabled for your account." msgstr "" #: src/views/Login.vue:23 @@ -379,8 +367,7 @@ msgstr "" msgid "Creation date" msgstr "" -#: src/views/identities/Identities.vue:45 -#: src/views/identities/Identities.vue:1 +#: src/views/identities/Identities.vue:45 src/views/identities/Identities.vue:1 msgid "Crypt passwords" msgstr "" @@ -404,8 +391,8 @@ msgstr "" #: src/components/logs/AuditTrailList.vue:8 #: src/components/logs/MessageList.vue:10 -#: src/components/logs/AuditTrailList.vue:40 #: src/components/logs/MessageList.vue:43 +#: src/components/logs/AuditTrailList.vue:40 msgid "Date" msgstr "" @@ -422,18 +409,18 @@ msgid "Default mailbox quota" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:6 -msgid "" -"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " -"GB. A value of 0 means no quota." +msgid "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:89 -#: src/components/identities/IdentityList.vue:92 -#: src/components/identities/IdentityList.vue:168 -#: src/components/identities/IdentityList.vue:171 +#: src/components/identities/IdentityList.vue:152 +#: src/components/identities/IdentityList.vue:155 +#: src/components/identities/IdentityList.vue:162 #: src/components/domains/DomainList.vue:257 +#: src/components/identities/IdentityList.vue:233 +#: src/components/identities/IdentityList.vue:236 +#: src/components/identities/IdentityList.vue:243 msgid "Delete" msgstr "" @@ -445,9 +432,9 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:31 #: src/components/identities/AliasGeneralForm.vue:87 #: src/components/identities/AliasSummary.vue:19 -#: src/components/identities/AliasCreationForm.vue:51 -#: src/components/identities/AliasGeneralForm.vue:56 #: src/components/admin/ComponentsInformationTable.vue:54 +#: src/components/identities/AliasGeneralForm.vue:56 +#: src/components/identities/AliasCreationForm.vue:51 msgid "Description" msgstr "" @@ -484,8 +471,7 @@ msgstr "" #: src/components/domains/DNSDetail.vue:30 #: src/components/domains/DNSDetail.vue:189 -msgid "" -"DKIM keys already exist for this domain. Do you want to overwrite them?" +msgid "DKIM keys already exist for this domain. Do you want to overwrite them?" msgstr "" #: src/components/domains/DomainDKIMKey.vue:4 @@ -551,7 +537,7 @@ msgstr "" msgid "DNS status" msgstr "" -#: src/components/identities/IdentityList.vue:49 +#: src/components/identities/IdentityList.vue:51 msgid "Do not delete account folder" msgstr "" @@ -559,16 +545,21 @@ msgstr "" msgid "Do not delete domain folder" msgstr "" -#: src/components/identities/IdentityList.vue:31 -#: src/components/identities/IdentityList.vue:111 +#: src/components/identities/IdentityList.vue:36 +#: src/components/identities/IdentityList.vue:118 msgid "Do you really want to delete the alias %{ alias }?" msgstr "" +#: src/components/identities/IdentityList.vue:92 +#: src/components/identities/IdentityList.vue:174 +msgid "Do you really want to delete the selected identities?" +msgstr "" + #: src/components/alarms/AlarmList.vue:10 #: 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:74 +#: src/components/identities/AliasGeneralForm.vue:31 msgid "Domain" msgstr "" @@ -631,11 +622,11 @@ 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/identities/IdentityList.vue:167 -#: src/components/identities/IdentityList.vue:170 +#: src/components/identities/IdentityList.vue:151 +#: src/components/identities/IdentityList.vue:154 #: src/components/domains/DomainList.vue:256 +#: src/components/identities/IdentityList.vue:232 +#: src/components/identities/IdentityList.vue:235 msgid "Edit" msgstr "" @@ -656,6 +647,7 @@ msgstr "" msgid "Edit domain alias" msgstr "" +#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -699,8 +691,8 @@ msgstr "" #: src/components/identities/AccountGeneralForm.vue:13 #: src/components/identities/AliasForm.vue:17 #: src/components/identities/AliasGeneralForm.vue:11 -#: src/components/identities/AccountCreationForm.vue:89 #: src/components/domains/DomainCreationForm.vue:78 +#: src/components/identities/AccountCreationForm.vue:89 msgid "Enabled" msgstr "" @@ -715,9 +707,7 @@ msgid "Enter an email address" msgstr "" #: 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." +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 "" #: src/views/user/PasswordRecoverySmsTotpForm.vue:11 @@ -741,8 +731,8 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:26 #: src/components/identities/AliasGeneralForm.vue:79 #: src/components/identities/AliasSummary.vue:15 -#: src/components/identities/AliasCreationForm.vue:46 #: src/components/identities/AliasGeneralForm.vue:49 +#: src/components/identities/AliasCreationForm.vue:46 msgid "Expire at" msgstr "" @@ -763,10 +753,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:30 #: src/components/identities/AccountGeneralForm.vue:32 -#: src/components/user/ProfileForm.vue:45 -#: src/components/identities/AccountCreationForm.vue:80 +#: src/components/user/ProfileForm.vue:45 src/components/user/ProfileForm.vue:9 #: src/components/identities/AccountGeneralForm.vue:17 -#: src/components/user/ProfileForm.vue:9 +#: src/components/identities/AccountCreationForm.vue:80 msgid "First name" msgstr "" @@ -810,8 +799,8 @@ msgstr "" msgid "Full name" msgstr "" -#: src/components/identities/IdentityList.vue:17 -#: src/components/identities/IdentityList.vue:96 +#: src/components/identities/IdentityList.vue:18 +#: src/components/identities/IdentityList.vue:99 msgid "Fullname/recipient" msgstr "" @@ -829,11 +818,11 @@ msgstr "" #: src/components/identities/AliasCreationForm.vue:17 #: src/components/identities/AliasCreationForm.vue:49 #: src/components/identities/AliasForm.vue:7 src/views/domains/Domain.vue:11 -#: 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 +#: src/components/identities/AliasCreationForm.vue:37 +#: src/components/identities/AliasCreationForm.vue:69 msgid "General" msgstr "" @@ -866,9 +855,7 @@ msgid "help" msgstr "" #: src/components/domains/DomainDNSConfig.vue:8 -msgid "" -"Here is an example of DNS configuration (bind format). Replace values " -"between [ ] by the appropriate ones." +msgid "Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones." msgstr "" #: src/components/domains/DomainDNSConfig.vue:33 @@ -889,17 +876,18 @@ msgstr "" msgid "Identities" msgstr "" +#: src/components/identities/IdentityList.vue:112 +#: src/components/identities/IdentityList.vue:193 +msgid "Identities deleted" +msgstr "" + #: src/components/tools/CreationForm.vue:26 #: src/components/tools/CreationForm.vue:99 -msgid "" -"If you close this form now, your modifications won't be saved. Do you " -"confirm?" +msgid "If you close this form now, your modifications won't be saved. Do you confirm?" msgstr "" #: src/components/dmarc/DmarcAligmentChart.vue:52 -msgid "" -"If you configured it recently, please wait for the first report to be " -"received and processed." +msgid "If you configured it recently, please wait for the first report to be received and processed." msgstr "" #: src/components/tools/ImportForm.vue:29 @@ -987,9 +975,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:31 #: 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 +#: src/components/identities/AccountGeneralForm.vue:25 +#: src/components/identities/AccountCreationForm.vue:81 msgid "Last name" msgstr "" @@ -1023,7 +1011,7 @@ msgid "Logger" msgstr "" #: src/components/layout/Navbar.vue:139 src/components/layout/Topbar.vue:6 -#: src/components/layout/Navbar.vue:254 src/components/layout/Topbar.vue:53 +#: src/components/layout/Topbar.vue:53 src/components/layout/Navbar.vue:254 msgid "Logout" msgstr "" @@ -1035,9 +1023,9 @@ msgstr "" #: src/components/identities/AccountCreationForm.vue:46 #: src/components/identities/AccountCreationForm.vue:89 #: src/components/identities/AccountForm.vue:56 +#: src/components/alarms/AlarmList.vue:75 #: src/components/identities/AccountCreationForm.vue:96 #: src/components/identities/AccountCreationForm.vue:139 -#: src/components/alarms/AlarmList.vue:75 msgid "Mailbox" msgstr "" @@ -1059,8 +1047,8 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:42 #: src/components/domains/DomainLimitationsForm.vue:9 #: src/components/identities/AccountCreationForm.vue:56 -#: src/components/identities/AccountCreationForm.vue:106 #: src/components/domains/DomainCreationForm.vue:93 +#: src/components/identities/AccountCreationForm.vue:106 msgid "Message sending limit" msgstr "" @@ -1096,14 +1084,14 @@ msgstr "" #: 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/identities/IdentityList.vue:95 -#: src/components/domains/DNSDetail.vue:176 +#: src/components/identities/IdentityList.vue:17 #: src/components/domains/DomainAliasForm.vue:13 -#: src/components/domains/DomainCreationForm.vue:76 -#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DNSDetail.vue:176 #: src/components/domains/DomainList.vue:166 +#: src/components/domains/AdministratorList.vue:87 +#: src/components/domains/DomainCreationForm.vue:76 #: src/components/admin/ComponentsInformationTable.vue:51 +#: src/components/identities/IdentityList.vue:98 msgid "Name" msgstr "" @@ -1120,8 +1108,7 @@ 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 +#: src/views/identities/Identities.vue:15 src/views/identities/Identities.vue:3 msgid "New" msgstr "" @@ -1147,14 +1134,16 @@ msgstr "" #: 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/identities/IdentityList.vue:42 +#: src/components/identities/IdentityList.vue:67 +#: src/components/identities/IdentityList.vue:97 #: src/components/tools/CreationForm.vue:30 -#: src/components/tools/CreationForm.vue:103 -#: src/components/identities/IdentityList.vue:116 -#: src/components/identities/IdentityList.vue:137 #: src/components/domains/DNSDetail.vue:193 #: src/components/domains/DomainList.vue:203 +#: src/components/identities/IdentityList.vue:123 +#: src/components/identities/IdentityList.vue:148 +#: src/components/identities/IdentityList.vue:178 +#: src/components/tools/CreationForm.vue:103 msgid "No" msgstr "" @@ -1172,13 +1161,11 @@ msgid "Not generated" msgstr "" #: src/components/domains/DomainLimitationsForm.vue:9 -msgid "" -"Number of messages this domain can send per day. Leave empty for no limit." +msgid "Number of messages this domain can send per day. Leave empty for no limit." msgstr "" #: src/components/identities/AccountMailboxForm.vue:8 -msgid "" -"Number of messages this mailbox can send per day. Leave empty for no limit." +msgid "Number of messages this mailbox can send per day. Leave empty for no limit." msgstr "" #: src/views/user/PasswordRecoveryForm.vue:31 @@ -1195,8 +1182,7 @@ msgstr "" msgid "One or more updates are available" msgstr "" -#: src/components/alarms/AlarmList.vue:18 -#: src/components/alarms/AlarmList.vue:2 +#: src/components/alarms/AlarmList.vue:18 src/components/alarms/AlarmList.vue:2 msgid "Opened" msgstr "" @@ -1236,9 +1222,9 @@ msgstr "" #: src/components/domains/DomainCreationForm.vue:127 #: src/components/identities/AccountCreationForm.vue:101 #: src/components/identities/AccountPasswordForm.vue:32 -#: src/components/identities/AccountCreationForm.vue:151 -#: src/components/identities/AccountPasswordForm.vue:103 #: src/components/domains/DomainCreationForm.vue:178 +#: src/components/identities/AccountPasswordForm.vue:103 +#: src/components/identities/AccountCreationForm.vue:151 msgid "Password copied to clipboard" msgstr "" @@ -1304,8 +1290,7 @@ msgstr "" msgid "Provide a CSV file where lines respect one of the following formats:" msgstr "" -#: src/components/logs/MessageList.vue:9 -#: src/components/logs/MessageList.vue:42 +#: src/components/logs/MessageList.vue:9 src/components/logs/MessageList.vue:42 msgid "Queue ID" msgstr "" @@ -1315,24 +1300,19 @@ msgstr "" #: src/components/domains/DomainSummary.vue:15 #: src/components/identities/AccountCreationForm.vue:50 #: src/components/identities/AccountMailboxForm.vue:14 -#: src/components/identities/AccountCreationForm.vue:100 -#: src/components/identities/AccountMailboxForm.vue:3 -#: src/components/domains/DomainCreationForm.vue:91 #: src/components/domains/DomainList.vue:170 +#: src/components/domains/DomainCreationForm.vue:91 +#: src/components/identities/AccountMailboxForm.vue:3 +#: src/components/identities/AccountCreationForm.vue:100 msgid "Quota" msgstr "" #: src/components/identities/AccountMailboxForm.vue:5 -msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." +msgid "Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)." msgstr "" #: src/components/domains/DomainLimitationsForm.vue:3 -msgid "" -"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " -"A value of 0 means no quota." +msgid "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota." msgstr "" #: src/components/domains/DomainForm.vue:68 @@ -1353,8 +1333,8 @@ msgstr "" #: src/components/domains/DomainOptionsForm.vue:6 #: src/components/identities/AccountCreationForm.vue:34 #: src/components/identities/AccountPasswordForm.vue:9 -#: src/components/identities/AccountCreationForm.vue:84 #: src/components/domains/DomainCreationForm.vue:109 +#: src/components/identities/AccountCreationForm.vue:84 msgid "Random password" msgstr "" @@ -1437,8 +1417,8 @@ msgstr "" #: src/views/user/PasswordRecoveryForm.vue:19 #: src/views/user/PasswordRecoveryForm.vue:32 #: src/views/user/PasswordRecoverySmsTotpForm.vue:22 -#: src/views/user/PasswordRecoveryForm.vue:78 #: src/views/user/PasswordRecoverySmsTotpForm.vue:70 +#: src/views/user/PasswordRecoveryForm.vue:78 msgid "Return to login" msgstr "" @@ -1564,8 +1544,7 @@ msgstr "" msgid "Statistics" msgstr "" -#: src/components/alarms/AlarmList.vue:9 -#: src/components/logs/MessageList.vue:11 +#: src/components/alarms/AlarmList.vue:9 src/components/logs/MessageList.vue:11 #: src/components/alarms/AlarmList.vue:73 #: src/components/logs/MessageList.vue:44 msgid "Status" @@ -1587,15 +1566,13 @@ msgstr "" msgid "Super administrator" msgstr "" -#: src/components/identities/IdentityList.vue:18 -#: src/components/identities/IdentityList.vue:97 +#: src/components/identities/IdentityList.vue:19 +#: src/components/identities/IdentityList.vue:100 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." +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 @@ -1631,10 +1608,10 @@ msgstr "" #: src/views/Login.vue:39 src/views/user/PasswordRecoveryChangeForm.vue:62 #: src/views/user/PasswordRecoveryForm.vue:69 -#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 src/views/Login.vue:99 -#: src/views/user/PasswordRecoveryChangeForm.vue:122 -#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoverySmsTotpForm.vue:46 #: src/views/user/PasswordRecoverySmsTotpForm.vue:94 +#: src/views/user/PasswordRecoveryForm.vue:115 +#: src/views/user/PasswordRecoveryChangeForm.vue:122 src/views/Login.vue:99 msgid "Too many unsuccessful attempts, please try later." msgstr "" @@ -1658,8 +1635,7 @@ msgstr "" msgid "Transport" msgstr "" -#: src/components/alarms/AlarmList.vue:8 -#: src/components/alarms/AlarmList.vue:72 +#: src/components/alarms/AlarmList.vue:8 src/components/alarms/AlarmList.vue:72 msgid "Triggered" msgstr "" @@ -1673,9 +1649,7 @@ 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." +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 @@ -1742,9 +1716,9 @@ msgstr "" #: src/components/domains/AdministratorList.vue:18 #: src/components/identities/AccountCreationForm.vue:29 #: src/components/identities/AccountGeneralForm.vue:19 src/views/Login.vue:9 -#: src/components/identities/AccountCreationForm.vue:79 -#: src/components/identities/AccountGeneralForm.vue:7 #: src/components/domains/AdministratorList.vue:86 +#: src/components/identities/AccountGeneralForm.vue:7 +#: src/components/identities/AccountCreationForm.vue:79 msgid "Username" msgstr "" @@ -1767,14 +1741,16 @@ msgstr "" #: 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/identities/IdentityList.vue:35 +#: src/components/identities/IdentityList.vue:60 +#: src/components/identities/IdentityList.vue:91 #: src/components/tools/CreationForm.vue:25 src/views/user/APISetup.vue:40 -#: src/components/tools/CreationForm.vue:98 -#: src/components/identities/IdentityList.vue:109 -#: src/components/identities/IdentityList.vue:130 #: src/components/domains/DNSDetail.vue:187 -#: src/components/domains/DomainList.vue:196 src/views/user/APISetup.vue:81 +#: src/components/domains/DomainList.vue:196 +#: src/components/identities/IdentityList.vue:116 +#: src/components/identities/IdentityList.vue:141 +#: src/components/identities/IdentityList.vue:172 +#: src/components/tools/CreationForm.vue:98 src/views/user/APISetup.vue:81 msgid "Warning" msgstr "" @@ -1803,14 +1779,16 @@ msgstr "" #: 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/identities/IdentityList.vue:43 +#: src/components/identities/IdentityList.vue:68 +#: src/components/identities/IdentityList.vue:98 #: src/components/tools/CreationForm.vue:29 -#: src/components/tools/CreationForm.vue:102 -#: src/components/identities/IdentityList.vue:117 -#: src/components/identities/IdentityList.vue:138 #: src/components/domains/DNSDetail.vue:194 #: src/components/domains/DomainList.vue:204 +#: src/components/identities/IdentityList.vue:124 +#: src/components/identities/IdentityList.vue:149 +#: src/components/identities/IdentityList.vue:179 +#: src/components/tools/CreationForm.vue:102 msgid "Yes" msgstr "" @@ -1830,18 +1808,6 @@ msgstr "" msgid "Your API token is:" msgstr "" -#: src/filters/index.js:7 -msgid "yes" -msgstr "" - -#: src/filters/index.js:7 -msgid "no" -msgstr "" - -#: src/components/parameters/ParametersForm.vue:97 -msgid "Settings: " -msgstr "" - #: src/plugins/vee-validate.js:12 msgid "Passwords mismatch" msgstr "" @@ -1858,6 +1824,18 @@ msgstr "" msgid "Invalid password" msgstr "" +#: src/filters/index.js:7 +msgid "yes" +msgstr "" + +#: src/filters/index.js:7 +msgid "no" +msgstr "" + +#: src/components/parameters/ParametersForm.vue:97 +msgid "Settings: " +msgstr "" + #: src/api/repository.js:38 msgid "You are throttled, please try later." msgstr "" From c7bcd80b1748e1186ec7f551e6662cdd401adedc Mon Sep 17 00:00:00 2001 From: Spitap Date: Sat, 25 Feb 2023 10:44:30 +0100 Subject: [PATCH 18/25] refactor tests, updated lib to cover write permission issue Please work codecov --- modoboa/pdfcredentials/lib.py | 7 ++++++- modoboa/pdfcredentials/tests/__init__.py | 1 + modoboa/pdfcredentials/{tests.py => tests/test_views.py} | 0 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 modoboa/pdfcredentials/tests/__init__.py rename modoboa/pdfcredentials/{tests.py => tests/test_views.py} (100%) diff --git a/modoboa/pdfcredentials/lib.py b/modoboa/pdfcredentials/lib.py index a7bd85a4d..6817f0479 100644 --- a/modoboa/pdfcredentials/lib.py +++ b/modoboa/pdfcredentials/lib.py @@ -18,8 +18,13 @@ from modoboa.parameters import tools as param_tools def init_storage_dir(): """Create the directory whare documents will be stored.""" storage_dir = param_tools.get_global_parameter("storage_dir") - if os.path.exists(storage_dir): + if os.path.exists(storage_dir) and os.access(storage_dir, os.W_OK): return + elif not os.access(storage_dir, os.W_OK) and os.path.exists(storage_dir): + raise InternalError( + _("Can't write to selected directory to store PDF " + "documents") + ) try: os.mkdir(storage_dir) except (OSError, IOError) as inst: diff --git a/modoboa/pdfcredentials/tests/__init__.py b/modoboa/pdfcredentials/tests/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/modoboa/pdfcredentials/tests/__init__.py @@ -0,0 +1 @@ + diff --git a/modoboa/pdfcredentials/tests.py b/modoboa/pdfcredentials/tests/test_views.py similarity index 100% rename from modoboa/pdfcredentials/tests.py rename to modoboa/pdfcredentials/tests/test_views.py From 490b58886b8f0730a1191e29e687cfb49e0faab9 Mon Sep 17 00:00:00 2001 From: Spitap Date: Sat, 25 Feb 2023 10:59:37 +0100 Subject: [PATCH 19/25] Added lib tests --- modoboa/pdfcredentials/tests/test_lib.py | 78 ++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 modoboa/pdfcredentials/tests/test_lib.py diff --git a/modoboa/pdfcredentials/tests/test_lib.py b/modoboa/pdfcredentials/tests/test_lib.py new file mode 100644 index 000000000..7e7709b19 --- /dev/null +++ b/modoboa/pdfcredentials/tests/test_lib.py @@ -0,0 +1,78 @@ +"""PDF credentials lib tests.""" + +import os +import shutil +import tempfile + +from django.test import override_settings +from django.urls import reverse + +from modoboa.admin import factories +from modoboa.core import models as core_models + +from modoboa.lib.tests import ModoAPITestCase +from modoboa.lib.exceptions import InternalError + +import modoboa.pdfcredentials.lib as lib +from subprocess import Popen, PIPE + + +class PDFCredentialsLibTestCase(ModoAPITestCase): + + @classmethod + def setUpTestData(cls): # NOQA:N802 + """Create test data.""" + super().setUpTestData() + factories.populate_database() + + def tearDown(self): + """Reset test env.""" + shutil.rmtree(self.workdir) + + def _create_account(self, username, expected_status=201): + url = reverse("v2:account-list") + data = { + "username": f"{username}", + "role": "SimpleUsers", + "mailbox": { + "use_domain_quota": True + }, + "password": "Toto12345", + "language": "fr", + } + resp = self.client.post(url, data, format="json") + self.assertEqual(resp.status_code, expected_status) + return data + + def test_storage_dir_setting(self): + """Test multiple possibilities with storage_dir setup""" + self.set_global_parameter("storage_dir", "/I_DONT_EXIST") + with self.assertRaises(InternalError): + lib.init_storage_dir() + self.set_global_parameter("storage_dir", "/root") + with self.assertRaises(InternalError): + lib.init_storage_dir() + self.set_global_parameter("storage_dir", self.workdir) + self.assertIsNone(lib.init_storage_dir()) + + def test_pdf_decryption(self): + """Test that PDFs are decrypted.""" + username = "toto1818@test.com" + self._create_account(username) + fname = os.path.join(self.workdir, "{}.pdf".format(username)) + self.assertTrue(os.path.exists(fname)) + filebuff = lib.decrypt_file(fname) + self.assertIn("application/pdf", + Popen("/usr/bin/file -b --mime -", + shell=True, + stdout=PIPE, + stdin=PIPE) + .communicate(filebuff)[0].strip().decode() + ) + with open(fname, "r") as file: + with self.assertRaises(UnicodeDecodeError): + Popen("/usr/bin/file -b --mime -", + shell=True, + stdout=PIPE, + stdin=PIPE).communicate(file.read(1024))[0].strip() + From 394d75341d4bafa5eafb7c46e9b70c7b33e0a676 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 26 Feb 2023 13:28:19 +0100 Subject: [PATCH 20/25] Few updates --- frontend/src/api/credentials.js | 7 --- .../components/identities/IdentityList.vue | 59 +++++++++++++------ modoboa/admin/api/v2/serializers.py | 5 +- modoboa/pdfcredentials/api/v2/serializers.py | 2 +- modoboa/pdfcredentials/api/v2/views.py | 7 ++- modoboa/pdfcredentials/handlers.py | 9 ++- 6 files changed, 58 insertions(+), 31 deletions(-) delete mode 100644 frontend/src/api/credentials.js diff --git a/frontend/src/api/credentials.js b/frontend/src/api/credentials.js deleted file mode 100644 index b8f0f7e1a..000000000 --- a/frontend/src/api/credentials.js +++ /dev/null @@ -1,7 +0,0 @@ -import repository from './repository' - -export default { - getCredentials (id) { - return repository.get(`credentials/${id}/`) - } -} diff --git a/frontend/src/components/identities/IdentityList.vue b/frontend/src/components/identities/IdentityList.vue index 657d1a951..910c8bf97 100644 --- a/frontend/src/components/identities/IdentityList.vue +++ b/frontend/src/components/identities/IdentityList.vue @@ -83,9 +83,9 @@ import { bus } from '@/main' import identities from '@/api/identities' import accounts from '@/api/accounts' import aliases from '@/api/aliases' -import credentials from '@/api/credentials' import ConfirmDialog from '@/components/layout/ConfirmDialog' import MenuItems from '@/components/tools/MenuItems' +import repository from '@/api/repository' export default { components: { @@ -205,35 +205,58 @@ export default { this.selected = [] }) }, + downloadFile (options) { + repository.get(options.url).then(resp => { + const url = window.URL.createObjectURL( + new Blob([resp.data], { type: options.content_type })) + const link = document.createElement('a') + link.style.display = 'none' + link.href = url + link.download = options.filename + document.body.appendChild(link) + link.click() + window.URL.revokeObjectURL(link.href) + document.body.removeChild(link) + }) + }, getMenuItems (item) { const result = [] if (item.type === 'account') { item.possible_actions.forEach(element => { result.push({ - label: this.$gettext(element.label), + label: element.label, icon: element.icon, onClick: () => { - if (element.body.type === 'pdfcredentials') { - credentials.getCredentials(item.pk) - .then((response) => { - const blob = new Blob([response.data], { - type: 'application/pdf' - }) - const _url = window.URL.createObjectURL(blob) - window.open(_url, '_blank').focus() - }).catch((err) => { - console.log(err) - }) - this.fetchIdentities() + if (element.type === 'download') { + this.downloadFile(element) } + this.fetchIdentities() } }) }) - result.push({ label: this.$gettext('Edit'), icon: 'mdi-circle-edit-outline', onClick: this.editAccount }) - result.push({ label: this.$gettext('Delete'), icon: 'mdi-delete-outline', onClick: this.deleteAccount, color: 'red' }) + result.push({ + label: this.$gettext('Edit'), + icon: 'mdi-circle-edit-outline', + onClick: this.editAccount + }) + result.push({ + label: this.$gettext('Delete'), + icon: 'mdi-delete-outline', + onClick: this.deleteAccount, + color: 'red' + }) } else if (item.type === 'alias') { - result.push({ label: this.$gettext('Edit'), icon: 'mdi-circle-edit-outline', onClick: this.editAlias }) - result.push({ label: this.$gettext('Delete'), icon: 'mdi-delete-outline', onClick: this.deleteAlias, color: 'red' }) + result.push({ + label: this.$gettext('Edit'), + icon: 'mdi-circle-edit-outline', + onClick: this.editAlias + }) + result.push({ + label: this.$gettext('Delete'), + icon: 'mdi-delete-outline', + onClick: this.deleteAlias, + color: 'red' + }) } return result }, diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py index 7f943e67f..3f7759f88 100644 --- a/modoboa/admin/api/v2/serializers.py +++ b/modoboa/admin/api/v2/serializers.py @@ -291,7 +291,10 @@ class IdPossibleActionsSerializer(serializers.Serializer): name = serializers.CharField() icon = serializers.CharField() label = serializers.CharField() - body = serializers.DictField() + type = serializers.CharField() + content_type = serializers.CharField(required=False) + url = serializers.CharField(required=False) + filename = serializers.CharField(required=False) class IdentitySerializer(serializers.Serializer): diff --git a/modoboa/pdfcredentials/api/v2/serializers.py b/modoboa/pdfcredentials/api/v2/serializers.py index 8bc0f20e7..7cb219fce 100644 --- a/modoboa/pdfcredentials/api/v2/serializers.py +++ b/modoboa/pdfcredentials/api/v2/serializers.py @@ -66,4 +66,4 @@ class GetAccountCredentialsSerializer(serializers.Serializer): self.context["content"] = decrypt_file(fname) if param_tools.get_global_parameter("delete_first_dl"): os.remove(fname) - self.context["fname"] = fname + self.context["fname"] = os.path.basename(fname) diff --git a/modoboa/pdfcredentials/api/v2/views.py b/modoboa/pdfcredentials/api/v2/views.py index 4dbae2757..08044981d 100644 --- a/modoboa/pdfcredentials/api/v2/views.py +++ b/modoboa/pdfcredentials/api/v2/views.py @@ -1,5 +1,7 @@ """PDF Credentials API v2 views.""" +import os + from django.utils.translation import ugettext as _ from django.http import HttpResponse @@ -26,14 +28,15 @@ class PDFCredentialView(APIView): def get(self, request, *args, **kwargs): """View to download a document.""" data = {"account_id": kwargs["account_id"]} - serializer = GetAccountCredentialsSerializer(data=data, context={'request': request}) + serializer = GetAccountCredentialsSerializer( + data=data, context={'request': request}) serializer.is_valid(raise_exception=True) serializer.save() content = serializer.context["content"] fname = serializer.context["fname"] resp = HttpResponse(content) - resp["Content-Type"] = "application/pdf;base64" + resp["Content-Type"] = "application/pdf" resp["Content-Length"] = len(content) resp["Content-Disposition"] = f"attachment; filename={fname};" return resp diff --git a/modoboa/pdfcredentials/handlers.py b/modoboa/pdfcredentials/handlers.py index ad809b9d2..c364e98e7 100644 --- a/modoboa/pdfcredentials/handlers.py +++ b/modoboa/pdfcredentials/handlers.py @@ -63,9 +63,14 @@ def extra_identities_actions(sender, account, **kwargs): fname = get_creds_filename(account) if not os.path.exists(fname): return [] + url: str = reverse("v2:get-credentials", args=[account.pk]) + url = url.replace("/api/v2", "") return { "name": "get_credentials", - "body": {"type": "pdfcredentials"}, "icon": "mdi-file-download-outline", - "label": _("Download PDF credentials") + "label": _("Download PDF credentials"), + "type": "download", + "content_type": "application/pdf", + "url": url, + "filename": os.path.basename(fname) } From f9f78786c81ffcef2f3cad398bd191d6308e7b61 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 26 Feb 2023 13:51:04 +0100 Subject: [PATCH 21/25] Fixed CI config for coverage --- .github/workflows/modoboa.yml | 2 +- modoboa/pdfcredentials/tests/test_lib.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/modoboa.yml b/.github/workflows/modoboa.yml index 09a60a020..ec33e053e 100644 --- a/.github/workflows/modoboa.yml +++ b/.github/workflows/modoboa.yml @@ -117,7 +117,7 @@ jobs: run: | python ./tests.py cd test_project - coverage run manage.py test modoboa.core modoboa.lib modoboa.admin modoboa.limits modoboa.transport modoboa.relaydomains modoboa.dnstools modoboa.ldapsync modoboa.policyd modoboa.maillog modoboa.parameters modoboa.dmarc + coverage run manage.py test modoboa coverage combine env: # use localhost for the host here because we are running the job on the VM. diff --git a/modoboa/pdfcredentials/tests/test_lib.py b/modoboa/pdfcredentials/tests/test_lib.py index 7e7709b19..87366d542 100644 --- a/modoboa/pdfcredentials/tests/test_lib.py +++ b/modoboa/pdfcredentials/tests/test_lib.py @@ -75,4 +75,3 @@ class PDFCredentialsLibTestCase(ModoAPITestCase): shell=True, stdout=PIPE, stdin=PIPE).communicate(file.read(1024))[0].strip() - From 03cade4e22947681a997772dfb6a4ffb3e0835ca Mon Sep 17 00:00:00 2001 From: Spitap Date: Sun, 26 Feb 2023 13:57:31 +0100 Subject: [PATCH 22/25] Added doc and improved serializer --- doc/features/dmarc.rst | 64 +++++++++++++++++++ doc/features/pdfcredentials.rst | 14 ++++ doc/index.rst | 30 ++++++--- .../components/parameters/ParametersForm.vue | 1 + modoboa/pdfcredentials/api/v2/serializers.py | 13 ++++ 5 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 doc/features/dmarc.rst create mode 100644 doc/features/pdfcredentials.rst diff --git a/doc/features/dmarc.rst b/doc/features/dmarc.rst new file mode 100644 index 000000000..9c2b268ad --- /dev/null +++ b/doc/features/dmarc.rst @@ -0,0 +1,64 @@ +modoboa-dmarc +============= + +.. _dmarcdoc: + +A set of tools to use DMARC through Modoboa. + +This feature is still in BETA stage, for now it only parses XML aggregated +reports and generate visual reports (using c3.js) on a per-domain basis. + +Installation +------------ + +.. note:: + modoboa-installer can automatically set it up for you. + +Make sure to install the following additional system package according to your distribution: + ++-----------------+ +| Debian / Ubuntu | ++=================+ +| libmagic1 | ++-----------------+ + ++------------+ +| CentOS | ++============+ +| file-devel | ++------------+ + + +Integration with Postfix +------------------------ + +A management command is provided to automatically parse DMARC +aggregated reports (rua) and feed the database. The execution of this +command can be automated with the definition of a postfix service and +a custom transport table. + +First, declare a new service in ``/etc/postfix/master.cf``:: + + dmarc-rua-parser unix - n n - - pipe + flags= user=vmail:vmail argv= /manage.py import_aggregated_report --pipe + +Define a new transport table inside ``/etc/postfix/main.cf``:: + + transport_maps = + hash:/etc/postfix/dmarc_transport + # other transport maps... + +Create a file called ``/etc/postfix/dmarc_transport`` with the following content:: + + dmarc-rua-parser: + +.. note:: + You must not declare this email address as an identity (user account or alias), else DMARC reports will be directed to your mailbox and won't be parsed. + +Hash the file using the following command:: + + $ postmap /etc/postfix/dmarc_transport + +Finally, reload postfix:: + + $ service postfix reload diff --git a/doc/features/pdfcredentials.rst b/doc/features/pdfcredentials.rst new file mode 100644 index 000000000..2b897d4a3 --- /dev/null +++ b/doc/features/pdfcredentials.rst @@ -0,0 +1,14 @@ +PDF credentials for Modoboa +=========================== + +.. _pdfc: + +A simple `Modoboa `_ extension which provides a +way to download PDF documents containing users credentials. + + +Configuration +------------- + +All the configuration is done from the admin panel (*Modoboa > +Parameters > PDF Credentials*). diff --git a/doc/index.rst b/doc/index.rst index 1a3a01322..cf037432a 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -16,7 +16,27 @@ Modoboa is a mail hosting and management platform including a modern and simplified Web User Interface designed to work with `Postfix `_ and `Dovecot `_. -It is extensible by nature and comes with a lot of additional extensions: + +It provides built-in features by default : + + ++---------------------------------------------------------+-------------------------+------------------------------------------------------+ +|Name |Description |Documentation | +| | | | +| | | | +| | | | ++=========================================================+=========================+======================================================+ +|modoboa-dmarc |A set of tools to use |:ref:`modoboa_dmarc Documentation ` | +| |`DMARC | | +| |`_ | | ++---------------------------------------------------------+-------------------------+------------------------------------------------------+ +|modoboa-pdfcredentials |Generate PDF documents |:ref:`modoboa_pdfcredentials Documentation ` | +| |containing account | | +| |credentials | | ++---------------------------------------------------------+-------------------------+------------------------------------------------------+ + + +And it is extensible by nature and comes with a lot of additional extensions: +---------------------------------------------------------+-------------------------+------------------------------------------------------+ |Name |Description |Documentation | @@ -29,18 +49,10 @@ It is extensible by nature and comes with a lot of additional extensions: | | | | | | | | +---------------------------------------------------------+-------------------------+------------------------------------------------------+ -|`modoboa-dmarc |A set of tools to use |https://github.com/modoboa/modoboa-dmarc | -|`_ |`DMARC | | -| |`_ | | -+---------------------------------------------------------+-------------------------+------------------------------------------------------+ |`modoboa-imap-migration |Migrate mailboxes from an|https://github.com/modoboa/modoboa-imap-migration | |`_ |existing server using | | | |IMAP (and offlineimap) | | +---------------------------------------------------------+-------------------------+------------------------------------------------------+ -|`modoboa-pdfcredentials |Generate PDF documents |https://github.com/modoboa/modoboa-pdfcredentials | -|`_ |containing account | | -| |credentials | | -+---------------------------------------------------------+-------------------------+------------------------------------------------------+ |`modoboa-pfxadmin-migrate |A tool to migrate from |https://github.com/modoboa/modoboa-pfxadmin-migrate | |`_ |Postfixadmin | | +---------------------------------------------------------+-------------------------+------------------------------------------------------+ diff --git a/frontend/src/components/parameters/ParametersForm.vue b/frontend/src/components/parameters/ParametersForm.vue index 15b4ed460..bc08e8d7b 100644 --- a/frontend/src/components/parameters/ParametersForm.vue +++ b/frontend/src/components/parameters/ParametersForm.vue @@ -133,6 +133,7 @@ export default { return params.filter(param => this.display(param)) }, save () { + this.formErrors = {} parameters.saveApplication(this.$route.params.app, this.parameters).then(() => { bus.$emit('notification', { msg: this.$gettext('Parameters updated') }) }).catch(error => { diff --git a/modoboa/pdfcredentials/api/v2/serializers.py b/modoboa/pdfcredentials/api/v2/serializers.py index 8bc0f20e7..847fde923 100644 --- a/modoboa/pdfcredentials/api/v2/serializers.py +++ b/modoboa/pdfcredentials/api/v2/serializers.py @@ -42,6 +42,19 @@ class PDFCredentialsSettingsSerializer(serializers.Serializer): imap_connection_security = serializers.ChoiceField( choices=CONNECTION_SECURITY_MODES, default="starttls") + def validate_storage_dir(self, value): + """Check that directory exists.""" + if value: + if not os.path.isdir(value): + raise serializers.ValidationError( + _("Directory not found.") + ) + if not os.access(value, os.W_OK): + raise serializers.ValidationError( + _("Directory is not writable") + ) + return value + class GetAccountCredentialsSerializer(serializers.Serializer): """A serializer for get account credential view.""" From 173cea9f28a8a485bfac94238ea8d079a64d0aa3 Mon Sep 17 00:00:00 2001 From: Spitap Date: Sun, 26 Feb 2023 14:35:48 +0100 Subject: [PATCH 23/25] RFC 6266 content disposition --- modoboa/pdfcredentials/api/v2/views.py | 4 +++- modoboa/pdfcredentials/lib.py | 15 +++++++++++++++ requirements.txt | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/modoboa/pdfcredentials/api/v2/views.py b/modoboa/pdfcredentials/api/v2/views.py index 08044981d..d92955ac4 100644 --- a/modoboa/pdfcredentials/api/v2/views.py +++ b/modoboa/pdfcredentials/api/v2/views.py @@ -12,6 +12,8 @@ from modoboa.admin.models import Domain from .serializers import GetAccountCredentialsSerializer +from ...lib import rfc_6266_content_disposition + class PDFCredentialView(APIView): @@ -38,5 +40,5 @@ class PDFCredentialView(APIView): resp = HttpResponse(content) resp["Content-Type"] = "application/pdf" resp["Content-Length"] = len(content) - resp["Content-Disposition"] = f"attachment; filename={fname};" + resp["Content-Disposition"] = rfc_6266_content_disposition(fname) return resp diff --git a/modoboa/pdfcredentials/lib.py b/modoboa/pdfcredentials/lib.py index 6817f0479..69e3d6002 100644 --- a/modoboa/pdfcredentials/lib.py +++ b/modoboa/pdfcredentials/lib.py @@ -7,6 +7,8 @@ import struct from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend +from urllib.parse import quote + from django.conf import settings from django.utils.encoding import force_bytes, smart_bytes from django.utils.translation import ugettext as _ @@ -105,3 +107,16 @@ def get_document_logo(): if not os.path.isfile(logo): return None return logo + + +def rfc_6266_content_disposition(filename): + """Copied from upcoming django 4.2. TBR on release.""" + # TODO : remove me when updating to django 4.2 + try: + filename.encode("ascii") + file_expr = 'filename="{}"'.format( + filename.replace("\\", "\\\\").replace('"', r"\"") + ) + except UnicodeEncodeError: + file_expr = "filename*=utf-8''{}".format(quote(filename)) + return f"attachment; {file_expr}" diff --git a/requirements.txt b/requirements.txt index f2908b35d..617475d6d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -39,6 +39,7 @@ aiosmtplib aioredis==2.0.1 # PDF credentials +urllib reportlab # DMARC From 352ddec0f71c77e674eda31322c7bf663e5dede8 Mon Sep 17 00:00:00 2001 From: Spitap Date: Sun, 26 Feb 2023 14:39:24 +0100 Subject: [PATCH 24/25] Updated translation, noted that urllib is built-in --- frontend/locale/br/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/cs/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/de/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/el/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/en/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/es/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/fi/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/fr/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/it/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/ja/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/nl/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/pl/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/po/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/pt-br/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/pt/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/ru/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/sv/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/tr/LC_MESSAGES/app.po | 23 +++++++++++----------- frontend/locale/zh-hant/LC_MESSAGES/app.po | 23 +++++++++++----------- requirements.txt | 1 - 20 files changed, 209 insertions(+), 229 deletions(-) diff --git a/frontend/locale/br/LC_MESSAGES/app.po b/frontend/locale/br/LC_MESSAGES/app.po index 133985391..c1c1003fa 100644 --- a/frontend/locale/br/LC_MESSAGES/app.po +++ b/frontend/locale/br/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:17+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -414,13 +414,13 @@ msgstr "Kota arloet d'ar boestoù-postel. Gellout a ra bezañ ezpleget e Ko, Mo #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -622,11 +622,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -647,7 +647,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1200,8 +1199,8 @@ msgstr "" msgid "Options" msgstr "Dibarzhioù" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/cs/LC_MESSAGES/app.po b/frontend/locale/cs/LC_MESSAGES/app.po index 7792e3717..66cfbb5ba 100644 --- a/frontend/locale/cs/LC_MESSAGES/app.po +++ b/frontend/locale/cs/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1198,8 +1197,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/de/LC_MESSAGES/app.po b/frontend/locale/de/LC_MESSAGES/app.po index b638e700f..fdc7f082b 100644 --- a/frontend/locale/de/LC_MESSAGES/app.po +++ b/frontend/locale/de/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:17+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "Auf Postfächer angewendete Quota. Kann in KB, MB (Voreinstellung) oder #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1201,8 +1200,8 @@ msgstr "" msgid "Options" msgstr "Optionen" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/el/LC_MESSAGES/app.po b/frontend/locale/el/LC_MESSAGES/app.po index da6d6386d..6382b5252 100644 --- a/frontend/locale/el/LC_MESSAGES/app.po +++ b/frontend/locale/el/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1198,8 +1197,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/en/LC_MESSAGES/app.po b/frontend/locale/en/LC_MESSAGES/app.po index 10fd17dae..0af1798d0 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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en\n" @@ -410,13 +410,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -618,11 +618,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -643,7 +643,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1193,8 +1192,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/es/LC_MESSAGES/app.po b/frontend/locale/es/LC_MESSAGES/app.po index 68f8fc250..361d0eeef 100644 --- a/frontend/locale/es/LC_MESSAGES/app.po +++ b/frontend/locale/es/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún li #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1201,8 +1200,8 @@ msgstr "" msgid "Options" msgstr "Opciones" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/fi/LC_MESSAGES/app.po b/frontend/locale/fi/LC_MESSAGES/app.po index 34a342c06..118444051 100644 --- a/frontend/locale/fi/LC_MESSAGES/app.po +++ b/frontend/locale/fi/LC_MESSAGES/app.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: \n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "Postilaatikoihin sovellettava oletuskiintiö. Voidaan ilmaista kilotavui #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "Poista" @@ -624,11 +624,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "Älä käsittele päällekkäisiä objekteja virheinä" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "Muokkaa" @@ -649,7 +649,6 @@ msgstr "Muokkaa verkkotunnusta" msgid "Edit domain alias" msgstr "Muokkaa verkkotunnusta" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1209,8 +1208,8 @@ msgstr "Avatut hälytykset" msgid "Options" msgstr "Vaihtoehdot" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "Parametrit päivitetty" diff --git a/frontend/locale/fr/LC_MESSAGES/app.po b/frontend/locale/fr/LC_MESSAGES/app.po index 0cc27028d..ef0e75163 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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2021-07-01 16:15+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -422,13 +422,13 @@ msgstr "Quota par défaut appliqué aux boîtes aux lettres. Peut être exprimé #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -631,11 +631,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -656,7 +656,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1216,8 +1215,8 @@ msgstr "" msgid "Options" msgstr "Options" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/it/LC_MESSAGES/app.po b/frontend/locale/it/LC_MESSAGES/app.po index 641910c10..238062141 100644 --- a/frontend/locale/it/LC_MESSAGES/app.po +++ b/frontend/locale/it/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "Valore predefinito per lo spazio massimo confiviso tra le mailbox. Può #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1201,8 +1200,8 @@ msgstr "" msgid "Options" msgstr "Opzioni" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/ja/LC_MESSAGES/app.po b/frontend/locale/ja/LC_MESSAGES/app.po index b88fecccd..00648ac12 100644 --- a/frontend/locale/ja/LC_MESSAGES/app.po +++ b/frontend/locale/ja/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1198,8 +1197,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/nl/LC_MESSAGES/app.po b/frontend/locale/nl/LC_MESSAGES/app.po index 0a16d64de..4bce324a7 100644 --- a/frontend/locale/nl/LC_MESSAGES/app.po +++ b/frontend/locale/nl/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1198,8 +1197,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/pl/LC_MESSAGES/app.po b/frontend/locale/pl/LC_MESSAGES/app.po index 4f175d4c7..6d25b0af9 100644 --- a/frontend/locale/pl/LC_MESSAGES/app.po +++ b/frontend/locale/pl/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1198,8 +1197,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/po/LC_MESSAGES/app.po b/frontend/locale/po/LC_MESSAGES/app.po index 2607ca119..bb4e040d6 100644 --- a/frontend/locale/po/LC_MESSAGES/app.po +++ b/frontend/locale/po/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -414,13 +414,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -622,11 +622,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -647,7 +647,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1197,8 +1196,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/pt-br/LC_MESSAGES/app.po b/frontend/locale/pt-br/LC_MESSAGES/app.po index 5b91cce55..955a608a4 100644 --- a/frontend/locale/pt-br/LC_MESSAGES/app.po +++ b/frontend/locale/pt-br/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -414,13 +414,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -622,11 +622,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -647,7 +647,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1197,8 +1196,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/pt/LC_MESSAGES/app.po b/frontend/locale/pt/LC_MESSAGES/app.po index 1fb2992e3..e5229fc60 100644 --- a/frontend/locale/pt/LC_MESSAGES/app.po +++ b/frontend/locale/pt/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1198,8 +1197,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/ru/LC_MESSAGES/app.po b/frontend/locale/ru/LC_MESSAGES/app.po index b7166a33c..96cba5cab 100644 --- a/frontend/locale/ru/LC_MESSAGES/app.po +++ b/frontend/locale/ru/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1201,8 +1200,8 @@ msgstr "" msgid "Options" msgstr "Опции" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/sv/LC_MESSAGES/app.po b/frontend/locale/sv/LC_MESSAGES/app.po index d231d26dc..b397ca391 100644 --- a/frontend/locale/sv/LC_MESSAGES/app.po +++ b/frontend/locale/sv/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "Standardkvota i MB applicerad på nya brevlådor. 0 betyder ingen kvota. #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1201,8 +1200,8 @@ msgstr "" msgid "Options" msgstr "Inställningar" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/tr/LC_MESSAGES/app.po b/frontend/locale/tr/LC_MESSAGES/app.po index 5a1f3ad56..24e2a9940 100644 --- a/frontend/locale/tr/LC_MESSAGES/app.po +++ b/frontend/locale/tr/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -415,13 +415,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -623,11 +623,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -648,7 +648,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1198,8 +1197,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/frontend/locale/zh-hant/LC_MESSAGES/app.po b/frontend/locale/zh-hant/LC_MESSAGES/app.po index 9b40178fa..54327ee07 100644 --- a/frontend/locale/zh-hant/LC_MESSAGES/app.po +++ b/frontend/locale/zh-hant/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: 2023-02-24 18:00+0100\n" +"POT-Creation-Date: 2023-02-26 14:37+0100\n" "PO-Revision-Date: 2023-02-23 11:26+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -414,13 +414,13 @@ msgstr "" #: src/components/domains/DomainAliasForm.vue:24 #: src/components/domains/DomainList.vue:115 -#: src/components/identities/IdentityList.vue:152 -#: src/components/identities/IdentityList.vue:155 #: src/components/identities/IdentityList.vue:162 +#: src/components/identities/IdentityList.vue:174 +#: src/components/identities/IdentityList.vue:185 #: src/components/domains/DomainList.vue:257 -#: src/components/identities/IdentityList.vue:233 -#: src/components/identities/IdentityList.vue:236 #: src/components/identities/IdentityList.vue:243 +#: src/components/identities/IdentityList.vue:255 +#: src/components/identities/IdentityList.vue:266 msgid "Delete" msgstr "" @@ -622,11 +622,11 @@ msgid "Don't treat duplicated objects as errors" msgstr "" #: src/components/domains/DomainList.vue:114 -#: src/components/identities/IdentityList.vue:151 -#: src/components/identities/IdentityList.vue:154 +#: src/components/identities/IdentityList.vue:157 +#: src/components/identities/IdentityList.vue:169 #: src/components/domains/DomainList.vue:256 -#: src/components/identities/IdentityList.vue:232 -#: src/components/identities/IdentityList.vue:235 +#: src/components/identities/IdentityList.vue:238 +#: src/components/identities/IdentityList.vue:250 msgid "Edit" msgstr "" @@ -647,7 +647,6 @@ msgstr "" msgid "Edit domain alias" msgstr "" -#: src/components/identities/IdentityList.vue:132 #: src/views/user/PasswordRecoveryChangeForm.vue:59 msgid "element" msgstr "" @@ -1197,8 +1196,8 @@ msgstr "" msgid "Options" msgstr "" -#: src/components/parameters/ParametersForm.vue:60 -#: src/components/parameters/ParametersForm.vue:137 +#: src/components/parameters/ParametersForm.vue:61 +#: src/components/parameters/ParametersForm.vue:138 msgid "Parameters updated" msgstr "" diff --git a/requirements.txt b/requirements.txt index 617475d6d..f2908b35d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -39,7 +39,6 @@ aiosmtplib aioredis==2.0.1 # PDF credentials -urllib reportlab # DMARC From d83bc0c6ded001e34c3f441130c9946196f3d8b1 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 27 Feb 2023 09:45:03 +0100 Subject: [PATCH 25/25] Updated PDF logo --- modoboa/pdfcredentials/lib.py | 2 +- modoboa/static/css/modoboa-new.png | Bin 0 -> 6798 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 modoboa/static/css/modoboa-new.png diff --git a/modoboa/pdfcredentials/lib.py b/modoboa/pdfcredentials/lib.py index 69e3d6002..2fdeeb8fc 100644 --- a/modoboa/pdfcredentials/lib.py +++ b/modoboa/pdfcredentials/lib.py @@ -103,7 +103,7 @@ def get_document_logo(): logo = settings.MODOBOA_CUSTOM_LOGO logo = os.path.join(settings.MEDIA_ROOT, os.path.basename(logo)) except AttributeError: - logo = os.path.join(settings.STATIC_ROOT, "css/modoboa.png") + logo = os.path.join(settings.STATIC_ROOT, "css/modoboa-new.png") if not os.path.isfile(logo): return None return logo diff --git a/modoboa/static/css/modoboa-new.png b/modoboa/static/css/modoboa-new.png new file mode 100644 index 0000000000000000000000000000000000000000..89462d7034afe8f31eb5c7a753f72a1cff70a479 GIT binary patch literal 6798 zcmd6r^;cBiyT^x+5CH)RNfG>jFgl>pr6NcpNK3=eBQSJ_2+|GGpwbQF&>_u?QbP|R zHFU!eL)_u}xp%GmAKbftIA^c5pLjoepY^PLUg7W5-csIXz6}5XC>0gnXaWF)dieQo zG7|i=l4>>=|GMugr|0_K(aP1s3 z>8;sUP_$@kuQPXYH#+*9_YLLF{UZV zY9dlsD7NZ)%Zxwal$1Q~!SSV5@yK&$l^{Sk2LbJi8zuj*2llM}DcLTHBOvBbrsqHg zd2Q6UYyr96HMvf#nE(JDm@Y^uL?6f$oLMIX3{ZzWE`R8H*(W3Hl<&2Nm_z~qcdOJm zwTu+L@&#)v2%Abx4JC(_^I)X`0OB&v&wMNetr!lL3VAla=<<;AFiD3;qxjPzE|U%| zi6<^eE|%G5R7weGUCB{phr>r1{@oAsQdrOYjsL+SMH7X6!m!NmL$2FDH^pu5a0P0uc(;%)(6GI6Mj8cw}C zh6XPn6w*w<9QaclRD%*L2Y+U3V9xTqMAMYr2c?n#+A9-Temyk2jGiS0ok^$F@&f>S zt3Twc$aLQt9fWY=O9FNzo2W1n0$#R5Z|hnd`pZfzMBJos`qW0MoMP_DZCKn~ZVAHO zxzR#Z6ZxfvH7I*l_hbwI@sR2H_?<7QH;Lmi?cCktcbiz;i2#7(J6Lw$N4t~7C|osQ z)n#z9IX06K6kT^B?2nAi&!C$og_r5(AMW<-MLfM*MdA{ev%$A5oqtBYA2kao8k7)z z*UVmDg(vPXf#=d$uQ?B^;#L9-5tjrf zhTyA?ot#HpIsm}w{(jPJBy7Q0h4g0s4rpN?f8$_g&<;08y8nqlD{1zw&{h37cwEkiC4FKe@Jv>M?(EL4JS*(V%RW-{Z{)Kf$nx+kA#eSE_ty z^g9o{@5cMSnyhivxp>HLoa!Dbh<=!)?@?vT*(1GjyYXYat8Kn(sgj{-rys5lIhtB{ zjT;_Te!9OKGN>Z$cp`xi9CBIK2^+!7LI)O!|(Qb{%3vU_LJmi zU_a*BC&~FXj@=DYN5w!1h=Yl~=2PPN<11}3C=|vv(V2~ zoE+L#+i)`UZL8zfFH^AE6^wtx_!Da;ZFhNcvhtcg?M$0)6 zQqBw@$L$q~F>Y?jbf;3q>+(Z~h0jZoL;TywB#bUK!7yAFXVm64=B%J!AvqfG4^DcW z&s0nWVt?;A!CPEiloS}t__H_(j9L)GC~f4gJLf3qXN&V8e`qmqK(_MKxzNOAC-QrZ zF7K>*mQ-h;?MJrL0)p&?MAT($R)wnmoB9&uZ0=X$@soQ~i`d|hvUd9(FUo6#>CXd0 z2HdQ5Q?LG7pf+=L4vDzOi*)iLx~d;4ploD9f9o7mZPImDg(bRv9^)kj4 zP9A%wg=XPi-gf+c4;#I6a1uS47@c|dsp`zGFtDK5D!bxMuRDj5!sKi$m)K)$e%3vd z>vslW5zuy>Fx+GJ@biqj30tv;$yVQ9X_Nsm<=ENkqj&FE(^B5nJ!)Zm{chbuo6Ur+z2J70 z&Zq)0eq3RSi_A)8Ajzdc4Ltsdrd``7qtAZp>#eoLDh(C)c%lxaU)&{+bW>C4R{eub z{Hc}NU8rUx?R}g3drGOzQ{7drShtT7%{VFq?YBz?lrQQ#V8accVK|nhvXU8UqXLLG9bge+m-nP*#}rpTHL6#pm22 z!B{Cay_2gT4eC%2T?AdPPVm6iP$vx(G#5SUfuiDkzAK^tig5rX^9adExGw8fa6ZB} z*(a9$ePhk}yG=p_j*MS&m+Wha91h`;UWtbR+zSZhKJjW{`F5xSD~cp}-Dld#wnLqz zVB|3_lM42pT6Kqm>FtcPJYoRu$-LE{*Sbwaok4Q!S>X4u=qRpRehR)yg|pFoZV0A5 z0_6kUi3gYKi*sJy9?EqMqYa~t=2y!gfdrckFTFbM1(25b3nIDbnk>uEEyq^X8SS}IiE zpFcU@GtdsQF&p8e%kx#iXifxT;e#0Y5iM2cId8)6-K6rVmw&e|bk{k4q+#C&wS-QF zUR{o7x8@A?hC5p5XEH`2>L}Fnj(vPKQIctf_EiB@RA=vpoy+x?qRuLEO3FaG*salLoiWS)WV zEkukos-!z~hlwHD$Mq2L^MBmFw*+uQ8c)lKgH=&A$}AJ1TRckw`TEY1hT@qvyU7rr zox2Lc2YauRB3V<6mzJS1dLj<*?Ry6Cq^B?jh;jM5^K+ z>wZ-D6&sy0T8lk3emubQ9{dH=p}knl`XLMl`pLOBy(V7~8E>2eaS%=tcE3%)&+Vgq zxM5$UDF!*kK35_2&RhTCe=1JSSNY5@%k_P?O=m;cz(aBxg=L({`Pzl$(JPd`gL#Xt zleOim+8+wT;f_)h$nmweOqJ#`1fn5j)#mq03VaFK_o63f^qj<*Z3MgUCiJ)7WKMTH*(b06W3VO(vc5fro# z79=4)VMF(NxDBCB0R86SX}YkAlE~FrHWe(dA4yMMq+F*s8aC9k zI$%?=#YVifaOitPzIT6ASfMu8 z!MoMTxPg|EPwKL&A~D4)idl_z`{RM;KE>at*N+cg6PIBO(u6I=?^2>;3;tYenYzBBV|8bwA15y3 zkSfV8IdB!CO}(>rcL=sUJJ4)*WQiV6O1D6>9~V`iLh*V^zelVu@{Ovo%$;QlN7;xw z?UIMCjj$wsi7g)O^w@Plmu#nch`UA#FBl(h74%#Q z<^~F}ziY8U)I{f2kn8zfE=pw(7G(-2$vuEn85|cG5|^2cY3t_sGv{WxRr@N@7GDKJVuu?AD?MFH_duG zIe>lAaMxb1%-~E$V|?tR9=9b;RVK6Q?=9FugkS6z!f}Oy67ST{O;)6s#qN6!^ z^N>~VH@*PvNN_dVd=W$xmr; zwNfOM*X#thbs5gh7n4J&NfF=f8+r08E5CA{*{dIJK6R(}hQ0A``{#ny=j=#+f43J( zZD*5yE`v39Qf*O@RWC>GdrnkE`$gtO(^Q?W1ld{U$f~*|u!S}Ad8~CMM#O8X>KAZI zK+`rx438c8vX^IgMeYMH5W9X_7i+`0Pgh2htm#iL%RLZxueTNSX(4gctSURnoL6}d zeQmSb{VYr30<~Kcz>OtRD%4nXk~wrNgMcGnv(6^->yS^@T}4j?U|X(%aXB zER#Eu|5=;dt@OX4y{El~mq`uo_FM zAm@i!XE3vtNz+5SBMQ|yaiBmMWmNatpiyVzV+P3h+{+w3`O4cAD}(ew`;B-zu)HyA z$5^6O_?_aW552onksRi)%JCFy|47#9~QjPz~5Dl3tx6pSGqYbN(9JjR)z;wR5{gCHM zx8y}pt@KR5BObJNw<1P1w(i7mIDRt5serY`vuvM!tNS4JtFN}QN3F;BAB>EvNPiCWTMiNykK3i zi%G6&9=EZ81F2&mzppYJaaa%Zsv4nAZA>q?mHDGqmM}r73_+=x06Ax(ny*CQl1y?; zUHs8Ca;KA0KQbmZ4BSW4czO<7 z{6@mvhpj|fJI1o91U7k(q`iR3G&PN6?aCbZ2$p_34+L6ghjzTL_2l#uVy2l0O2gPb zpI6(g5!zGduyUJTxN&e4**lntDZ-WPF z@|R#_5t}c;V)lZ+85y}U*z2kj#YL!{iA&dbX&ZlINL|0sy{8ySp*|>4oALN?F}#Ok zl^Rwmq^Ti-;g$|}C@TpDh{9c&Ip6*i(M&092UlmEf&UKasW=*kl0`_Y=qt}U5JJ8& zdC9o=byQe=m7$niz4u+GHjc4L0s`!k8%Jdi8UM^`HJZ8plbihz7`bN~+gg07=gxiX z$nlDu<8G96gRW^&*7n%?7ZEbF=dzwKlqY7cp? zI?XTJQ;81Mm^kH0zVYiR*I`9gG0;7GDqCbtGW@Wm6fa7G7qLVOM}YeuK1LR4r4-BF z9f&vxVOMm$6O9KzF=qTvZq2=@sj06(C8td587$2-?0e0#67Z`m)j$8p53&GI`dAZV zJk}osgi=M1c&SHd#KdLk7Rxd#^PrS^O$^>S`98>SX!zFEjX1X*Xy`&qD64gx*i!IUHnMf6FUM|z_u?L365>6Y< zQdU%e_TqEThbvLw_@+q+x$X@W)#4U#Z7}6nxD5!TJ6K4%jsDe?dd^V6v_b?343z6T zupCciF(Ck~eTpsA`KvI;MW1*JZ;NL&nRdTcs^3W@xFOUTvEJo)IBR~quSH?(y}yPE z-y!Uv2LOV6O&Ob`t)@OJ?5Y*@ebQ67cY~8JI5&r&mmzqEzsp=rf3s#TKF)t>Wp@(1 z5d;gQDU-5%fmFM%MydtGWtTp;V*~{5G5wnEjImnb@F8ku+wKp&Tk#u5c?kgI-ik7P z?0dd6=ylbLI6Axn8qeWTF9H8Xu3P-IGx+?un~m(4^^Fuf7$+`wzIsao@1Y6fp97KI z5bFuEO~Wg0LjpW<3|?&q=e*3sk;(#d<3?F9Hu zaU03ol(~@~8s=6N`pM}Aep9fQ|GS-kWBuCxCd}fIHUY&|2R+D<1n+T6o%TN(fTtD{ z^^KMyfSZJEPTj~10z85Ll^FGJjH}6aZi@AIY8!YfU?Jj!;)cr--fT7@!y@d#zcS~Y zj=Mer{xz}d{C6hv@qgu}Y$CXExcL0vMN(u-(p21l{$CtTcZmLtCK>uai#KHilHob{ kAdL^+@BefNXkCNa0nA68T_c;$+BZ@Z<<#C(yfzK~FGO>{-v9sr literal 0 HcmV?d00001