From c44800a045b661b0f98652ba1567c40b232d1adc Mon Sep 17 00:00:00 2001 From: Gael Pasgrimaud Date: Mon, 19 Sep 2016 13:02:34 +0200 Subject: [PATCH 01/40] improve mx search --- .../management/commands/subcommands/_mx.py | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index 935933f7f..a3b874d1d 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -57,6 +57,9 @@ class CheckMXRecords(BaseCommand): "--skip-admin-emails", action="store_true", default=False, help="Skip domain's admins email notification.") + parser.add_argument( + "--domain", type=str, action="append", default=[], + help="Domain name or id to update.") parser.add_argument( "--timeout", type=int, default=3, help="Timeout used for queries.") @@ -86,22 +89,22 @@ class CheckMXRecords(BaseCommand): delta = timedelta(seconds=ttl) for answer in answers: - address = None try: - ipaddress.ip_address(str(answer.exchange)) - except ValueError: - try: - address = socket.gethostbyname(str(answer.exchange)) - except socket.gaierror: - pass + # work if .exchange is a name or IP + address = socket.gethostbyname(str(answer.exchange)) + except socket.gaierror: + pass else: - address = str(answer.exchange) - finally: - if address is not None: + try: + # we must have a valid IP + address = ipaddress.ip_address(u'{}'.format(address)) + except ValueError: + pass + else: record = models.MXRecord.objects.create( domain=domain, - name=str(answer.exchange).strip("."), - address=address, + name=u'{}'.format(str(answer.exchange).strip(".")), + address=u'{}'.format(address), updated=now + delta) yield record @@ -237,5 +240,17 @@ class CheckMXRecords(BaseCommand): models.DNSBLResult.objects.exclude( provider__in=self.providers).delete() - for domain in models.Domain.objects.filter(enabled=True): + if options['domain']: + domains = [] + for domain in options['domain']: + if domain.isdigit(): + domains.append(models.Domain.objects.get(domain)) + else: + domains.append(models.Domain.objects.filter(name=domain)) + else: + domains = models.Domain.objects.filter(enabled=True) + + options.pop('domain') + + for domain in domains: self.check_domain(domain, **options) From 9d4d515bfb4eaa151a44f898572284183f146f77 Mon Sep 17 00:00:00 2001 From: Gael Pasgrimaud Date: Mon, 19 Sep 2016 14:27:21 +0200 Subject: [PATCH 02/40] update post_save hook --- modoboa/admin/handlers.py | 10 ++++++++-- modoboa/admin/management/commands/subcommands/_mx.py | 7 +++++-- modoboa/admin/tests/test_mx.py | 2 ++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/modoboa/admin/handlers.py b/modoboa/admin/handlers.py index cc0f679b1..cccff63e6 100644 --- a/modoboa/admin/handlers.py +++ b/modoboa/admin/handlers.py @@ -1,5 +1,6 @@ """Django signal handlers for admin.""" +from django.core import management from django.db.models import signals from django.dispatch import receiver @@ -7,9 +8,14 @@ from . import models @receiver(signals.post_save, sender=models.Domain) -def update_domain_mailboxes(sender, instance, **kwargs): - """Update associated mailboxes.""" +def update_domain_mxs_and_mailboxes(sender, instance, **kwargs): + """Update associated MXs and mailboxes.""" if kwargs.get("created"): + management.call_command( + 'modo', 'check_mx', + domain=[instance], + skip_admin_emails=True, + ) return instance.mailbox_set.filter(use_domain_quota=True).update( quota=instance.quota) diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index a3b874d1d..483ca4c16 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -83,7 +83,8 @@ class CheckMXRecords(BaseCommand): models.MXRecord.objects.filter(domain=domain).delete() try: answers = dns.resolver.query(domain.name, "MX") - except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN): + except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN, + dns.resolver.NoNameservers): raise StopIteration() delta = timedelta(seconds=ttl) @@ -243,7 +244,9 @@ class CheckMXRecords(BaseCommand): if options['domain']: domains = [] for domain in options['domain']: - if domain.isdigit(): + if isinstance(domain, models.Domain): + domains.append(domain) + elif domain.isdigit(): domains.append(models.Domain.objects.get(domain)) else: domains.append(models.Domain.objects.filter(name=domain)) diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index 7b958aa71..73812a7a4 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -21,6 +21,7 @@ class MXTestCase(ModoTestCase): cls.domain = factories.DomainFactory(name="modoboa.org") factories.DomainFactory(name="pouet.com") # should not exist parameters.save_admin('VALID_MXS', '127.0.0.1', app='admin') + models.MXRecord.objects.all().delete() def test_management_command(self): """Check that command works fine.""" @@ -53,6 +54,7 @@ class DNSBLTestCase(ModoTestCase): super(DNSBLTestCase, cls).setUpTestData() cls.domain = factories.DomainFactory(name="modoboa.org") factories.DomainFactory(name="pouet.com") # should not exist + models.DNSBLResult.objects.all().delete() @override_settings(DNSBL_PROVIDERS=["zen.spamhaus.org"]) def test_management_command(self): From e0f2f345232734c699cb19a9f86708e74b7ddafe Mon Sep 17 00:00:00 2001 From: Gael Pasgrimaud Date: Mon, 19 Sep 2016 15:37:37 +0200 Subject: [PATCH 03/40] take care of creation date while showing DNS status --- modoboa/admin/handlers.py | 6 ------ modoboa/admin/models/domain.py | 17 +++++++++++++++-- .../admin/templates/admin/domain_detail.html | 14 +++++++++----- .../admin/templates/admin/domains_table.html | 14 +++++++++----- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/modoboa/admin/handlers.py b/modoboa/admin/handlers.py index cccff63e6..b6fbae762 100644 --- a/modoboa/admin/handlers.py +++ b/modoboa/admin/handlers.py @@ -1,6 +1,5 @@ """Django signal handlers for admin.""" -from django.core import management from django.db.models import signals from django.dispatch import receiver @@ -11,11 +10,6 @@ from . import models def update_domain_mxs_and_mailboxes(sender, instance, **kwargs): """Update associated MXs and mailboxes.""" if kwargs.get("created"): - management.call_command( - 'modo', 'check_mx', - domain=[instance], - skip_admin_emails=True, - ) return instance.mailbox_set.filter(use_domain_quota=True).update( quota=instance.quota) diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index d90b00099..eb89380e6 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -1,7 +1,10 @@ """Models related to domains management.""" +import datetime + from django.db import models from django.db.models.manager import Manager +from django.utils import timezone from django.utils.encoding import python_2_unicode_compatible, smart_text from django.utils.functional import cached_property from django.utils.translation import ugettext as _, ugettext_lazy @@ -103,8 +106,18 @@ class Domain(AdminObject): return self.domainalias_set @property - def mx_records(self): - self.mxrecord_set + def just_created(self): + """return true if the domain was created in the latest 24h""" + now = timezone.now() + delta = datetime.timedelta(days=1) + return bool(self.creation + delta > now) + + def awaiting_checks(self): + """return true if the domain has no valid MX records and was created + in the latest 24h""" + if (not self.mxrecord_set.has_valids()) and self.just_created: + return True + return False @cached_property def dnsbl_status_color(self): diff --git a/modoboa/admin/templates/admin/domain_detail.html b/modoboa/admin/templates/admin/domain_detail.html index ab79891ad..578f48fd9 100644 --- a/modoboa/admin/templates/admin/domain_detail.html +++ b/modoboa/admin/templates/admin/domain_detail.html @@ -24,11 +24,15 @@ {% if enable_mx_checks == "yes" or enable_dnsbl_checks == "yes" %}
{% trans "DNS status" %} - {% if enable_mx_checks == "yes" %} - MX - {% endif %} - {% if enable_dnsbl_checks == "yes" %} - DNSBL + {% if domain.awaiting_checks %} + {% trans "Awaiting checks" %} + {% else %} + {% if enable_mx_checks == "yes" %} + MX + {% endif %} + {% if enable_dnsbl_checks == "yes" %} + DNSBL + {% endif %} {% endif %}
{% endif %} diff --git a/modoboa/admin/templates/admin/domains_table.html b/modoboa/admin/templates/admin/domains_table.html index da4587af4..84086aec8 100644 --- a/modoboa/admin/templates/admin/domains_table.html +++ b/modoboa/admin/templates/admin/domains_table.html @@ -8,11 +8,15 @@ {% if enable_mx_checks == "yes" or enable_dnsbl_checks == "yes" %} - {% if enable_mx_checks == "yes" %} - MX - {% endif %} - {% if enable_dnsbl_checks == "yes" %} - DNSBL + {% if domain.awaiting_checks %} + {% trans "awaiting checks" %} + {% else %} + {% if enable_mx_checks == "yes" %} + MX + {% endif %} + {% if enable_dnsbl_checks == "yes" %} + DNSBL + {% endif %} {% endif %} From 0d83741a3d868f97b59a6b234a8906520bccf05f Mon Sep 17 00:00:00 2001 From: Gael Pasgrimaud Date: Mon, 19 Sep 2016 18:05:41 +0200 Subject: [PATCH 04/40] typo --- modoboa/admin/templates/admin/domains_table.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/admin/templates/admin/domains_table.html b/modoboa/admin/templates/admin/domains_table.html index 84086aec8..5278c1829 100644 --- a/modoboa/admin/templates/admin/domains_table.html +++ b/modoboa/admin/templates/admin/domains_table.html @@ -9,7 +9,7 @@ {% if domain.awaiting_checks %} - {% trans "awaiting checks" %} + {% trans "Awaiting checks" %} {% else %} {% if enable_mx_checks == "yes" %} MX From 2e1515f855476e42efdbb0f67ff98bd9d5372b1c Mon Sep 17 00:00:00 2001 From: Gael Pasgrimaud Date: Mon, 19 Sep 2016 18:06:10 +0200 Subject: [PATCH 05/40] remove bool even if I like it --- modoboa/admin/models/domain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index eb89380e6..12ea14b0b 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -110,7 +110,7 @@ class Domain(AdminObject): """return true if the domain was created in the latest 24h""" now = timezone.now() delta = datetime.timedelta(days=1) - return bool(self.creation + delta > now) + return self.creation + delta > now def awaiting_checks(self): """return true if the domain has no valid MX records and was created From d4a736dba28599d7f184a9f1b5f58f6f0e151911 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 22 Sep 2016 10:26:11 +0200 Subject: [PATCH 06/40] Fixes about Resellers permissions. --- modoboa/admin/callbacks.py | 6 +-- modoboa/admin/forms/account.py | 35 +++++++------- modoboa/admin/forms/domain.py | 4 +- modoboa/admin/models/mailbox.py | 2 +- modoboa/admin/serializers.py | 2 +- .../templates/admin/domain_statistics.html | 2 +- modoboa/admin/tests/test_account.py | 48 ++++++++++++++----- modoboa/admin/tests/test_alias.py | 6 +-- modoboa/admin/tests/test_import_.py | 4 +- modoboa/admin/views/domain.py | 2 +- modoboa/core/factories.py | 4 +- modoboa/core/models.py | 27 +++-------- modoboa/core/templates/core/information.html | 4 +- modoboa/core/tests.py | 2 +- modoboa/limits/controls.py | 8 ++-- modoboa/limits/forms.py | 2 +- modoboa/limits/general_callbacks.py | 19 ++++---- modoboa/limits/tests/test_domain_limits.py | 4 +- modoboa/limits/tests/test_user_limits.py | 10 ++-- 19 files changed, 104 insertions(+), 87 deletions(-) diff --git a/modoboa/admin/callbacks.py b/modoboa/admin/callbacks.py index 163bf49aa..f65df4147 100644 --- a/modoboa/admin/callbacks.py +++ b/modoboa/admin/callbacks.py @@ -85,7 +85,7 @@ def grant_access_to_all_objects(user, role): def export_admin_domains(admin): result = [admin.mailbox.quota] \ if hasattr(admin, "mailbox") else [""] - if admin.group != "DomainAdmins": + if admin.role != "DomainAdmins": return result return result + [dom.name for dom in Domain.objects.get_for_admin(admin)] @@ -139,7 +139,7 @@ def import_account_mailbox(user, account, row): quota, override_rules=user.has_perm("admin.change_domain") ) mb.save(creator=user) - if account.group == "DomainAdmins": + if account.role == "DomainAdmins": for domname in row[2:]: try: dom = Domain.objects.get(name=domname.strip()) @@ -157,7 +157,7 @@ def account_auto_created(user): if parameters.get_admin("AUTO_CREATE_DOMAIN_AND_MAILBOX") == "no": return localpart, domname = split_mailbox(user.username) - if user.group != 'SimpleUsers' and domname is None: + if user.role != 'SimpleUsers' and domname is None: return sadmins = User.objects.filter(is_superuser=True) try: diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index cbcbbf587..e732d95aa 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -38,7 +38,7 @@ class AccountFormGeneral(forms.ModelForm): ) role = forms.ChoiceField( label=ugettext_lazy("Role"), - choices=[('', ugettext_lazy("Choose"))], + choices=[("", ugettext_lazy("Choose"))], help_text=ugettext_lazy("What level of permission this user will have") ) password1 = PasswordField( @@ -69,17 +69,17 @@ class AccountFormGeneral(forms.ModelForm): ) self.fields["is_active"].label = _("Enabled") self.user = user - if user.group == "DomainAdmins": + if user.role in ["Resellers", "DomainAdmins"]: self.fields["role"] = forms.CharField( label="", widget=forms.HiddenInput(attrs={"class": "form-control"}), required=False ) else: - self.fields["role"].choices = [('', ugettext_lazy("Choose"))] - self.fields["role"].choices += \ - get_account_roles(user, kwargs['instance']) \ - if 'instance' in kwargs else get_account_roles(user) + self.fields["role"].choices += ( + get_account_roles(user, kwargs["instance"]) + if "instance" in kwargs else get_account_roles(user) + ) if not user.is_superuser: del self.fields["master_user"] @@ -91,7 +91,7 @@ class AccountFormGeneral(forms.ModelForm): not account.mailbox.domain.enabled ) if domain_disabled: - self.fields["is_active"].widget.attrs['disabled'] = "disabled" + self.fields["is_active"].widget.attrs["disabled"] = "disabled" if args: if args[0].get("password1", "") == "" \ and args[0].get("password2", "") == "": @@ -99,7 +99,7 @@ class AccountFormGeneral(forms.ModelForm): self.fields["password2"].required = False if domain_disabled: del self.fields["is_active"] - self.fields["role"].initial = account.group + self.fields["role"].initial = account.role if not account.is_local \ and parameters.get_admin( "LDAP_AUTH_METHOD", app="core") == "directbind": @@ -118,10 +118,12 @@ class AccountFormGeneral(forms.ModelForm): return not self.instance.mailbox.domain.enabled def clean_role(self): - if self.user.group == "DomainAdmins": + if self.user.role == "DomainAdmins": if self.instance == self.user: return "DomainAdmins" return "SimpleUsers" + elif self.user.role == "Resellers" and self.instance == self.user: + return "Resellers" return self.cleaned_data["role"] def clean_username(self): @@ -459,10 +461,12 @@ class AccountForm(TabForms): }) def check_perms(self, account): - if account.is_superuser: - return False - return self.user.has_perm("admin.add_domain") \ - and account.has_perm("core.add_user") + """Check if perms form must displayed or not.""" + return ( + self.user.is_superuser and + not account.is_superuser and + account.has_perm("core.add_user") + ) def _before_is_valid(self, form): if form["id"] == "general": @@ -480,9 +484,8 @@ class AccountForm(TabForms): return True def is_valid(self): - """Two steps validation. - """ - self.instances["general"].oldgroup = self.instances["general"].group + """Two steps validation.""" + self.instances["general"].oldgroup = self.instances["general"].role if super(AccountForm, self).is_valid(mandatory_only=True): self.account = self.forms[0]["instance"].save() return super(AccountForm, self).is_valid(optional_only=True) diff --git a/modoboa/admin/forms/domain.py b/modoboa/admin/forms/domain.py index c74b45c3d..f124158a5 100644 --- a/modoboa/admin/forms/domain.py +++ b/modoboa/admin/forms/domain.py @@ -8,7 +8,7 @@ from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.core.models import User from modoboa.core import signals as core_signals from modoboa.lib import events, parameters -from modoboa.lib.exceptions import ModoboaException, Conflict +from modoboa.lib.exceptions import Conflict from modoboa.lib.fields import DomainNameField from modoboa.lib.form_utils import ( YesNoField, WizardForm, WizardStep, DynamicForm, TabForms @@ -282,7 +282,7 @@ class DomainForm(TabForms): domadmins = [u for u in self.domain.admins if self.request.user.can_access(u) and not u.is_superuser] if not self.request.user.is_superuser: - domadmins = [u for u in domadmins if u.group == "DomainAdmins"] + domadmins = [u for u in domadmins if u.role == "DomainAdmins"] context.update({ "title": self.domain.name, "action": reverse( diff --git a/modoboa/admin/models/mailbox.py b/modoboa/admin/models/mailbox.py index 3c44842cb..6ed568c83 100644 --- a/modoboa/admin/models/mailbox.py +++ b/modoboa/admin/models/mailbox.py @@ -283,7 +283,7 @@ class Mailbox(AdminObject): newaddress = None if values["email"] != self.full_address: newaddress = values["email"] - elif (self.user.group == "SimpleUsers" and + elif (self.user.role == "SimpleUsers" and self.user.username != self.full_address): newaddress = self.user.username if newaddress is not None: diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index 47de388b0..8a842f5ae 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -102,7 +102,7 @@ class AccountSerializer(serializers.ModelSerializer): def get_role(self, account): """Return role.""" - return account.group + return account.role def get_domains(self, account): """Return domains administered by this account.""" diff --git a/modoboa/admin/templates/admin/domain_statistics.html b/modoboa/admin/templates/admin/domain_statistics.html index 1123c93bf..08eceb08c 100644 --- a/modoboa/admin/templates/admin/domain_statistics.html +++ b/modoboa/admin/templates/admin/domain_statistics.html @@ -16,7 +16,7 @@
- {% if user.group == "SuperAdmins" %} + {% if user.role == "SuperAdmins" %}

{% trans "Global counters" %}

diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py index b78856f1b..def372820 100644 --- a/modoboa/admin/tests/test_account.py +++ b/modoboa/admin/tests/test_account.py @@ -5,8 +5,9 @@ from unittest import skipIf from django.core.urlresolvers import reverse from django.test import override_settings -from modoboa.core.models import User +from modoboa.core import factories as core_factories from modoboa.core import tests as core_tests +from modoboa.core.models import User from modoboa.lib import parameters from modoboa.lib.tests import ModoTestCase from modoboa.lib.tests import NO_LDAP @@ -233,7 +234,9 @@ class PermissionsTestCase(ModoTestCase): app="limits" ) factories.populate_database() - cls.user = User.objects.get(username='user@test.com') + cls.reseller = core_factories.UserFactory(username="reseller") + cls.reseller.role = "Resellers" + cls.user = User.objects.get(username="user@test.com") cls.values = dict( username=cls.user.username, role="DomainAdmins", is_active=cls.user.is_active, email="user@test.com", @@ -248,14 +251,15 @@ class PermissionsTestCase(ModoTestCase): reverse("admin:account_change", args=[self.user.id]), self.values ) - self.assertEqual(self.user.group, "DomainAdmins") + self.assertEqual(self.user.role, "DomainAdmins") self.values["role"] = "SimpleUsers" self.ajax_post( reverse("admin:account_change", args=[self.user.id]), self.values ) - self.assertNotEqual(self.user.group, 'DomainAdmins') + self.assertNotEqual( + self.user.groups.first().name, "DomainAdmins") def test_superusers(self): self.values["role"] = "SuperAdmins" @@ -281,16 +285,16 @@ class PermissionsTestCase(ModoTestCase): self.client.login(username="admin@test.com", password="toto") ) admin = User.objects.get(username="admin@test.com") - values = dict( - username="admin@test.com", first_name="Admin", - password1="", password2="", - quota=10, is_active=True, email="admin@test.com" - ) + values = { + "username": "admin@test.com", "first_name": "Admin", + "password1": "", "password2": "", + "quota": 10, "is_active": True, "email": "admin@test.com" + } self.ajax_post( reverse("admin:account_change", args=[admin.id]), values ) - self.assertEqual(admin.group, "DomainAdmins") + self.assertEqual(admin.role, "DomainAdmins") self.assertTrue(admin.can_access( models.Domain.objects.get(name="test.com"))) @@ -299,8 +303,28 @@ class PermissionsTestCase(ModoTestCase): reverse("admin:account_change", args=[admin.id]), values ) - admin = User.objects.get(username="admin@test.com") - self.assertEqual(admin.group, "DomainAdmins") + admin.refresh_from_db() + self.assertEqual(admin.role, "DomainAdmins") + + self.client.logout() + self.client.login(username=self.reseller.username, password="toto") + self.assertTrue(self.reseller.can_access(self.reseller)) + values = { + "username": self.reseller.username, "first_name": "Reseller", + "password1": "", "password2": "", + "is_active": True + } + self.ajax_post( + reverse("admin:account_change", args=[self.reseller.pk]), + values + ) + self.assertEqual(self.reseller.role, "Resellers") + values["role"] = "SuperAdmins" + self.ajax_post( + reverse("admin:account_change", args=[self.reseller.pk]), + values + ) + self.assertEqual(self.reseller.role, "Resellers") def test_domadmin_access(self): self.client.logout() diff --git a/modoboa/admin/tests/test_alias.py b/modoboa/admin/tests/test_alias.py index eb501114b..567c01728 100644 --- a/modoboa/admin/tests/test_alias.py +++ b/modoboa/admin/tests/test_alias.py @@ -22,7 +22,7 @@ class AliasTestCase(ModoTestCase): def test_alias(self): user = User.objects.get(username="user@test.com") values = dict( - username="user@test.com", role=user.group, + username="user@test.com", role=user.role, is_active=user.is_active, email="user@test.com", aliases="toto@test.com", aliases_1="titi@test.com" ) @@ -64,7 +64,7 @@ class AliasTestCase(ModoTestCase): """Try to create an upper case alias.""" user = User.objects.get(username="user@test.com") values = dict( - username="user@test.com", role=user.group, + username="user@test.com", role=user.role, is_active=user.is_active, email="user@test.com", aliases="Toto@test.com" ) @@ -94,7 +94,7 @@ class AliasTestCase(ModoTestCase): """Try to create a alias with tag in recipient address""" user = User.objects.get(username="user@test.com") values = dict( - username="user@test.com", role=user.group, + username="user@test.com", role=user.role, is_active=user.is_active, email="user@test.com" ) self.ajax_post( diff --git a/modoboa/admin/tests/test_import_.py b/modoboa/admin/tests/test_import_.py index 8e0610f60..c9f7f4027 100644 --- a/modoboa/admin/tests/test_import_.py +++ b/modoboa/admin/tests/test_import_.py @@ -75,7 +75,7 @@ dlist; dlist@test.com; True; user1@test.com; user@extdomain.com self.assertEqual(u1.first_name, "User") self.assertEqual(u1.last_name, "One") self.assertTrue(u1.is_active) - self.assertEqual(u1.group, "SimpleUsers") + self.assertEqual(u1.role, "SimpleUsers") self.assertTrue(mb1.use_domain_quota) self.assertEqual(mb1.quota, 0) self.assertTrue(admin.is_owner(mb1)) @@ -87,7 +87,7 @@ dlist; dlist@test.com; True; user1@test.com; user@extdomain.com da = User.objects.get(username="truc@test.com") damb = da.mailbox self.assertEqual(da.first_name, u"René") - self.assertEqual(da.group, "DomainAdmins") + self.assertEqual(da.role, "DomainAdmins") self.assertEqual(damb.quota, 5) self.assertFalse(damb.use_domain_quota) self.assertEqual(damb.full_address, "truc@test.com") diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index fb0266509..927177e53 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -152,7 +152,7 @@ def deldomain(request, dom_id): def domain_statistics(request): """A simple page to present domain statistics.""" context = {} - if request.user.group == "SuperAdmins": + if request.user.role == "SuperAdmins": context.update({ "domains_counter": Domain.objects.count(), "domain_aliases_counter": DomainAlias.objects.count(), diff --git a/modoboa/core/factories.py b/modoboa/core/factories.py index 3d5b12653..b513142ba 100644 --- a/modoboa/core/factories.py +++ b/modoboa/core/factories.py @@ -28,7 +28,7 @@ class GroupFactory(factory.DjangoModelFactory): class Meta: model = Group - name = 'DefaultGroup' + name = "DefaultGroup" class UserFactory(PermissionFactory): @@ -40,7 +40,7 @@ class UserFactory(PermissionFactory): django_get_or_create = ("username", ) email = factory.LazyAttribute(lambda a: a.username) - password = '{PLAIN}toto' + password = "{PLAIN}toto" @factory.post_generation def groups(self, create, extracted, **kwargs): diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 373a0162a..39816d66f 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -220,7 +220,7 @@ class User(PermissionsMixin): @property def tags(self): return [{"name": "account", "label": _("account"), "type": "idt"}, - {"name": self.group, "label": self.group, + {"name": self.role, "label": self.role, "type": "grp", "color": "info"}] @property @@ -258,22 +258,9 @@ class User(PermissionsMixin): from email.header import Header if self.first_name != "" or self.last_name != "": return "%s <%s>" % \ - (Header(self.fullname, 'utf8').encode(), self.email) + (Header(self.fullname, "utf8").encode(), self.email) return self.email - def belongs_to_group(self, name): - """Simple shortcut to check if this user is a member of a - specific group. - - :param name: the group's name - :return: a boolean - """ - try: - self.groups.get(name=name) - except Group.DoesNotExist: - return False - return True - def is_owner(self, obj): """Tell is the user is the unique owner of this object @@ -339,7 +326,7 @@ class User(PermissionsMixin): :param string role: the role to set """ - if role is None or self.group == role: + if role is None or self.role == role: return events.raiseEvent("RoleChanged", self, role) self.groups.clear() @@ -353,7 +340,7 @@ class User(PermissionsMixin): self.groups.add(Group.objects.get(name=role)) except Group.DoesNotExist: self.groups.add(Group.objects.get(name="SimpleUsers")) - if self.group != "SimpleUsers" and not self.can_access(self): + if role != "SimpleUsers" and not self.can_access(self): from modoboa.lib.permissions import grant_access_to_object grant_access_to_object(self, self) self.save() @@ -392,7 +379,7 @@ class User(PermissionsMixin): The expected order is the following:: - "account", loginname, password, first name, last name, enabled, group + "account", loginname, password, first name, last name, enabled, role Additional fields can be added using the *AccountImported* event. @@ -463,7 +450,7 @@ class User(PermissionsMixin): self.first_name.encode("utf-8"), self.last_name.encode("utf-8"), self.is_active, - self.group, + self.role, self.email.encode("utf-8") ] row += events.raiseQueryEvent("AccountExported", self) @@ -472,7 +459,7 @@ class User(PermissionsMixin): reversion.register(User) -def populate_callback(user, group='SimpleUsers'): +def populate_callback(user, group="SimpleUsers"): """Populate callback If the LDAP authentication backend is in use, this callback will diff --git a/modoboa/core/templates/core/information.html b/modoboa/core/templates/core/information.html index 9d1fff110..dd154822b 100644 --- a/modoboa/core/templates/core/information.html +++ b/modoboa/core/templates/core/information.html @@ -34,7 +34,7 @@ {% trans "Name" %} - {% trans "Group name" %} + {% trans "Role" %} {% trans "Last login" %} @@ -42,7 +42,7 @@ {% connected_users as users %}{% for u in users %} {{ u.username }} - {{ u.group }} + {{ u.role }} {{ u.last_login }} {% endfor %} diff --git a/modoboa/core/tests.py b/modoboa/core/tests.py index 44191d40f..de7774d91 100644 --- a/modoboa/core/tests.py +++ b/modoboa/core/tests.py @@ -159,7 +159,7 @@ class LDAPAuthenticationTestCase(LDAPTestCaseMixin, ModoTestCase): def check_created_user(self, username, group="SimpleUsers", with_mb=True): """Check that created user is valid.""" user = models.User.objects.get(username=username) - self.assertEqual(user.group, group) + self.assertEqual(user.role, group) if with_mb: self.assertEqual(user.email, username) self.assertEqual(user.mailbox.domain.name, "example.com") diff --git a/modoboa/limits/controls.py b/modoboa/limits/controls.py index fa914072f..16921728c 100644 --- a/modoboa/limits/controls.py +++ b/modoboa/limits/controls.py @@ -51,7 +51,7 @@ def user_can_set_role(user, role, account=None): ) if condition: return [True] - if account is not None and account.group == role: + if account is not None and account.role == role: return [True] return [False] @@ -60,18 +60,18 @@ def user_can_set_role(user, role, account=None): def on_account_modified(old, new): """Update limits when roles are updated""" owner = get_object_owner(old) - if owner.group not in ["SuperAdmins", "Resellers"]: + if owner.role not in ["SuperAdmins", "Resellers"]: # Domain admins can't change the role so nothing to check. return - if new.group not in ["DomainAdmins", "Resellers"]: + if new.role not in ["DomainAdmins", "Resellers"]: move_pool_resource(owner, new) @events.observe("AccountDeleted") def on_account_deleted(account, byuser, **kwargs): owner = get_object_owner(account) - if owner.group not in ["SuperAdmins", "Resellers"]: + if owner.role not in ["SuperAdmins", "Resellers"]: return move_pool_resource(owner, account) diff --git a/modoboa/limits/forms.py b/modoboa/limits/forms.py index 0af239697..2d78c75df 100644 --- a/modoboa/limits/forms.py +++ b/modoboa/limits/forms.py @@ -21,7 +21,7 @@ class ResourcePoolForm(forms.Form): if "required_role" in tpl: condition = ( self.account is not None and - self.account.group != tpl["required_role"] + self.account.role != tpl["required_role"] ) if condition: continue diff --git a/modoboa/limits/general_callbacks.py b/modoboa/limits/general_callbacks.py index 88bc51dd5..3d8e5f104 100644 --- a/modoboa/limits/general_callbacks.py +++ b/modoboa/limits/general_callbacks.py @@ -26,7 +26,7 @@ def display_pool_usage(user, target, currentpage): name for name, tpl in utils.get_user_limit_templates() if name not in exceptions and ("required_role" not in tpl or - tpl["required_role"] == user.group) + tpl["required_role"] == user.role) ] limits = user.userobjectlimit_set.filter(name__in=names, max_value__gt=0) @@ -42,10 +42,14 @@ def display_pool_usage(user, target, currentpage): def extra_account_form(user, account=None): if parameters.get_admin("ENABLE_ADMIN_LIMITS") == "no": return [] - if user.group not in ["SuperAdmins", "Resellers"]: + if user.role not in ["SuperAdmins", "Resellers"]: return [] - if account is not None and \ - account.group not in ["Resellers", "DomainAdmins"]: + condition = ( + (account is not None and + account.role not in ["Resellers", "DomainAdmins"]) or + user == account + ) + if condition: return [] return [{ @@ -81,8 +85,7 @@ def fill_domain_instances(user, domain, instances): def check_form_access(account, form): if form["id"] != "resources": return [True] - if not account.belongs_to_group("Resellers") and \ - not account.belongs_to_group("DomainAdmins"): + if account.role not in ["Resellers", "DomainAdmins"]: return [False] return [True] @@ -91,11 +94,11 @@ def check_form_access(account, form): def fill_account_instances(user, account, instances): condition = ( parameters.get_admin("ENABLE_ADMIN_LIMITS") == "no" or - (not user.is_superuser and user.group != "Resellers") + (not user.is_superuser and user.role != "Resellers") ) if condition: return - if account.group not in ["Resellers", "DomainAdmins"]: + if account.role not in ["Resellers", "DomainAdmins"]: return instances["resources"] = account diff --git a/modoboa/limits/tests/test_domain_limits.py b/modoboa/limits/tests/test_domain_limits.py index 12be480f2..3552b22fb 100644 --- a/modoboa/limits/tests/test_domain_limits.py +++ b/modoboa/limits/tests/test_domain_limits.py @@ -83,7 +83,7 @@ class DomainLimitsTestCase(lib_tests.ModoTestCase): self.assertFalse(limit.is_exceeded()) user = User.objects.get(username="admin@test2.com") values = { - "username": user.username, "role": user.group, + "username": user.username, "role": user.role, "is_active": user.is_active, "email": user.email, "quota_act": True, "domains": "test2.com", "domains_1": "test.com" @@ -130,7 +130,7 @@ class DomainLimitsTestCase(lib_tests.ModoTestCase): limit.save() self.assertFalse(limit.is_exceeded()) values = { - "username": user.username, "role": user.group, + "username": user.username, "role": user.role, "is_active": user.is_active, "email": user.email, "quota_act": True, "aliases": "alias@test.com", "aliases_1": "alias1@test.com" diff --git a/modoboa/limits/tests/test_user_limits.py b/modoboa/limits/tests/test_user_limits.py index 791c37e42..3a0e1d50c 100644 --- a/modoboa/limits/tests/test_user_limits.py +++ b/modoboa/limits/tests/test_user_limits.py @@ -162,7 +162,7 @@ class DomainAdminTestCase(ResourceTestCase): def test_aliases_limit_through_account_form(self): user = User.objects.get(username='user@test.com') values = dict( - username=user.username, role=user.group, + username=user.username, role=user.role, is_active=user.is_active, email=user.email, quota_act=True, aliases="alias1@test.com", aliases_1="alias2@test.com" ) @@ -320,7 +320,7 @@ class ResellerTestCase(ResourceTestCase): # Give 1 mailbox and 2 aliases to the admin -> should work values = { - 'username': user.username, 'role': user.group, 'quota_act': True, + 'username': user.username, 'role': user.role, 'quota_act': True, 'is_active': user.is_active, 'email': user.email, 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2 } @@ -347,7 +347,7 @@ class ResellerTestCase(ResourceTestCase): self._create_account('admin1@domain.tld', role='DomainAdmins') user = User.objects.get(username='admin1@domain.tld') values = { - 'username': user.username, 'role': user.group, 'quota_act': True, + 'username': user.username, 'role': user.role, 'quota_act': True, 'is_active': user.is_active, 'email': user.email, 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2 } @@ -379,7 +379,7 @@ class ResellerTestCase(ResourceTestCase): # Give 1 mailbox and 2 aliases to the admin -> should work values = { - 'username': user.username, 'role': user.group, 'quota_act': True, + 'username': user.username, 'role': user.role, 'quota_act': True, 'is_active': user.is_active, 'email': user.email, 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2 } @@ -411,7 +411,7 @@ class ResellerTestCase(ResourceTestCase): # Give 2 mailboxes and 3 aliases to the admin -> should fail. values = { - 'username': user.username, 'role': user.group, 'quota_act': True, + 'username': user.username, 'role': user.role, 'quota_act': True, 'is_active': user.is_active, 'email': user.email, 'mailboxes_limit': 2, 'mailbox_aliases_limit': 3 } From f440b0d99a04797fa4c36d3542a6b5cdc5f347a0 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 23 Sep 2016 17:35:59 +0200 Subject: [PATCH 07/40] Fix unit test. --- modoboa/admin/forms/account.py | 63 ++++++++++++++---------- modoboa/limits/tests/test_user_limits.py | 10 ++-- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index e732d95aa..401829c21 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -59,17 +59,23 @@ class AccountFormGeneral(forms.ModelForm): "username", "first_name", "last_name", "role", "is_active", "master_user" ) + labels = { + "is_active": ugettext_lazy("Enabled") + } def __init__(self, user, *args, **kwargs): super(AccountFormGeneral, self).__init__(*args, **kwargs) self.fields = OrderedDict( (key, self.fields[key]) for key in - ['role', 'username', 'first_name', 'last_name', 'password1', - 'password2', 'master_user', 'is_active'] + ["role", "username", "first_name", "last_name", "password1", + "password2", "master_user", "is_active"] ) - self.fields["is_active"].label = _("Enabled") self.user = user - if user.role in ["Resellers", "DomainAdmins"]: + condition = ( + user.role == "DomainAdmins" or + user.role == "Resellers" and self.instance == user + ) + if condition: self.fields["role"] = forms.CharField( label="", widget=forms.HiddenInput(attrs={"class": "form-control"}), @@ -77,34 +83,39 @@ class AccountFormGeneral(forms.ModelForm): ) else: self.fields["role"].choices += ( - get_account_roles(user, kwargs["instance"]) - if "instance" in kwargs else get_account_roles(user) + get_account_roles(user, self.instance) + if self.instance.pk else get_account_roles(user) ) if not user.is_superuser: del self.fields["master_user"] - if "instance" in kwargs: - account = kwargs["instance"] - domain_disabled = ( - hasattr(account, "mailbox") and - not account.mailbox.domain.enabled - ) + if not self.instance.pk: + return + + domain_disabled = ( + hasattr(self.instance, "mailbox") and + not self.instance.mailbox.domain.enabled + ) + if domain_disabled: + self.fields["is_active"].widget.attrs["disabled"] = "disabled" + if args: + empty_password = ( + args[0].get("password1", "") == "" and + args[0].get("password2", "") == "") + if empty_password: + self.fields["password1"].required = False + self.fields["password2"].required = False if domain_disabled: - self.fields["is_active"].widget.attrs["disabled"] = "disabled" - if args: - if args[0].get("password1", "") == "" \ - and args[0].get("password2", "") == "": - self.fields["password1"].required = False - self.fields["password2"].required = False - if domain_disabled: - del self.fields["is_active"] - self.fields["role"].initial = account.role - if not account.is_local \ - and parameters.get_admin( - "LDAP_AUTH_METHOD", app="core") == "directbind": - del self.fields["password1"] - del self.fields["password2"] + del self.fields["is_active"] + self.fields["role"].initial = self.instance.role + condition = ( + not self.instance.is_local and + parameters.get_admin( + "LDAP_AUTH_METHOD", app="core") == "directbind") + if condition: + del self.fields["password1"] + del self.fields["password2"] def domain_is_disabled(self): """Little shortcut to get the domain's state. diff --git a/modoboa/limits/tests/test_user_limits.py b/modoboa/limits/tests/test_user_limits.py index 3a0e1d50c..98ccf4e2c 100644 --- a/modoboa/limits/tests/test_user_limits.py +++ b/modoboa/limits/tests/test_user_limits.py @@ -245,12 +245,12 @@ class ResellerTestCase(ResourceTestCase): self.user.userobjectlimit_set.filter( name="mailboxes").update(max_value=3) - self._create_account('user1@domain.tld') - user = User.objects.get(username='user1@domain.tld') + self._create_account("user1@domain.tld") + user = User.objects.get(username="user1@domain.tld") values = { - 'username': user.username, 'role': 'DomainAdmins', - 'quota_act': True, 'is_active': user.is_active, - 'email': user.email + "username": user.username, "role": "DomainAdmins", + "quota_act": True, "is_active": user.is_active, + "email": user.email } resp = self.ajax_post( reverse("admin:account_change", args=[user.id]), From 486100b59cc1a464464aea77eaf59264d40bfe7f Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 29 Sep 2016 21:49:37 +0200 Subject: [PATCH 08/40] Increase coverage. --- .../management/commands/subcommands/_mx.py | 29 ++++++++++--------- modoboa/admin/tests/test_mx.py | 19 ++++++++++-- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index 483ca4c16..8c1a8e7d2 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -98,14 +98,14 @@ class CheckMXRecords(BaseCommand): else: try: # we must have a valid IP - address = ipaddress.ip_address(u'{}'.format(address)) + address = ipaddress.ip_address(u"{}".format(address)) except ValueError: pass else: record = models.MXRecord.objects.create( domain=domain, - name=u'{}'.format(str(answer.exchange).strip(".")), - address=u'{}'.format(address), + name=u"{}".format(str(answer.exchange).strip(".")), + address=u"{}".format(address), updated=now + delta) yield record @@ -177,7 +177,7 @@ class CheckMXRecords(BaseCommand): for mx in mx_list] valid_mxs = self.valid_mxs if not mxs: - alerts.append(_("Domain {} as no MX record").format(domain)) + alerts.append(_("Domain {} has no MX record").format(domain)) elif valid_mxs: for subnet in valid_mxs: for mx, addr in mxs: @@ -188,7 +188,7 @@ class CheckMXRecords(BaseCommand): mx_names = [ "{0.name} ({0.address})".format(mx) for mx in mx_list] alerts.append( - _("Domain {0} got an invalid MX record. Got {1}").format( + _("MX record for domain {0} is invalid: {1}").format( domain, ", ".join(mx_names)) ) if not alerts: @@ -241,19 +241,20 @@ class CheckMXRecords(BaseCommand): models.DNSBLResult.objects.exclude( provider__in=self.providers).delete() - if options['domain']: + if options["domain"]: domains = [] - for domain in options['domain']: - if isinstance(domain, models.Domain): - domains.append(domain) - elif domain.isdigit(): - domains.append(models.Domain.objects.get(domain)) - else: - domains.append(models.Domain.objects.filter(name=domain)) + for domain in options["domain"]: + try: + if domain.isdigit(): + domains.append(models.Domain.objects.get(pk=domain)) + else: + domains.append(models.Domain.objects.get(name=domain)) + except models.Domain.DoesNotExist: + pass else: domains = models.Domain.objects.filter(enabled=True) - options.pop('domain') + options.pop("domain") for domain in domains: self.check_domain(domain, **options) diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index 73812a7a4..6dad57569 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -19,8 +19,9 @@ class MXTestCase(ModoTestCase): """Create some data.""" super(MXTestCase, cls).setUpTestData() cls.domain = factories.DomainFactory(name="modoboa.org") - factories.DomainFactory(name="pouet.com") # should not exist - parameters.save_admin('VALID_MXS', '127.0.0.1', app='admin') + # should not exist + cls.bad_domain = factories.DomainFactory(name="pouet.com") + parameters.save_admin("VALID_MXS", "127.0.0.1") models.MXRecord.objects.all().delete() def test_management_command(self): @@ -44,6 +45,20 @@ class MXTestCase(ModoTestCase): qs = models.MXRecord.objects.filter(domain=self.domain) self.assertEqual(id, qs[0].id) + def test_single_domain_update(self): + """Update only one domain.""" + management.call_command( + "modo", "check_mx", "--domain", self.domain.name) + self.assertTrue( + models.MXRecord.objects.filter(domain=self.domain).exists()) + self.assertFalse( + models.MXRecord.objects.filter(domain=self.bad_domain).exists()) + + management.call_command( + "modo", "check_mx", "--domain", str(self.bad_domain.pk)) + self.assertFalse( + models.MXRecord.objects.filter(domain=self.bad_domain).exists()) + class DNSBLTestCase(ModoTestCase): """TestCase for DNSBL related features.""" From f995d7cb4035322228fe949054b323a5b64a9bd3 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 29 Sep 2016 22:18:40 +0200 Subject: [PATCH 09/40] Increase coverage. --- modoboa/admin/tests/test_mx.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index 6dad57569..427123802 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -59,6 +59,9 @@ class MXTestCase(ModoTestCase): self.assertFalse( models.MXRecord.objects.filter(domain=self.bad_domain).exists()) + management.call_command( + "modo", "check_mx", "--domain", "toto.com") + class DNSBLTestCase(ModoTestCase): """TestCase for DNSBL related features.""" From eac3711850aa35af51cc0667dd16cb79b6a7a895 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 30 Sep 2016 11:51:35 +0200 Subject: [PATCH 10/40] Cleanup. see #924 --- modoboa/admin/forms/domain.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/modoboa/admin/forms/domain.py b/modoboa/admin/forms/domain.py index f124158a5..f499dbc0e 100644 --- a/modoboa/admin/forms/domain.py +++ b/modoboa/admin/forms/domain.py @@ -279,17 +279,13 @@ class DomainForm(TabForms): super(DomainForm, self).__init__(request, *args, **kwargs) def extra_context(self, context): - domadmins = [u for u in self.domain.admins - if self.request.user.can_access(u) and not u.is_superuser] - if not self.request.user.is_superuser: - domadmins = [u for u in domadmins if u.role == "DomainAdmins"] + """Add information to template context.""" context.update({ "title": self.domain.name, "action": reverse( "admin:domain_change", args=[self.domain.pk]), "formid": "domform", - "domain": self.domain, - "domadmins": domadmins + "domain": self.domain }) def is_valid(self): From 4dd8980562ad127b32d1840f11623446f7b697dc Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 30 Sep 2016 12:13:13 +0200 Subject: [PATCH 11/40] Use a CBV and increase coverage. --- modoboa/admin/tests/test_domain.py | 15 ++++++++++++++ modoboa/admin/urls.py | 3 ++- modoboa/admin/views/__init__.py | 3 ++- modoboa/admin/views/domain.py | 32 ++++++++++++++++++------------ 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/modoboa/admin/tests/test_domain.py b/modoboa/admin/tests/test_domain.py index cef7c0f54..39577811f 100644 --- a/modoboa/admin/tests/test_domain.py +++ b/modoboa/admin/tests/test_domain.py @@ -162,3 +162,18 @@ class DomainTestCase(ModoTestCase): "ENABLE_DOMAIN_LIMITS", "yes", app="limits") response = self.client.get(url) self.assertIn("Resources usage", response.content) + + def test_domain_statitics_view(self): + """Test statistics display.""" + url = reverse("admin:domain_statistics") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + self.assertIn("Global counters", response.content) + self.assertIn("Per-domain counters", response.content) + + self.client.force_login( + User.objects.get(username="admin@test.com")) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + self.assertNotIn("Global counters", response.content) + self.assertIn("Per-domain counters", response.content) diff --git a/modoboa/admin/urls.py b/modoboa/admin/urls.py index d430cd78e..347efea62 100644 --- a/modoboa/admin/urls.py +++ b/modoboa/admin/urls.py @@ -18,7 +18,8 @@ urlpatterns = patterns( name="mx_domain_detail"), url(r'^domains/list/$', '_domains', name="_domain_list"), url(r'^domains/flatlist/$', 'domains_list', name="domain_flat_list"), - url(r'^domains/stats/$', 'domain_statistics', name="domain_statistics"), + url(r'^domains/stats/$', views.DomainStatisticsView.as_view(), + name="domain_statistics"), url(r'^domains/new/', 'newdomain', name='domain_add'), url(r'^domains/(?P\d+)/edit/$', 'editdomain', name="domain_change"), diff --git a/modoboa/admin/views/__init__.py b/modoboa/admin/views/__init__.py index e63b5b5e1..492f84da6 100644 --- a/modoboa/admin/views/__init__.py +++ b/modoboa/admin/views/__init__.py @@ -3,7 +3,7 @@ from .alias import AliasDetailView from .identity import AccountDetailView from .dns import DNSBLDomainDetailView, MXDomainDetailView -from .domain import DomainDetailView +from .domain import DomainDetailView, DomainStatisticsView __all__ = [ @@ -11,5 +11,6 @@ __all__ = [ "AliasDetailView", "DNSBLDomainDetailView", "DomainDetailView", + "DomainStatisticsView", "MXDomainDetailView", ] diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index 927177e53..bd1a7a4df 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -147,21 +147,27 @@ def deldomain(request, dom_id): return render_to_json_response(msg) -@login_required -@permission_required("admin.view_domains") -def domain_statistics(request): +class DomainStatisticsView( + auth_mixins.PermissionRequiredMixin, generic.TemplateView): """A simple page to present domain statistics.""" - context = {} - if request.user.role == "SuperAdmins": + + template_name = "admin/domain_statistics.html" + permission_required = "admin.view_domains" + + def get_context_data(self, **kwargs): + """Add counters.""" + context = super(DomainStatisticsView, self).get_context_data(**kwargs) + if self.request.user.role == "SuperAdmins": + context.update({ + "domains_counter": Domain.objects.count(), + "domain_aliases_counter": DomainAlias.objects.count(), + "identities_counter": ( + User.objects.count() + + Alias.objects.filter(internal=False).count()), + }) context.update({ - "domains_counter": Domain.objects.count(), - "domain_aliases_counter": DomainAlias.objects.count(), - "identities_counter": ( - User.objects.count() + - Alias.objects.filter(internal=False).count()), - }) - context.update({"domains": Domain.objects.get_for_admin(request.user)}) - return render(request, "admin/domain_statistics.html", context) + "domains": Domain.objects.get_for_admin(self.request.user)}) + return context class DomainDetailView( From b44d24c6be3673487e63a477de488833a70af0f3 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 30 Sep 2016 17:50:48 +0200 Subject: [PATCH 12/40] Command refactored. see #851 --- modoboa/admin/handlers.py | 14 ++ modoboa/admin/postfix_maps.py | 7 - modoboa/core/commands/postfix_maps.py | 185 ------------------ .../commands/generate_postfix_maps.py | 112 +++++++++++ modoboa/core/signals.py | 1 + modoboa/lib/test_utils.py | 16 +- 6 files changed, 133 insertions(+), 202 deletions(-) delete mode 100644 modoboa/core/commands/postfix_maps.py create mode 100644 modoboa/core/management/commands/generate_postfix_maps.py diff --git a/modoboa/admin/handlers.py b/modoboa/admin/handlers.py index b6fbae762..b7b6554e3 100644 --- a/modoboa/admin/handlers.py +++ b/modoboa/admin/handlers.py @@ -3,7 +3,10 @@ from django.db.models import signals from django.dispatch import receiver +from modoboa.core import signals as core_signals + from . import models +from . import postfix_maps @receiver(signals.post_save, sender=models.Domain) @@ -97,3 +100,14 @@ def remove_alias_for_mailbox(sender, instance, **kwargs): """Remove "self alias" for this mailbox.""" models.Alias.objects.filter( address=instance.full_address).delete() + + +@receiver(core_signals.register_postfix_maps) +def register_postfix_maps(sender, **kwargs): + """Register admin map files.""" + return [ + postfix_maps.DomainsMap, postfix_maps.DomainsAliasesMap, + postfix_maps.AliasesMap, postfix_maps.MaintainMap, + postfix_maps.SenderLoginAliasMap, postfix_maps.SenderLoginMailboxMap, + postfix_maps.SenderLoginMailboxExtraMap + ] diff --git a/modoboa/admin/postfix_maps.py b/modoboa/admin/postfix_maps.py index 2d13440f4..b8e19a3b0 100644 --- a/modoboa/admin/postfix_maps.py +++ b/modoboa/admin/postfix_maps.py @@ -1,7 +1,5 @@ """Map file definitions for postfix.""" -from modoboa.core.commands.postfix_maps import registry - class DomainsMap(object): @@ -166,8 +164,3 @@ class SenderLoginAliasMap(object): " INNER JOIN admin_alias al ON alr.alias_id=al.id " "WHERE al.enabled=1 AND al.address='%s'" ) - -registry.add_files([ - DomainsMap, DomainsAliasesMap, AliasesMap, MaintainMap, - SenderLoginAliasMap, SenderLoginMailboxMap, SenderLoginMailboxExtraMap -]) diff --git a/modoboa/core/commands/postfix_maps.py b/modoboa/core/commands/postfix_maps.py deleted file mode 100644 index 2fbfab935..000000000 --- a/modoboa/core/commands/postfix_maps.py +++ /dev/null @@ -1,185 +0,0 @@ -# coding: utf-8 - -"""postfix_maps command.""" - -import datetime -import getpass -import os -import sys - -import django -from django.template import Context, Template - -import dj_database_url - -from . import Command - -MAP_FILE_TEMPLATE = """user = {{ dbuser }} -password = {{ dbpass }} -dbname = {{ dbname }} -hosts = {{ dbhost }} -query = {{ query|safe }} -""" - - -class MapFilesRegistry(object): - - """A registry of all map files.""" - - def __init__(self): - self.files = [] - - def add_files(self, files): - """Add map files to registry.""" - self.files += files - - -registry = MapFilesRegistry() - - -class MapFilesGenerator(object): - - """Map files generator.""" - - def __init__(self, dbinfo=None): - """Constructor.""" - self.template = Template(MAP_FILE_TEMPLATE) - if dbinfo is None: - self.tpl_context = { - 'dbhost': raw_input('Database host: '), - 'dbname': raw_input('Database name: '), - 'dbuser': raw_input('Username: '), - 'dbpass': getpass.getpass('Password: ') - } - else: - self.tpl_context = { - 'dbhost': dbinfo['HOST'], - 'dbname': dbinfo['NAME'], - 'dbuser': dbinfo['USER'], - 'dbpass': dbinfo['PASSWORD'] - } - if not self.tpl_context['dbhost']: - self.tpl_context['dbhost'] = '127.0.0.1' - - def __render_map(self, args, mapobject): - """Render a map file. - - :param args: command line arguments - :param mapobject: a ``MapFile`` subclass - """ - content = self.template.render( - Context(dict( - self.tpl_context.items(), - query=getattr(mapobject, args.dbtype) - )) - ) - with open("%s/%s" % (args.destdir, mapobject.filename), "w") as fp: - fp.write("""# This file was generated on {} by running: -# {} {} -# DO NOT EDIT! -""" - .format(datetime.datetime.now().isoformat(), - os.path.basename(sys.argv[0]), - ' '.join(sys.argv[1:]))) - fp.write("{}\n".format(content)) - - def __load_applications(self, applications): - """Load specified applications.""" - for app in applications: - extension = app.replace("-", "_") - try: - __import__(extension, locals(), globals(), ["postfix_maps"]) - except ImportError: - sys.stderr.write("Unknown application {0}".format(extension)) - - def render(self, args): - """Render all map files. - - :param args: arguments received from the command line - """ - try: - os.mkdir(args.destdir) - except OSError: - pass - applications = ["modoboa.admin", "modoboa.relaydomains"] - if args.extensions: - if "all" in applications: - from modoboa.lib.api_client import ModoAPIClient - - # Retrieve extension list from the API - url = "http://api.modoboa.org/" - official_exts = ModoAPIClient(url).list_extensions() - extensions = [ - extension["name"] for extension in official_exts] - else: - extensions = args.extensions - applications += extensions - self.__load_applications(applications) - for mapfile in registry.files: - self.__render_map(args, mapfile) - - -class SQLiteMapFilesGenerator(MapFilesGenerator): - - """SQLite special generator.""" - - def __init__(self, dbinfo=None): - self.template = Template("""dbpath = {{ dbpath }} -query = {{ query|safe }} -""") - if dbinfo is None: - self.tpl_context = { - 'dbpath': raw_input('Database path: ') - } - else: - self.tpl_context = { - 'dbpath': dbinfo['NAME'] - } - - -class PostfixMapsCommand(Command): - - """Base command to generate map files.""" - - help = "Generate ready-to-use postfix map files" - - def __init__(self, *args, **kwargs): - super(PostfixMapsCommand, self).__init__(*args, **kwargs) - self._parser.add_argument( - 'destdir', type=str, - help='Directory that will contain generated map files' - ) - self._parser.add_argument( - '--dbtype', type=str, choices=['mysql', 'postgres', 'sqlite'], - default='mysql', - help='Used database type' - ) - self._parser.add_argument( - '--dburl', type=str, nargs=1, default=None, - help="url of Modoboa's database" - ) - self._parser.add_argument( - '--extensions', type=str, nargs='+', - help=( - 'Generate map files for this extensions ' - '("all" shortcut available)' - ) - ) - - def handle(self, parsed_args): - """Command entry point.""" - django.setup() - dbinfo = None - if parsed_args.dburl: - dbinfo = dj_database_url.config(default=parsed_args.dburl[0]) - if 'sqlite' in dbinfo['ENGINE']: - parsed_args.dbtype = 'sqlite' - elif 'psycopg2' in dbinfo['ENGINE']: - parsed_args.dbtype = 'postgres' - else: - parsed_args.dbtype = 'mysql' - if parsed_args.dbtype == 'sqlite': - generator = SQLiteMapFilesGenerator(dbinfo) - else: - generator = MapFilesGenerator(dbinfo) - generator.render(parsed_args) diff --git a/modoboa/core/management/commands/generate_postfix_maps.py b/modoboa/core/management/commands/generate_postfix_maps.py new file mode 100644 index 000000000..6db643eec --- /dev/null +++ b/modoboa/core/management/commands/generate_postfix_maps.py @@ -0,0 +1,112 @@ +"""Management command to generate/update postfix map files.""" + +import os +import sys + +from django.conf import settings +from django.core.management.base import BaseCommand +from django.template import Context, Template +from django.utils import timezone + +import dj_database_url + +from ... import signals + +MAP_FILE_TEMPLATE = """# This file was generated on {{ date }} by running: +# {{ commandline }} +# DO NOT EDIT! +""" + + +class Command(BaseCommand): + """Command class.""" + + help = "Generate/update postfix map files." + + def add_arguments(self, parser): + """Add extra arguments.""" + parser.add_argument( + "--dburl", help="Custom database url") + parser.add_argument( + "--destdir", default=".", + help="Directory where files will be created") + parser.add_argument( + "--extensions", type=str, nargs="+", + help=( + "Generate map files for those extensions " + "('all' shortcut available)" + ) + ) + + def __register_map_files(self): + """Load specified applications.""" + responses = signals.register_postfix_maps.send(sender=self.__class__) + mapfiles = [] + for response in responses: + mapfiles += response[1] + return mapfiles + + def get_template(self, dbtype): + """Return map file template.""" + tplcontent = MAP_FILE_TEMPLATE + if dbtype == "sqlite": + tplcontent += """dbpath = {{ dbname }} +query = {{ query|safe }} +""" + else: + tplcontent += """user = {{ dbuser }} +password = {{ dbpass }} +dbname = {{ dbname }} +hosts = {{ dbhost }} +query = {{ query|safe }} +""" + return Template(tplcontent) + + def get_template_context(self, options): + """Build the context used to render templates.""" + dburl = options.get("dburl") + db_settings = ( + dj_database_url.config(default=dburl) + if dburl else settings.DATABASES["default"]) + if "sqlite" in db_settings["ENGINE"]: + dbtype = "sqlite" + elif "psycopg2" in db_settings["ENGINE"]: + dbtype = "postgres" + else: + dbtype = "mysql" + commandline = "{} {}".format( + os.path.basename(sys.argv[0]), " ".join(sys.argv[1:])) + context = { + "date": timezone.now(), + "commandline": commandline, + "dbtype": dbtype, + "dbuser": db_settings["USER"], + "dbpass": db_settings["PASSWORD"], + "dbname": db_settings["NAME"], + "dbhost": db_settings.get("HOST", "127.0.0.1"), + } + return context + + def __render_map_file(self, mapobject, destdir, context): + """Render a map file.""" + content = self.get_template(context["dbtype"]).render( + Context( + dict(context.items(), + query=getattr(mapobject, context["dbtype"])) + ) + ) + fullpath = os.path.join(destdir, mapobject.filename) + with open(fullpath, "w") as fp: + fp.write("{}\n".format(content)) + + def handle(self, *args, **options): + """Command entry point.""" + mapfiles = self.__register_map_files() + destdir = os.path.realpath(options["destdir"]) + try: + os.mkdir(destdir) + except OSError: + pass + context = self.get_template_context(options) + for mapobject in mapfiles: + self.__render_map_file(mapobject, destdir, context) diff --git a/modoboa/core/signals.py b/modoboa/core/signals.py index 1275ffe1b..3169a6313 100644 --- a/modoboa/core/signals.py +++ b/modoboa/core/signals.py @@ -4,3 +4,4 @@ import django.dispatch can_create_object = django.dispatch.Signal( providing_args=["context", "object_type", "count"]) +register_postfix_maps = django.dispatch.Signal() diff --git a/modoboa/lib/test_utils.py b/modoboa/lib/test_utils.py index 3b5f070c5..e4bb1e4d9 100644 --- a/modoboa/lib/test_utils.py +++ b/modoboa/lib/test_utils.py @@ -1,13 +1,13 @@ """Tools for top level testing (ie. when ran by Travis).""" import os +import shutil import tempfile -from .sysutils import exec_cmd +from django.core.management import call_command class MapFilesTestCaseMixin(object): - """A generic test case to check map files generation.""" MAP_FILES = None @@ -18,17 +18,13 @@ class MapFilesTestCaseMixin(object): self.workdir = tempfile.mkdtemp() def tearDown(self): - exec_cmd("rm -rf {0}".format(self.workdir)) + shutil.rmtree(self.workdir) def _test_maps_generation(self, engine): dburl = "{0}://user:password@localhost/testdb".format(engine) - code, output = exec_cmd( - "modoboa-admin.py postfix_maps {0}--dburl {1} {2}".format( - "--extensions {} ".format(self.extension) - if self.extension else "", dburl, self.workdir - ) - ) - self.assertEqual(code, 0) + call_command( + "generate_postfix_maps", + "--dburl", dburl, "--destdir", self.workdir) for mapfile in self.MAP_FILES: path = "{0}/{1}".format(self.workdir, mapfile) From 167f923f240a2ab8949202f55feb129d5019d39d Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 30 Sep 2016 18:07:58 +0200 Subject: [PATCH 13/40] Fix relaydomains registration. see #851 --- modoboa/relaydomains/handlers.py | 13 +++++++++++++ modoboa/relaydomains/postfix_maps.py | 8 -------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/modoboa/relaydomains/handlers.py b/modoboa/relaydomains/handlers.py index 3c8d4d857..bd326199e 100644 --- a/modoboa/relaydomains/handlers.py +++ b/modoboa/relaydomains/handlers.py @@ -5,9 +5,11 @@ from django.dispatch import receiver from modoboa.admin import models as admin_models from modoboa.admin.signals import use_external_recipients +from modoboa.core import signals as core_signals from modoboa.lib.email_utils import split_mailbox from . import models +from . import postfix_maps @receiver(use_external_recipients) @@ -39,3 +41,14 @@ def clean_domain(sender, instance, **kwargs): # at form level... models.RelayDomain.objects.create( domain=instance, service=models.Service.objects.first()) + + +@receiver(core_signals.register_postfix_maps) +def register_postfix_maps(sender, **kwargs): + """Register postfix maps.""" + return [ + postfix_maps.RelayDomainsMap, + postfix_maps.RelayDomainsTransportMap, + postfix_maps.SplitedDomainsTransportMap, + postfix_maps.RelayRecipientVerification + ] diff --git a/modoboa/relaydomains/postfix_maps.py b/modoboa/relaydomains/postfix_maps.py index e38a9707f..1ca969379 100644 --- a/modoboa/relaydomains/postfix_maps.py +++ b/modoboa/relaydomains/postfix_maps.py @@ -1,7 +1,5 @@ """Map file definitions for postfix.""" -from modoboa.core.commands.postfix_maps import registry - class RelayDomainsMap(object): @@ -116,9 +114,3 @@ class RelayRecipientVerification(object): "INNER JOIN admin_domain AS dom ON rdom.domain_id=dom.id " "WHERE rdom.verify_recipients=1 AND dom.name='%d'" ) - - -registry.add_files([ - RelayDomainsMap, RelayDomainsTransportMap, SplitedDomainsTransportMap, - RelayRecipientVerification -]) From ca540000a5fb39248a3c4dd8b7ec24a9085afffc Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 30 Sep 2016 21:21:19 +0200 Subject: [PATCH 14/40] Remove useless option. see #851 --- modoboa/core/management/commands/generate_postfix_maps.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modoboa/core/management/commands/generate_postfix_maps.py b/modoboa/core/management/commands/generate_postfix_maps.py index 6db643eec..ae29af77f 100644 --- a/modoboa/core/management/commands/generate_postfix_maps.py +++ b/modoboa/core/management/commands/generate_postfix_maps.py @@ -30,13 +30,6 @@ class Command(BaseCommand): parser.add_argument( "--destdir", default=".", help="Directory where files will be created") - parser.add_argument( - "--extensions", type=str, nargs="+", - help=( - "Generate map files for those extensions " - "('all' shortcut available)" - ) - ) def __register_map_files(self): """Load specified applications.""" From 0eaff83a2e567d9fe0b03da7e7e8b486f9c80cac Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 30 Sep 2016 21:34:53 +0200 Subject: [PATCH 15/40] Update documentation. --- doc/integration/imap_and_smtp.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/integration/imap_and_smtp.rst b/doc/integration/imap_and_smtp.rst index 7c8d1163d..60bfd23a4 100644 --- a/doc/integration/imap_and_smtp.rst +++ b/doc/integration/imap_and_smtp.rst @@ -420,12 +420,12 @@ You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables. To automaticaly generate the requested map files and store them in a -directory, run the following command:: +directory, run the following commands:: - $ modoboa-admin.py postfix_maps --dbtype + $ cd + $ python manage.py generate_postfix_maps --destdir -```` is the directory where the files will be -stored. Answer the few questions and you're done. +```` is the directory where the files will be stored. .. _postfix_config: @@ -461,6 +461,7 @@ Use the following configuration in the :file:`/etc/postfix/main.cf` file smtpd_sender_login_maps = :/etc/postfix/sql-sender-login-mailboxes.cf :/etc/postfix/sql-sender-login-aliases.cf + :/etc/postfix/sql-sender-login-mailboxes-extra.cf smtpd_sender_restrictions = reject_sender_login_mismatch From 9b38fee10829c4f421c4b8cebfe59b919122236a Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 3 Oct 2016 08:53:14 +0200 Subject: [PATCH 16/40] Upgrade mode. File credentials are preserved, only query is updated. see #488 --- modoboa/admin/tests/test_mapfiles.py | 40 ++++++++++++ .../commands/generate_postfix_maps.py | 63 ++++++++++++++++++- modoboa/core/utils.py | 12 ++++ 3 files changed, 112 insertions(+), 3 deletions(-) diff --git a/modoboa/admin/tests/test_mapfiles.py b/modoboa/admin/tests/test_mapfiles.py index a6fa41ade..79f424176 100644 --- a/modoboa/admin/tests/test_mapfiles.py +++ b/modoboa/admin/tests/test_mapfiles.py @@ -1,7 +1,12 @@ """Test map files generation.""" +import os + +from django.conf import settings +from django.core.management import call_command from django.test import TestCase +from modoboa.core.utils import parse_map_file from modoboa.lib.test_utils import MapFilesTestCaseMixin @@ -14,3 +19,38 @@ class MapFilesTestCase(MapFilesTestCaseMixin, TestCase): "sql-maintain.cf", "sql-sender-login-mailboxes.cf", "sql-sender-login-mailboxes-extra.cf", "sql-sender-login-aliases.cf" ] + + def test_map_upgrade(self): + """Check that map content is used.""" + dburl = "postgres://user:password@localhost/testdb" + call_command( + "generate_postfix_maps", + "--dburl", dburl, "--destdir", self.workdir) + + # Now upgrade files. Map credentials should be preserved. + call_command("generate_postfix_maps", "--destdir", self.workdir) + for f in self.MAP_FILES: + mapcontent = parse_map_file(os.path.join(self.workdir, f)) + self.assertEqual(mapcontent["user"], "user") + self.assertEqual(mapcontent["password"], "password") + self.assertEqual(mapcontent["dbname"], "testdb") + + # Now force overwrite, credentials should be different + call_command( + "generate_postfix_maps", "--destdir", self.workdir, + "--force-overwrite") + dbsettings = settings.DATABASES["default"] + for f in self.MAP_FILES: + mapcontent = parse_map_file(os.path.join(self.workdir, f)) + self.assertEqual(mapcontent["user"], dbsettings["USER"]) + self.assertEqual(mapcontent["password"], dbsettings["PASSWORD"]) + self.assertEqual(mapcontent["dbname"], dbsettings["NAME"]) + + # Now modify a file manually + path = os.path.join(self.workdir, "sql-domains.cf") + with open(path, "a") as fp: + fp.write("pouet") + call_command("generate_postfix_maps", "--destdir", self.workdir) + with open(path) as fp: + content = fp.read() + self.assertIn("pouet", content) diff --git a/modoboa/core/management/commands/generate_postfix_maps.py b/modoboa/core/management/commands/generate_postfix_maps.py index ae29af77f..bb3e915ab 100644 --- a/modoboa/core/management/commands/generate_postfix_maps.py +++ b/modoboa/core/management/commands/generate_postfix_maps.py @@ -1,5 +1,7 @@ """Management command to generate/update postfix map files.""" +import copy +import hashlib import os import sys @@ -11,6 +13,7 @@ from django.utils import timezone import dj_database_url from ... import signals +from ... import utils MAP_FILE_TEMPLATE = """# This file was generated on {{ date }} by running: # {{ commandline }} @@ -30,6 +33,23 @@ class Command(BaseCommand): parser.add_argument( "--destdir", default=".", help="Directory where files will be created") + parser.add_argument( + "--force-overwrite", action="store_true", default=False, + help="Force overwrite of existing map files") + + def __load_checksums(self, destdir): + """Load existing checksums if possible.""" + self.__checksums_file = os.path.join( + destdir, "modoboa-postfix-maps.chk") + self.__checksums = {} + if not os.path.exists(self.__checksums_file): + return + with open(self.__checksums_file) as fp: + for line in fp: + fname, dbtype, checksum = line.split(":") + self.__checksums[fname.strip()] = { + "dbtype": dbtype, "checksum": checksum.strip() + } def __register_map_files(self): """Load specified applications.""" @@ -39,6 +59,18 @@ class Command(BaseCommand): mapfiles += response[1] return mapfiles + def __check_file(self, path): + """Check if map file has been modified.""" + fname = os.path.basename(path) + condition = ( + not self.__checksums or + fname not in self.__checksums) + if condition: + return True + with open(path) as fp: + checksum = hashlib.md5(fp.read()).hexdigest() + return checksum == self.__checksums[fname]["checksum"] + def get_template(self, dbtype): """Return map file template.""" tplcontent = MAP_FILE_TEMPLATE @@ -80,8 +112,23 @@ query = {{ query|safe }} } return context - def __render_map_file(self, mapobject, destdir, context): + def __render_map_file( + self, mapobject, destdir, context, force_overwrite=False): """Render a map file.""" + fullpath = os.path.join(destdir, mapobject.filename) + if os.path.exists(fullpath) and not force_overwrite: + if not self.__check_file(fullpath): + print( + "Cannot upgrade '{}' map because it has been modified." + .format(mapobject.filename)) + return self.__checksums[mapobject.filename] + mapcontent = utils.parse_map_file(fullpath) + context = copy.deepcopy(context) + context["dbtype"] = self.__checksums[mapobject.filename]["dbtype"] + context["dbuser"] = mapcontent["user"] + context["dbpass"] = mapcontent["password"] + context["dbname"] = mapcontent["dbname"] + context["dbhost"] = mapcontent["hosts"] content = self.get_template(context["dbtype"]).render( Context( dict(context.items(), @@ -90,7 +137,8 @@ query = {{ query|safe }} ) fullpath = os.path.join(destdir, mapobject.filename) with open(fullpath, "w") as fp: - fp.write("{}\n".format(content)) + fp.write(content) + return hashlib.md5(content).hexdigest() def handle(self, *args, **options): """Command entry point.""" @@ -100,6 +148,15 @@ query = {{ query|safe }} os.mkdir(destdir) except OSError: pass + self.__load_checksums(destdir) context = self.get_template_context(options) + checksums = {} for mapobject in mapfiles: - self.__render_map_file(mapobject, destdir, context) + checksum = self.__render_map_file( + mapobject, destdir, context, + force_overwrite=options["force_overwrite"]) + checksums[mapobject.filename] = checksum + with open(self.__checksums_file, "w") as fp: + for fname, checksum in checksums.items(): + fp.write("{}:{}:{}\n".format( + fname, context["dbtype"], checksum)) diff --git a/modoboa/core/utils.py b/modoboa/core/utils.py index 6eb0afa36..371e5b33a 100644 --- a/modoboa/core/utils.py +++ b/modoboa/core/utils.py @@ -11,6 +11,18 @@ from modoboa.lib.api_client import ModoAPIClient from . import models +def parse_map_file(path): + """Parse a postfix map file and return values.""" + content = {} + with open(path) as fp: + for line in fp: + if not line or line.startswith("#"): + continue + name, value = line.split("=", 1) + content[name.strip()] = value.strip() + return content + + def check_for_updates(request): """Check if a new version of Modoboa is available.""" local_config = models.LocalConfig.objects.first() From 7ef26ec31f1646451950032779f4a09c6b3c2e0e Mon Sep 17 00:00:00 2001 From: Henne Date: Tue, 4 Oct 2016 01:24:02 +0200 Subject: [PATCH 17/40] Fixing Cronjob Documentation for 1.6.0 --- doc/getting_started/upgrade.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/getting_started/upgrade.rst b/doc/getting_started/upgrade.rst index 9c41de0f0..54b9c07d8 100644 --- a/doc/getting_started/upgrade.rst +++ b/doc/getting_started/upgrade.rst @@ -59,14 +59,14 @@ for every defined domain. With this, you will quickly now if one the domains you manage is listed or not. To activate it, add the following line to your crontab:: - */30 * * * * /manage.py modo check_mx + */30 * * * * /env/bin/python /manage.py modo check_mx The communication with Modoboa public API has been reworked. Instead of sending direct synchronous queries (for example to check new versions), a cron job has been added. To activate it, add the following line to your crontab:: - 0 * * * * /manage.py communicate_with_public_api + 0 * * * * /env/bin/python /manage.py communicate_with_public_api Please also note that public API now uses TLS so you must update your configuration as follows:: From 82e46ac4e17387c9c833026e6cb5b46aa11a13f1 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 5 Oct 2016 14:16:58 +0200 Subject: [PATCH 18/40] Fix #933 --- modoboa/admin/forms/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index 401829c21..8e9084374 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -292,7 +292,7 @@ class AccountFormMail(forms.Form, DynamicForm): self.add_error("quota", _("Must be a positive integer")) self.aliases = [] self.sender_addresses = [] - for name, value in cleaned_data.iteritems(): + for name, value in cleaned_data.items(): if value == "": continue if name.startswith("aliases"): From 34476b3f9eb8cc0665583f8176b2306b86353b26 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 5 Oct 2016 14:22:54 +0200 Subject: [PATCH 19/40] Fix documentation. --- doc/getting_started/upgrade.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/getting_started/upgrade.rst b/doc/getting_started/upgrade.rst index 54b9c07d8..8f8cb82dc 100644 --- a/doc/getting_started/upgrade.rst +++ b/doc/getting_started/upgrade.rst @@ -59,14 +59,14 @@ for every defined domain. With this, you will quickly now if one the domains you manage is listed or not. To activate it, add the following line to your crontab:: - */30 * * * * /env/bin/python /manage.py modo check_mx + */30 * * * * python /manage.py modo check_mx The communication with Modoboa public API has been reworked. Instead of sending direct synchronous queries (for example to check new versions), a cron job has been added. To activate it, add the following line to your crontab:: - 0 * * * * /env/bin/python /manage.py communicate_with_public_api + 0 * * * * python /manage.py communicate_with_public_api Please also note that public API now uses TLS so you must update your configuration as follows:: From 6421efff563b17bfb7aa1cc7011de73661e0326d Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 5 Oct 2016 14:35:53 +0200 Subject: [PATCH 20/40] Python3 compat/ --- modoboa/admin/forms/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index 8e9084374..63ed90e1e 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -292,7 +292,7 @@ class AccountFormMail(forms.Form, DynamicForm): self.add_error("quota", _("Must be a positive integer")) self.aliases = [] self.sender_addresses = [] - for name, value in cleaned_data.items(): + for name, value in list(cleaned_data.items()): if value == "": continue if name.startswith("aliases"): From 169d07b8fa2701ec160dced69d0099a843e44815 Mon Sep 17 00:00:00 2001 From: Christian Wiegand Date: Thu, 6 Oct 2016 14:49:16 +0200 Subject: [PATCH 21/40] localization of email headers, added the datetime format settings in test_project settings.py with some docs --- .../admin/locale/cs_CZ/LC_MESSAGES/django.po | 151 ++++++++-------- modoboa/admin/locale/de/LC_MESSAGES/django.po | 151 ++++++++-------- modoboa/admin/locale/en/LC_MESSAGES/django.po | 161 +++++++++-------- modoboa/admin/locale/es/LC_MESSAGES/django.po | 163 +++++++++-------- modoboa/admin/locale/fr/LC_MESSAGES/django.po | 168 ++++++++++-------- modoboa/admin/locale/it/LC_MESSAGES/django.po | 151 ++++++++-------- .../admin/locale/ja_JP/LC_MESSAGES/django.po | 161 +++++++++-------- .../admin/locale/nl_NL/LC_MESSAGES/django.po | 151 ++++++++-------- .../admin/locale/pt_BR/LC_MESSAGES/django.po | 151 ++++++++-------- .../admin/locale/pt_PT/LC_MESSAGES/django.po | 151 ++++++++-------- modoboa/admin/locale/ru/LC_MESSAGES/django.po | 151 ++++++++-------- modoboa/admin/locale/sv/LC_MESSAGES/django.po | 151 ++++++++-------- modoboa/lib/templatetags/lib_tags.py | 10 ++ .../limits/locale/cs_CZ/LC_MESSAGES/django.po | 4 +- .../limits/locale/de/LC_MESSAGES/django.po | 4 +- .../limits/locale/en/LC_MESSAGES/django.po | 4 +- .../limits/locale/es/LC_MESSAGES/django.po | 4 +- .../limits/locale/fr/LC_MESSAGES/django.po | 4 +- .../limits/locale/it/LC_MESSAGES/django.po | 4 +- .../limits/locale/ja_JP/LC_MESSAGES/django.po | 4 +- .../limits/locale/nl_NL/LC_MESSAGES/django.po | 4 +- .../limits/locale/pt_BR/LC_MESSAGES/django.po | 4 +- .../limits/locale/pt_PT/LC_MESSAGES/django.po | 4 +- .../limits/locale/ru/LC_MESSAGES/django.po | 4 +- .../limits/locale/sv/LC_MESSAGES/django.po | 4 +- modoboa/locale/cs_CZ/LC_MESSAGES/django.po | 41 +++-- modoboa/locale/de/LC_MESSAGES/django.po | 41 +++-- modoboa/locale/en/LC_MESSAGES/django.po | 36 ++-- modoboa/locale/es/LC_MESSAGES/django.po | 41 +++-- modoboa/locale/fr/LC_MESSAGES/django.po | 106 +++++++---- modoboa/locale/it/LC_MESSAGES/django.po | 41 +++-- modoboa/locale/ja_JP/LC_MESSAGES/django.po | 41 +++-- modoboa/locale/nl_NL/LC_MESSAGES/django.po | 41 +++-- modoboa/locale/pt_BR/LC_MESSAGES/django.po | 41 +++-- modoboa/locale/pt_PT/LC_MESSAGES/django.po | 41 +++-- modoboa/locale/ru/LC_MESSAGES/django.po | 41 +++-- modoboa/locale/sv/LC_MESSAGES/django.po | 41 +++-- .../locale/cs_CZ/LC_MESSAGES/django.po | 2 +- .../locale/de/LC_MESSAGES/django.po | 2 +- .../locale/en/LC_MESSAGES/django.po | 2 +- .../locale/es/LC_MESSAGES/django.po | 2 +- .../locale/fr/LC_MESSAGES/django.po | 2 +- .../locale/it/LC_MESSAGES/django.po | 2 +- .../locale/ja_JP/LC_MESSAGES/django.po | 2 +- .../locale/nl_NL/LC_MESSAGES/django.po | 2 +- .../locale/pt_BR/LC_MESSAGES/django.po | 2 +- .../locale/pt_PT/LC_MESSAGES/django.po | 2 +- .../locale/ru/LC_MESSAGES/django.po | 2 +- .../locale/sv/LC_MESSAGES/django.po | 2 +- modoboa/templates/common/mailheaders.html | 4 +- test_project/test_project/settings.py | 19 ++ 51 files changed, 1384 insertions(+), 1134 deletions(-) diff --git a/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po index 3143e0455..682dda141 100644 --- a/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2015-01-06 10:05+0000\n" "Last-Translator: Miroslav Abrahám \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/" @@ -51,7 +51,7 @@ msgstr "" msgid "Check every domain against major DNSBL providers" msgstr "" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "Schránky" @@ -103,7 +103,7 @@ msgstr "Automatické vytvoření domény/schránky" msgid "Create a domain and a mailbox when an account is automatically created." msgstr "Při založení účtu automaticky vytvořit doménu a schránku." -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "Musí se jednat o kladné číslo" @@ -112,13 +112,13 @@ msgstr "Musí se jednat o kladné číslo" msgid "Administration" msgstr "Správa" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "Identity" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "Přeposlat" @@ -142,7 +142,7 @@ msgstr "Import účtu selhal (%s): chybná hodnota kvóty" msgid "domain alias" msgstr "doménový alias" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "Uživatelské jméno" @@ -154,11 +154,11 @@ msgstr "" "Název uživatele. U běžných uživatelů musí být uvedena platná e-mailová " "adresa nebo u administrátorů schránka." -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "Role" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "Vybrat" @@ -178,32 +178,32 @@ msgstr "Potvrzení" msgid "Enter the same password as above, for verification." msgstr "Vložte stejné heslo jako v poli výše, pro jeho ověření." -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "Povoleno" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "Obě pole s heslem se neshodují." -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "Nemůžete zakázat váš vlastní účet" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "E-mail" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "Kvóta" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -213,12 +213,12 @@ msgstr "" "hodnotu domény. Ponechejte prázdné pro neomezenou kvótu (není povoleno " "správcům domény)." -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "Alias(y)" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -228,13 +228,13 @@ msgstr "" "pro vložení dalšího aliasu. Pro vytvoření doménového koše vložte '*' (např. " "*@domena.cz)." -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 #, fuzzy #| msgid "Invalid request" msgid "Sender addresses" msgstr "Neplatný požadavek" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 #, fuzzy #| msgid "" #| "Mailbox(es) this alias will point to. Indicate only one address per " @@ -248,47 +248,47 @@ msgstr "" "řádek pouze jednu adresu; pro vložení další adresy stiskněte po vložení " "ENTER." -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "Doména neexistuje" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain does not exist" msgstr "Doména neexistuje" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "Doména(y)" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "Doména(y) pod správou uživatele" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "Obecné" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "Mail" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "Oprávnění" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "Účet aktualizován" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "Nový účet" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "Účet vytvořen" @@ -314,7 +314,7 @@ msgstr "" "Alias adresy (bez části označující doménu). Pro vytvoření doménového koše " "vložte znak '*'." -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "Příjemci" @@ -331,26 +331,26 @@ msgstr "" "řádek pouze jednu adresu; pro vložení další adresy stiskněte po vložení " "ENTER." -#: admin/forms/alias.py:92 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 +#: admin/templates/admin/domain_statistics.html:49 +msgid "Domain" +msgstr "Doména" + +#: admin/forms/alias.py:95 msgid "You don't have access to this domain" msgstr "Nemáte oprávnění k přístupu k této doméně" -#: admin/forms/alias.py:109 admin/forms/alias.py:111 +#: admin/forms/alias.py:112 admin/forms/alias.py:114 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required" msgstr "Schránka je vyžadována" -#: admin/forms/alias.py:115 +#: admin/forms/alias.py:118 msgid "No recipient defined" msgstr "Nebyl určen příjemce" -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 -#: admin/templates/admin/domain_statistics.html:49 -msgid "Domain" -msgstr "Doména" - -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "Typ" @@ -388,7 +388,7 @@ msgstr "Vytvořit správce domény" msgid "Automatically create an administrator for this domain" msgstr "Automaticky vytvořit správce této domény" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -419,19 +419,19 @@ msgstr "Neplatný formát" msgid "User '%s' already exists" msgstr "Uživatel '%s' již existuje" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "Doména upravena" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "Možnosti" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "Nová doména" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "Doména vytvořena" @@ -501,20 +501,20 @@ msgstr "Nemůžete smazat vlastní doménu" msgid "You are not allowed to import domain aliases." msgstr "" -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -528,66 +528,66 @@ msgstr "adresa" msgid "The alias address." msgstr "Název aliasu" -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "povoleno" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "Zatrhněte pole pro povolení tohoto aliasu" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "alias" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 #, fuzzy #| msgid "Invalid request" msgid "Invalid address" msgstr "Neplatný požadavek" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 #, fuzzy #| msgid "Local recipient %s not found" msgid "Local recipient {}@{} not found" msgstr "Místní příjemce %s nebyl nalezen" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "Neplatný řádek: %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "Doména '%s' neexistuje" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "název" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "Doménové jméno" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "Zatrhněte pole pro povolení této domény" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "Neplatný řádek" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "Neplatná hodnota kvóty u domény '%s'" @@ -790,34 +790,39 @@ msgstr "" msgid "DNS status" msgstr "Statistiky" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "Datum vytvoření" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "Datum poslední změny" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "Doménové aliasy" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "Aliasy schránek" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "Správci" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "Odstranit toto oprávnění" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 #, fuzzy #| msgid "No domain administrator defined" msgid "No domain administrator defined yet." diff --git a/modoboa/admin/locale/de/LC_MESSAGES/django.po b/modoboa/admin/locale/de/LC_MESSAGES/django.po index 2e8b15f1a..7e338fcce 100644 --- a/modoboa/admin/locale/de/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/de/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2015-09-09 09:33+0000\n" "Last-Translator: controlc.de\n" "Language-Team: German (http://www.transifex.com/tonio/modoboa/language/de/)\n" @@ -52,7 +52,7 @@ msgstr "" msgid "Check every domain against major DNSBL providers" msgstr "" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "Postfächer" @@ -108,7 +108,7 @@ msgstr "" "Erstelle eine Domain und ein Postfach, wenn ein Konto automatisch erstellt " "wurde." -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "Muss eine positive Ganzzahl sein" @@ -117,13 +117,13 @@ msgstr "Muss eine positive Ganzzahl sein" msgid "Administration" msgstr "Verwaltung" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "Identitäten" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "Weiterleiten" @@ -147,7 +147,7 @@ msgstr "Konto Import fehlgeschlagen (%s): ungültiger Quota-Wert" msgid "domain alias" msgstr "Domain-Alias" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "Benutzername" @@ -159,11 +159,11 @@ msgstr "" "Der Benutzername. Muss eine gültige E-Mail-Adresse für 'Normale Benutzer' " "oder Administratoren mit einer Mailbox sein." -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "Rolle" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "Auswählen" @@ -183,32 +183,32 @@ msgstr "Bestätigung" msgid "Enter the same password as above, for verification." msgstr "Passwort bestätigen" -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "Aktiviert" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "Die angegebenen Passwörter stimmen nicht überein" -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "Nur Super-Administratoren dürfen diesen Modus benutzen." -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "Sie können Ihr eigenes Konto nicht deaktivieren" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "E-Mail" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "Quota" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -218,12 +218,12 @@ msgstr "" "nutzen Sie den Standardwert der Domain. Lassen Sie das Feld leer für " "unbegrenztes Quota (Domain-Administratoren ist dies nicht gestattet)." -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "Alias(e)" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -233,13 +233,13 @@ msgstr "" "an. Bestätigen Sie die Eingabe mit ENTER. Geben Sie '*' an, um einen " "'catchall'-Alias (Bsp: *@example.com) zu erstellen." -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 #, fuzzy #| msgid "Invalid address" msgid "Sender addresses" msgstr "Ungültige Adresse" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 #, fuzzy #| msgid "" #| "Addresses this alias will point to. Indicate only one address per input, " @@ -252,47 +252,47 @@ msgstr "" "Adressen, auf die der Alias verweist. Geben Sie jeweils nur eine Adresse ein " "und bestätigen Sie mit ENTER." -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "Domain existiert nicht" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain does not exist" msgstr "Domain existiert nicht" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "Domain(s)" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "Domain(s), die dieser Benutzer administriert" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "Allgemein" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "E-Mail" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "Berechtigungen" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "Konto aktualisiert" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "Neues Konto" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "Konto erstellt" @@ -314,7 +314,7 @@ msgstr "" "Die Alias-Adresse. Geben Sie nur den Domainnamen (@domain.tld) für eine " "'catch-all' Alias an." -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "Empfänger" @@ -326,26 +326,26 @@ msgstr "" "Adressen, auf die der Alias verweist. Geben Sie jeweils nur eine Adresse ein " "und bestätigen Sie mit ENTER." -#: admin/forms/alias.py:92 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 +#: admin/templates/admin/domain_statistics.html:49 +msgid "Domain" +msgstr "Domain" + +#: admin/forms/alias.py:95 msgid "You don't have access to this domain" msgstr "Der Zugriff auf diese Domain ist Ihnen nicht gestattet" -#: admin/forms/alias.py:109 admin/forms/alias.py:111 +#: admin/forms/alias.py:112 admin/forms/alias.py:114 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required" msgstr "Ein Postfach ist erforderlich" -#: admin/forms/alias.py:115 +#: admin/forms/alias.py:118 msgid "No recipient defined" msgstr "Keine Empfänger angegeben" -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 -#: admin/templates/admin/domain_statistics.html:49 -msgid "Domain" -msgstr "Domain" - -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "Typ" @@ -384,7 +384,7 @@ msgstr "Domain-Administrator erstellen" msgid "Automatically create an administrator for this domain" msgstr "Automatisch Administrator für diese Domain anlegen" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -416,19 +416,19 @@ msgstr "Ungültiges Format" msgid "User '%s' already exists" msgstr "Benutzer %s existiert bereits" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "Domain verändert" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "Optionen" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "Neue Domain" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "Domain erstellt." @@ -497,20 +497,20 @@ msgid "You are not allowed to import domain aliases." msgstr "" "Sie verfügen nicht über ausreichend Rechte, um Domain Aliase zu importieren." -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -522,62 +522,62 @@ msgstr "Adresse" msgid "The alias address." msgstr "Die Alias-Adresse" -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "aktiviert" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "Auswählen, um den Alias zu aktivieren" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "Alias" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 msgid "Invalid address" msgstr "Ungültige Adresse" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 msgid "Local recipient {}@{} not found" msgstr "Lokaler Empfänger {}@{} nicht gefunden" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "Ungültige Zeile: %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "Domain '%s' existiert nicht" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "Name" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "Name der Domain" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "Auswählen, um diese Domain zu aktivieren" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "Ungültige Zeile" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "Ungültiger Quota-Wert für Domain '%s'" @@ -780,34 +780,39 @@ msgstr "" msgid "DNS status" msgstr "Statistiken" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "Erstellungsdatum" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "Datum der letzten Änderung" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "Domain-Aliase" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "Postfach-Aliase" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "Administratoren" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "Diese Berechtigung entfernen" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 #, fuzzy #| msgid "No domain administrator defined" msgid "No domain administrator defined yet." diff --git a/modoboa/admin/locale/en/LC_MESSAGES/django.po b/modoboa/admin/locale/en/LC_MESSAGES/django.po index 74537cf91..ff190dc54 100644 --- a/modoboa/admin/locale/en/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -49,7 +49,7 @@ msgstr "" msgid "Check every domain against major DNSBL providers" msgstr "" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "" @@ -97,7 +97,7 @@ msgstr "" msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "" @@ -106,13 +106,13 @@ msgstr "" msgid "Administration" msgstr "" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "" @@ -134,7 +134,7 @@ msgstr "" msgid "domain alias" msgstr "" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "" @@ -144,11 +144,11 @@ msgid "" "administrators with a mailbox." msgstr "" -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "" @@ -168,100 +168,100 @@ msgstr "" msgid "Enter the same password as above, for verification." msgstr "" -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "" -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " "administrators)." msgstr "" -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " "*@domain.tld)." msgstr "" -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 msgid "Sender addresses" msgstr "" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 msgid "" "Additional sender address(es) for this account. The user will be allowed to " "send emails using this address, even if it does not exist locally. Indicate " "one address per input. Press ENTER to add a new input." msgstr "" -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 msgid "Local domain does not exist" msgstr "" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "" @@ -279,7 +279,7 @@ msgid "" "(@domain.tld)." msgstr "" -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "" @@ -289,24 +289,24 @@ msgid "" "press ENTER to add a new input." msgstr "" -#: admin/forms/alias.py:92 -msgid "You don't have access to this domain" -msgstr "" - -#: admin/forms/alias.py:109 admin/forms/alias.py:111 -msgid "This field is required" -msgstr "" - -#: admin/forms/alias.py:115 -msgid "No recipient defined" -msgstr "" - -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 #: admin/templates/admin/domain_statistics.html:49 msgid "Domain" msgstr "" -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/alias.py:95 +msgid "You don't have access to this domain" +msgstr "" + +#: admin/forms/alias.py:112 admin/forms/alias.py:114 +msgid "This field is required" +msgstr "" + +#: admin/forms/alias.py:118 +msgid "No recipient defined" +msgstr "" + +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "" @@ -340,7 +340,7 @@ msgstr "" msgid "Automatically create an administrator for this domain" msgstr "" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -370,19 +370,19 @@ msgstr "" msgid "User '%s' already exists" msgstr "" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "" @@ -448,20 +448,20 @@ msgstr "" msgid "You are not allowed to import domain aliases." msgstr "" -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -473,62 +473,62 @@ msgstr "" msgid "The alias address." msgstr "" -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 msgid "Invalid address" msgstr "" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 msgid "Local recipient {}@{} not found" msgstr "" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "" @@ -701,34 +701,39 @@ msgstr "" msgid "DNS status" msgstr "" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 msgid "No domain administrator defined yet." msgstr "" diff --git a/modoboa/admin/locale/es/LC_MESSAGES/django.po b/modoboa/admin/locale/es/LC_MESSAGES/django.po index 7c882ae45..ac46780e6 100644 --- a/modoboa/admin/locale/es/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/es/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2013-10-01 09:56+0000\n" "Last-Translator: Pedro Gracia \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/modoboa/language/" @@ -52,7 +52,7 @@ msgstr "" msgid "Check every domain against major DNSBL providers" msgstr "" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "Mailboxes" @@ -105,7 +105,7 @@ msgstr "Dominio creado" msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "" @@ -115,13 +115,13 @@ msgstr "" msgid "Administration" msgstr "Administradores" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "Identidades" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "Siguiente" @@ -146,7 +146,7 @@ msgstr "Falló la importación de la cuenta (%s): el dominio no existe" msgid "domain alias" msgstr "Alias del dominio" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "Nombre de usuario" @@ -157,11 +157,11 @@ msgid "" "administrators with a mailbox." msgstr "El usuario normal '%s' debe tener una dirección de email válida" -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "Rol" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "Elija" @@ -181,32 +181,32 @@ msgstr "Confirmación" msgid "Enter the same password as above, for verification." msgstr "Introduzca la misma contraseña que arriba, para verificación." -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "Activado" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "Las contraseñas no concuerdan" -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "No puede deshabilitar su propia cuenta" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "Email" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "Cuota" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -216,12 +216,12 @@ msgstr "" "dominio por defecto. Déjelo vacío para definir un valor ilimitado (no " "permitido para los administradores del dominio)" -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "Alias" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -231,13 +231,13 @@ msgstr "" "ENTER para añadir una nueva entrada. Use el carácter '*' para crear una " "dirección 'catchall' (recogerlos todos, ej. *@domain.tld)" -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 #, fuzzy #| msgid "Invalid request" msgid "Sender addresses" msgstr "Petición inválida" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 #, fuzzy #| msgid "" #| "Mailbox(es) this alias will point to. Indicate only one address per " @@ -250,47 +250,47 @@ msgstr "" "Mailbox(es) a los que apuntará este alias. Indique únicamente una dirección " "por entrada, presione ENTER para añadir una nueva entrada." -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "El dominio no existe" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain does not exist" msgstr "El dominio no existe" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "Dominio(s)" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "Dominio(s) que el usuario administra" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "General" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "Correo" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "Permisos" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "Cuenta actualizada" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "Nueva cuenta" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "Cuenta creada" @@ -316,7 +316,7 @@ msgstr "" "La dirección del alias (sin la parte del dominio). Para una dirección que lo " "recoja todo, ponga un asterisco (*)." -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "Destinatarios" @@ -332,26 +332,26 @@ msgstr "" "Mailbox(es) a los que apuntará este alias. Indique únicamente una dirección " "por entrada, presione ENTER para añadir una nueva entrada." -#: admin/forms/alias.py:92 -msgid "You don't have access to this domain" -msgstr "No tienes acceso a este dominio" - -#: admin/forms/alias.py:109 admin/forms/alias.py:111 -#, fuzzy -msgid "This field is required" -msgstr "Una cuota es obligatoria" - -#: admin/forms/alias.py:115 -msgid "No recipient defined" -msgstr "No ha puesto destinatario" - -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 #: admin/templates/admin/domain_statistics.html:49 #, fuzzy msgid "Domain" msgstr "Dominios" -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/alias.py:95 +msgid "You don't have access to this domain" +msgstr "No tienes acceso a este dominio" + +#: admin/forms/alias.py:112 admin/forms/alias.py:114 +#, fuzzy +msgid "This field is required" +msgstr "Una cuota es obligatoria" + +#: admin/forms/alias.py:118 +msgid "No recipient defined" +msgstr "No ha puesto destinatario" + +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "" @@ -389,7 +389,7 @@ msgstr "Crear un administrador del dominio" msgid "Automatically create an administrator for this domain" msgstr "Automáticamente crear una administrador para este dominio" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -421,19 +421,19 @@ msgstr "Formato inválido" msgid "User '%s' already exists" msgstr "El usuario '%s' ya existe" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "Dominio modificado" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "Opciones" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "Nuevo dominio" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "Dominio creado" @@ -506,20 +506,20 @@ msgstr "No puedo eliminar su propio dominio" msgid "You are not allowed to import domain aliases." msgstr "" -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -533,66 +533,66 @@ msgstr "dirección" msgid "The alias address." msgstr "Nombre del alias" -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "activado" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "Marcar para activar este alias" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "alias" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 #, fuzzy #| msgid "Invalid request" msgid "Invalid address" msgstr "Petición inválida" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 #, fuzzy #| msgid "Local recipient %s not found" msgid "Local recipient {}@{} not found" msgstr "Destinatario local %s no encontrado" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "Línea inválida: %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "El dominio '%s' no existe" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "nombre" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "Nombre del dominio" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "Marcar para activar este dominio" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "Línea inválida" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "" @@ -794,34 +794,39 @@ msgstr "" msgid "DNS status" msgstr "Estadísticas" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "Fecha de creación" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "Última fecha de modificación" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "Alias del dominio" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "Alias del mailbox" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "Administradores" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "Eliminar este permiso" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 #, fuzzy #| msgid "No domain administrator defined" msgid "No domain administrator defined yet." diff --git a/modoboa/admin/locale/fr/LC_MESSAGES/django.po b/modoboa/admin/locale/fr/LC_MESSAGES/django.po index 41f6c6ef6..8c0d64371 100644 --- a/modoboa/admin/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-09-16 13:56+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" @@ -52,7 +52,7 @@ msgstr "Activer les vérifications DNSBL" msgid "Check every domain against major DNSBL providers" msgstr "Vérifie chaque domaine auprès des fournisseurs de DNSBL" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "Boites" @@ -108,7 +108,7 @@ msgstr "" "Créer un domaine et une boite aux lettres quand un compte est créé " "automatiquement." -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "Doit être un entier positif" @@ -117,13 +117,13 @@ msgstr "Doit être un entier positif" msgid "Administration" msgstr "Administration" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "Identités" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "Transfert" @@ -145,7 +145,7 @@ msgstr "L'import du compte a échoué (%s): mauvais quota" msgid "domain alias" msgstr "alias de domaine" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "Nom d'utilisateur" @@ -157,11 +157,11 @@ msgstr "" "Le nom de l'utilisateur. Doit être une adresse e-mail valide pour les " "utilisateurs simples ou les administrateurs avec une boite aux lettres." -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "Rôle" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "Choisir" @@ -181,32 +181,32 @@ msgstr "Confirmation" msgid "Enter the same password as above, for verification." msgstr "Entrer le même mot de passe, pour vérification." -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "Activé" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "Les deux mots de passe ne correspondent pas." -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "Seuls les super administrateurs sont autorisés pour ce mode" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "Vous ne pouvez pas désactiver votre propre compte" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "E-mail" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "Quota" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -216,12 +216,12 @@ msgstr "" "valeur par défaut du domaine. Laisser vide pour définir une valeur illimitée " "(interdit pour les admins. de domaine)." -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "Alias" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -231,11 +231,11 @@ msgstr "" "ENTREE pour ajouter un nouveau champ. Utiliser le caractère '*' pour créer " "une adresse 'attrape tout' (ex: *@domain.tld)." -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 msgid "Sender addresses" msgstr "Adresses d'envoi" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 msgid "" "Additional sender address(es) for this account. The user will be allowed to " "send emails using this address, even if it does not exist locally. Indicate " @@ -246,45 +246,45 @@ msgstr "" "même si elle(s) n'existe(nt) pas localement. Indiquer une adresse par champ. " "Appuyer sur ENTREE pour ajouter un nouveau champ." -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "Domaine inexistant" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 msgid "Local domain does not exist" msgstr "Le domaine local n'existe pas" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "Domaine(s)" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "Domaine(s) que cet utilisateur administre" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "Général" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "Courrier" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "Permissions" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "Compte mis à jour" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "Nouveau compte" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "Compte créé" @@ -304,7 +304,7 @@ msgstr "" "L'adresse de l'alias. Pour créer un alias \"fourre-tout\", saisissez " "uniquement le nom du domaine (@domain.tld)." -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "Destinataires" @@ -316,24 +316,24 @@ msgstr "" "Les adresses vers lesquelles cet alias pointera. Indiquer une adresse par " "champ, appuyer sur ENTREE pour ajouter un nouveau champ." -#: admin/forms/alias.py:92 -msgid "You don't have access to this domain" -msgstr "Vous n'avez pas accès à ce domaine" - -#: admin/forms/alias.py:109 admin/forms/alias.py:111 -msgid "This field is required" -msgstr "Ce champ est requis." - -#: admin/forms/alias.py:115 -msgid "No recipient defined" -msgstr "Aucune destinataire défini" - -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 #: admin/templates/admin/domain_statistics.html:49 msgid "Domain" msgstr "Domaine" -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/alias.py:95 +msgid "You don't have access to this domain" +msgstr "Vous n'avez pas accès à ce domaine" + +#: admin/forms/alias.py:112 admin/forms/alias.py:114 +msgid "This field is required" +msgstr "Ce champ est requis." + +#: admin/forms/alias.py:118 +msgid "No recipient defined" +msgstr "Aucune destinataire défini" + +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "Type" @@ -371,7 +371,7 @@ msgstr "Créer un administrateur de domaine" msgid "Automatically create an administrator for this domain" msgstr "Créer automatiquement un administrateur pour ce domaine" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -403,19 +403,19 @@ msgstr "Format invalide" msgid "User '%s' already exists" msgstr "L'utilisateur '%s' existe déjà" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "Domaine modifié" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "Options" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "Nouveau domaine" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "Domaine créé" @@ -485,20 +485,22 @@ msgstr "Vous n'êtes pas autorisé à importer des domaines" msgid "You are not allowed to import domain aliases." msgstr "Vous n'êtes pas autorisé à importer des alias de domaine." -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] Problème(s) DNSBL pour le domaine {}" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +#, fuzzy +#| msgid "Domain {} as no MX record" +msgid "Domain {} has no MX record" msgstr "Le domaine {} n'a aucun enregistrement MX" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" -msgstr "L'enregistrement MX du domaine {0} n'est pas bon : {1}." +msgid "MX record for domain {0} is invalid: {1}" +msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] problème(s) de MX pour le domaine {}" @@ -510,62 +512,62 @@ msgstr "Adresse" msgid "The alias address." msgstr "L'adresse de l'alias" -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "Activé" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "Cocher pour activer cet alias" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "Description" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "Expire le" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "alias" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 msgid "Invalid address" msgstr "Adresse invalide" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 msgid "Local recipient {}@{} not found" msgstr "Destinataire local {}@{} introuvable" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "Ligne invalide : %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "Domaine '%s' inexistant" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "Nom" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "Le nom du domaine" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "Cocher pour activer ce domaine" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "Ligne invalide" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "Quota invalide pour le domaine '%s'" @@ -740,34 +742,39 @@ msgstr "Aucune information disponible pour ce domaine." msgid "DNS status" msgstr "Statut DNS" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "Date de création" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "Date de dernière modification" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "Alias de domaine" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "Alias de boite." -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "Administrateurs" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "Supprimer cette permission" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 msgid "No domain administrator defined yet." msgstr "Aucun administrateur de domaine défini." @@ -1087,3 +1094,6 @@ msgstr "Importer des identités" #: admin/views/user.py:35 msgid "Forward updated" msgstr "Transfert mis à jour" + +#~ msgid "Domain {0} got an invalid MX record. Got {1}" +#~ msgstr "L'enregistrement MX du domaine {0} n'est pas bon : {1}." diff --git a/modoboa/admin/locale/it/LC_MESSAGES/django.po b/modoboa/admin/locale/it/LC_MESSAGES/django.po index 3535f049c..5f6917311 100644 --- a/modoboa/admin/locale/it/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/it/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2015-10-11 11:48+0000\n" "Last-Translator: Rocco \n" "Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/" @@ -52,7 +52,7 @@ msgstr "" msgid "Check every domain against major DNSBL providers" msgstr "" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "Caselle di posta" @@ -107,7 +107,7 @@ msgstr "" "Crea un dominio ed una casella di posta elettronica quando si crea un " "account utente" -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "Dev'essere un intero positivo" @@ -116,13 +116,13 @@ msgstr "Dev'essere un intero positivo" msgid "Administration" msgstr "Amministrazione" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "Identità" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "Inoltra" @@ -146,7 +146,7 @@ msgstr "Importazione account fallito(%s): valore della quota errato" msgid "domain alias" msgstr "alias del dominio" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "Nome utente" @@ -158,11 +158,11 @@ msgstr "" "Il nome dell'utente. Dev'essere un indirizzo e-mail per gli utenti semplici " "o gli amministratori che posseggono una casella" -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "Ruolo" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "Scegli" @@ -183,32 +183,32 @@ msgid "Enter the same password as above, for verification." msgstr "" "Inserisci la medesima password che hai inserito sopra, per la verifica." -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "Abilitato" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "Le password nei due campi non corrispondono" -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "Solo i super amministratori possono operare in questa modalità" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "Tu non puoi disabilitare il tuo account" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "E-mail" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "Quota" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -218,12 +218,12 @@ msgstr "" "quello predefinito. Lasciare vuoto per non impostare limiti (non consentito " "per gli amministratori di dominio)." -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "Alias" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -233,13 +233,13 @@ msgstr "" "premere INVIO per aggiungere un nuovo elemento. Utilizzare il carattere '*' " "per creare un alias 'prenditutto' (p.es.: *@dominio.org)." -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 #, fuzzy #| msgid "Invalid address" msgid "Sender addresses" msgstr "Indirizzo non valido" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 #, fuzzy #| msgid "" #| "Addresses this alias will point to. Indicate only one address per input, " @@ -252,47 +252,47 @@ msgstr "" "Indirizzi verso il quale questo alias punterà . Indicare un solo indirizzo " "per ogni ingresso , premere INVIO per aggiungere un nuovo input ." -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "Il dominio non esiste" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain does not exist" msgstr "Il dominio non esiste" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "Dominio(i)" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "Dominio(i) amministrato(i) dall'utente" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "Generale" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "Posta" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "Permessi" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "Account aggiornato" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "Nuovo account" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "Account creato" @@ -314,7 +314,7 @@ msgstr "" "Indirizzi email alias. Per creare un alias catchall specifica il nome del " "dominio (@domain.tld)." -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "Destinatari" @@ -326,26 +326,26 @@ msgstr "" "Indirizzi verso il quale questo alias punterà . Indicare un solo indirizzo " "per ogni ingresso , premere INVIO per aggiungere un nuovo input ." -#: admin/forms/alias.py:92 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 +#: admin/templates/admin/domain_statistics.html:49 +msgid "Domain" +msgstr "Dominio" + +#: admin/forms/alias.py:95 msgid "You don't have access to this domain" msgstr "Non hai accesso a questo dominio" -#: admin/forms/alias.py:109 admin/forms/alias.py:111 +#: admin/forms/alias.py:112 admin/forms/alias.py:114 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required" msgstr "É necessaria una casella" -#: admin/forms/alias.py:115 +#: admin/forms/alias.py:118 msgid "No recipient defined" msgstr "Non è stato definito un destinatario" -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 -#: admin/templates/admin/domain_statistics.html:49 -msgid "Domain" -msgstr "Dominio" - -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "Tipo" @@ -383,7 +383,7 @@ msgstr "Crea un amministratore di dominio" msgid "Automatically create an administrator for this domain" msgstr "Crea automaticamente un amministratore per questo dominio" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -415,19 +415,19 @@ msgstr "Formato non valido" msgid "User '%s' already exists" msgstr "L'utente '%s' esiste già" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "Dominio modificato" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "Opzioni" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "Nuovo dominio" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "Dominio creato" @@ -497,20 +497,20 @@ msgstr "Non hai i permessi di importare domini" msgid "You are not allowed to import domain aliases." msgstr "Non hai i permessi di importare gli alias dominio" -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -522,62 +522,62 @@ msgstr "indirizzo" msgid "The alias address." msgstr "Indirizzi Alias." -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "Attivato" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "Seleziona per attivare questo alias" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "alias" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 msgid "Invalid address" msgstr "Indirizzo non valido" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 msgid "Local recipient {}@{} not found" msgstr "Destinatario locale {}@{} non trovato" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "Riga non valida: %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "Il dominio '%s' non esiste" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "nome" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "Il nome del dominio" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "Seleziona per attivare questo dominio" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "Riga non valida" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "Valore della quota non valido per il dominio '%s'" @@ -780,34 +780,39 @@ msgstr "" msgid "DNS status" msgstr "Statistiche" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "Data di creazione" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "Data dell'ultima modifica" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "Alias del dominio" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "Alias delle caselle di posta" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "Amministratori" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "Rimuovi questo permesso" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 #, fuzzy #| msgid "No domain administrator defined" msgid "No domain administrator defined yet." diff --git a/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po index 64bf90577..ae5df9fce 100644 --- a/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-09-14 17:06+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/" @@ -51,7 +51,7 @@ msgstr "DNSBL チェックを有効にする" msgid "Check every domain against major DNSBL providers" msgstr "すべてのドメインを 主な DNSBL プロバイダーでチェックする" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "メールボックス" @@ -105,7 +105,7 @@ msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" "アカウントが自動的に作成されたとき、ドメインとメールボックを作成します。" -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "正の整数でなければいけません" @@ -114,13 +114,13 @@ msgstr "正の整数でなければいけません" msgid "Administration" msgstr "管理" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "ID" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "転送先" @@ -142,7 +142,7 @@ msgstr "アカウントのインポートに失敗しました (%s): 不正な msgid "domain alias" msgstr "ドメインエイリアス" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "ユーザー名" @@ -155,11 +155,11 @@ msgstr "" "メールボックスを持つユーザーもしくは管理者の有効な電子メールアドレスでなけれ" "ばなりません。" -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "ロール" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "選ぶ" @@ -179,32 +179,32 @@ msgstr "確認" msgid "Enter the same password as above, for verification." msgstr "確認のため、上記と同じパスワードを入力します。" -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "有効化" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "2つのパスワード項目が一致しません" -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "スーパー管理者だけが、このモードのために許可されています。" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "あなた自身のアカウントは無効化できません" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "電子メール" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "クォータ" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -215,12 +215,12 @@ msgstr "" "無制限の値を定義する場合は空白のままにします\n" "(ドメイン管理者には許可されていません)" -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "エイリアス" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -232,56 +232,56 @@ msgstr "" " 「キャッチオール」エイリアスを作成するには、 ' * '文字を使用してください " "(例: *@domain.tld)" -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 msgid "Sender addresses" msgstr "" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 msgid "" "Additional sender address(es) for this account. The user will be allowed to " "send emails using this address, even if it does not exist locally. Indicate " "one address per input. Press ENTER to add a new input." msgstr "" -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "ドメインは存在しません" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 msgid "Local domain does not exist" msgstr "ローカルドメインは存在しません" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "ドメイン" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "ユーザーに管理されたドメイン" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "全般" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "メール" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "アクセス許可" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "アカウントを更新しました" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "新しいアカウト" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "アカウントを作成しました" @@ -304,7 +304,7 @@ msgstr "" "キャッチオールエイリアスを作成するためには、ドメイン名だけを入力します " "(@domain.tld)" -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "受信者" @@ -317,24 +317,24 @@ msgstr "" "input ごとに1つだけのアドレスを記入し、 ENTER キーを押して、新しい input を追" "加します" -#: admin/forms/alias.py:92 -msgid "You don't have access to this domain" -msgstr "このドメインにアクセスする権限がありません" - -#: admin/forms/alias.py:109 admin/forms/alias.py:111 -msgid "This field is required" -msgstr "" - -#: admin/forms/alias.py:115 -msgid "No recipient defined" -msgstr "受信者が定義されていません" - -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 #: admin/templates/admin/domain_statistics.html:49 msgid "Domain" msgstr "ドメイン" -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/alias.py:95 +msgid "You don't have access to this domain" +msgstr "このドメインにアクセスする権限がありません" + +#: admin/forms/alias.py:112 admin/forms/alias.py:114 +msgid "This field is required" +msgstr "" + +#: admin/forms/alias.py:118 +msgid "No recipient defined" +msgstr "受信者が定義されていません" + +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "タイプ" @@ -373,7 +373,7 @@ msgstr "ドメイン管理者を作成する" msgid "Automatically create an administrator for this domain" msgstr "自動的にドメインの管理者を作成する" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -405,19 +405,19 @@ msgstr "不正なフォーマット" msgid "User '%s' already exists" msgstr "ユーザー %s はすでに存在します" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "ドメインが修正されました" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "オプション" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "新しいドメイン" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "ドメインが作成されました" @@ -487,20 +487,20 @@ msgstr "ドメインのインポートは許可されていません" msgid "You are not allowed to import domain aliases." msgstr "ドメインエイリアスのインポートは許可されていません" -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] ドメイン {} の DNSBL結果" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -512,62 +512,62 @@ msgstr "アドレス" msgid "The alias address." msgstr "エイリアスアドレス" -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "有効" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "このエイリアスをアクティブにするために確認してください" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "エイリアス" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 msgid "Invalid address" msgstr "不正なアドレス" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 msgid "Local recipient {}@{} not found" msgstr "ローカル受信者 {}@{} は見つかりません" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "不正な行: %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "ドメイン %s は、存在しません" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "名前" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "ドメイン名" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "このドメインをアクティブするために確認してください" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "不正な行" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "不正なドメイン %s のクォータ値" @@ -742,34 +742,39 @@ msgstr "このドメインに関する情報がありません。" msgid "DNS status" msgstr "ステータス" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "作成日時" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "最終修正日時" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "ドメインエイリアス" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "メールボックスエイリアス" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "管理者" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "このパーミッションを削除" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 msgid "No domain administrator defined yet." msgstr "ドメイン管理者が指定されていません" diff --git a/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po index a3afbfc33..dc0f236c9 100644 --- a/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-31 11:37+0000\n" "Last-Translator: TuxBrother \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" @@ -52,7 +52,7 @@ msgstr "" msgid "Check every domain against major DNSBL providers" msgstr "" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "Mailboxen" @@ -107,7 +107,7 @@ msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" "Maak een domein en mailbox aan wanneer een account automatisch is aangemaakt." -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "Dit moet een positive integer zijn." @@ -116,13 +116,13 @@ msgstr "Dit moet een positive integer zijn." msgid "Administration" msgstr "Administratie" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "Identiteiten" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "Doorsturen" @@ -146,7 +146,7 @@ msgstr "Account import is mislukt (%s): verkeerd quotum waarde" msgid "domain alias" msgstr "domein alias" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "Gebruikersnaam" @@ -158,11 +158,11 @@ msgstr "" "De naam van de gebruiker. Moet een geldig e-mail adres zijn voor gebruikers " "of administrators met een mailbox." -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "Regel" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "Kiezen" @@ -182,32 +182,32 @@ msgstr "Bevestiging" msgid "Enter the same password as above, for verification." msgstr "Herhaal wachtwoord (voor verificatie)" -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "Actief" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "De wachtwoorden komen niet overeen." -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "U kunt uw eigen account niet uitschakelen" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "E-mail" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "Quota" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -217,12 +217,12 @@ msgstr "" "stanaard waarde van het domein. Laat leeg om een ongelimiteerde waarde te " "definieren (niet toegestaan voor domein administrators)." -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "Alias(sen)" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -232,13 +232,13 @@ msgstr "" "ENTER om een nieuwe regel te krijgen. Gebruik een wildcard '*' om een 'catch-" "all' adres te maken (bijvoorbeeld: *@domein.tld)." -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 #, fuzzy #| msgid "Invalid request" msgid "Sender addresses" msgstr "Ongeldig verzoek" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 #, fuzzy #| msgid "" #| "Mailbox(es) this alias will point to. Indicate only one address per " @@ -251,47 +251,47 @@ msgstr "" "Mailbox(en) waarnaar deze alias zal verwijzen. Geef slechts een adres per " "regel op, en toets ENTER om een nieuwe regel te krijgen." -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "Domein bestaat niet" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain does not exist" msgstr "Domein bestaat niet" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "Domein(en)" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "Domein(en) die gebruiker mag beheren" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "Algemeen" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "Mail" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "Rechten" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "Account aangepast" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "Nieuwe account" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "Account aangemaakt" @@ -317,7 +317,7 @@ msgstr "" "Het alias adres (zonder het domein deel). Voor een 'catch-all' adres, vul " "een * in." -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "Ontvangers" @@ -333,26 +333,26 @@ msgstr "" "Mailbox(en) waarnaar deze alias zal verwijzen. Geef slechts een adres per " "regel op, en toets ENTER om een nieuwe regel te krijgen." -#: admin/forms/alias.py:92 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 +#: admin/templates/admin/domain_statistics.html:49 +msgid "Domain" +msgstr "Domein" + +#: admin/forms/alias.py:95 msgid "You don't have access to this domain" msgstr "U heeft geen toegang tot dit domein" -#: admin/forms/alias.py:109 admin/forms/alias.py:111 +#: admin/forms/alias.py:112 admin/forms/alias.py:114 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required" msgstr "Een mailbox is benodigd" -#: admin/forms/alias.py:115 +#: admin/forms/alias.py:118 msgid "No recipient defined" msgstr "Geen ontvanger opgegeven" -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 -#: admin/templates/admin/domain_statistics.html:49 -msgid "Domain" -msgstr "Domein" - -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "Type" @@ -390,7 +390,7 @@ msgstr "Maak een domein administrator aan" msgid "Automatically create an administrator for this domain" msgstr "Automatisch een administrator aanmaken voor dit domein" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -421,19 +421,19 @@ msgstr "Verkeerd formaat" msgid "User '%s' already exists" msgstr "Gebruiker '%s' bestaat al" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "Domein gewijzigd" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "Opties" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "Nieuw domein" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "Domein aangemaakt" @@ -504,20 +504,20 @@ msgstr "U kunt uw eigen domein niet verwijderen" msgid "You are not allowed to import domain aliases." msgstr "" -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -531,66 +531,66 @@ msgstr "adres" msgid "The alias address." msgstr "De alias naam" -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "actief" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "Aanvinken om deze alias te activeren" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "alias" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 #, fuzzy #| msgid "Invalid request" msgid "Invalid address" msgstr "Ongeldig verzoek" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 #, fuzzy #| msgid "Local recipient %s not found" msgid "Local recipient {}@{} not found" msgstr "Lokale ontvanger %s niet gevonden" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "Ongeldige regel: %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "Domein '%s' bestaat niet" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "naam" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "De domeinnaam" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "Aanvinken om dit domein te activeren" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "Verkeerde regel" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "Verkeerde quota waarde voor domein '%s'" @@ -793,34 +793,39 @@ msgstr "" msgid "DNS status" msgstr "Statistieken" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "Datum van aanmaken" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "Laatst gewijzigd" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "Domein aliassen" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "Mailbox aliassen" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "Administrators" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "Deze bevoegdheid verwijderen" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 #, fuzzy #| msgid "No domain administrator defined" msgid "No domain administrator defined yet." diff --git a/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po index 989bc4f9e..b211f5534 100644 --- a/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-05-17 12:28+0000\n" "Last-Translator: Jose Marcos Araujo \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/" @@ -54,7 +54,7 @@ msgstr "" msgid "Check every domain against major DNSBL providers" msgstr "" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "Caixas de correios" @@ -109,7 +109,7 @@ msgstr "" "Criar um domínio e uma caixa de correio quando uma conta é automaticamente " "criada." -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "Deve ser um inteiro positivo" @@ -118,13 +118,13 @@ msgstr "Deve ser um inteiro positivo" msgid "Administration" msgstr "Administração" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "Identidades" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "Encaminhar" @@ -146,7 +146,7 @@ msgstr "Falha na importação de conta (%s): valor de cota errado" msgid "domain alias" msgstr "alias de domínio" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "Nome de usuário" @@ -158,11 +158,11 @@ msgstr "" "O nome de usuário. Deve ser um endereço de e-mail válido para usuários " "simples ou administradores com uma caixa de mensagens." -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "Papel" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "Escolher" @@ -182,32 +182,32 @@ msgstr "Confirmação" msgid "Enter the same password as above, for verification." msgstr "Para verificação, digite a mesma senha que a anterior." -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "Ativado" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "Os dois campos de senha não coincidiram." -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "Apenas super administradores estão liberados para este modo" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "Você não pode desabilitar seu própria conta" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "E-mail" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "Cota" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -217,12 +217,12 @@ msgstr "" "o padrão do domínio. Deixe em branco para definir um valor ilimitado (não " "permitido para administradores de domínios)." -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "Alias(es)" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -232,13 +232,13 @@ msgstr "" "entrada, pressione ENTER para adicionar uma nova entrada. Use o caractere " "'*' para criar um alias 'pega-todos' (ex: *@exemplo.com)." -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 #, fuzzy #| msgid "Invalid address" msgid "Sender addresses" msgstr "Endereço inválido" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 #, fuzzy #| msgid "" #| "Addresses this alias will point to. Indicate only one address per input, " @@ -251,45 +251,45 @@ msgstr "" "Endereços que este alias vai apontar. Indique apenas um endereço por " "entrada, pressione ENTER para adicionar uma nova entrada." -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "Domínio não existe" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 msgid "Local domain does not exist" msgstr "Domínio local não existe" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "Domínio(s)" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "Domínio(s) que o usuário administra" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "Geral" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "Correio" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "Permissões" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "Conta atualizada" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "Nova conta" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "Conta criada" @@ -311,7 +311,7 @@ msgstr "" "O endereço alias. Para criar um alias de captura, basta digitar o nome de " "domínio (@domain.tld)." -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "Destinatários" @@ -323,26 +323,26 @@ msgstr "" "Endereços que este alias vai apontar. Indique apenas um endereço por " "entrada, pressione ENTER para adicionar uma nova entrada." -#: admin/forms/alias.py:92 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 +#: admin/templates/admin/domain_statistics.html:49 +msgid "Domain" +msgstr "Domínio" + +#: admin/forms/alias.py:95 msgid "You don't have access to this domain" msgstr "Você não tem acesso a esse domínio" -#: admin/forms/alias.py:109 admin/forms/alias.py:111 +#: admin/forms/alias.py:112 admin/forms/alias.py:114 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required" msgstr "Um caixa de mensagens é obrigatória" -#: admin/forms/alias.py:115 +#: admin/forms/alias.py:118 msgid "No recipient defined" msgstr "Nenhum destinatário definido" -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 -#: admin/templates/admin/domain_statistics.html:49 -msgid "Domain" -msgstr "Domínio" - -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "Tipo" @@ -380,7 +380,7 @@ msgstr "Criar um administrador de domínio" msgid "Automatically create an administrator for this domain" msgstr "Criar automaticamente um administrador para este domínio" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -412,19 +412,19 @@ msgstr "Formato inválido" msgid "User '%s' already exists" msgstr "O usuário '%s' já existe" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "Domínio alterado" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "Opções" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "Novo domínio" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "Domínio criado" @@ -493,20 +493,20 @@ msgstr "Você não tem permissão para importar domínios" msgid "You are not allowed to import domain aliases." msgstr "Você não tem permissão para importar aliases de domínio." -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -518,62 +518,62 @@ msgstr "endereço" msgid "The alias address." msgstr "O endereço alias." -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "ativado" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "Verificar para ativar o alias" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "alias" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 msgid "Invalid address" msgstr "Endereço inválido" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 msgid "Local recipient {}@{} not found" msgstr "Destinatário local {}@{} não encontrado" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "Linha inválida: %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "O domínio '%s' não existe" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "nome" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "Nome do domínio" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "Marque para ativar esse domínio" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "Linha inválida" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "Valor de cota inválido para o domínio '%s'" @@ -772,34 +772,39 @@ msgstr "" msgid "DNS status" msgstr "Estatísticas" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "Data de criação" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "Data da última modificação" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "Alias de domínios" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "Alias de caixas de correio" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "Administradores" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "Remover essa persmissão" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 #, fuzzy #| msgid "No domain administrator defined" msgid "No domain administrator defined yet." diff --git a/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po index 8c4947eed..2f0622c79 100644 --- a/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-29 12:51+0000\n" "Last-Translator: Mike C. \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" @@ -56,7 +56,7 @@ msgstr "" msgid "Check every domain against major DNSBL providers" msgstr "" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "Caixas de Correio" @@ -111,7 +111,7 @@ msgstr "" "Criar um dominio e uma caixa de correio quando uma conta é criada " "automátiamente." -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "Tem de ser um inteiro, positivo" @@ -120,13 +120,13 @@ msgstr "Tem de ser um inteiro, positivo" msgid "Administration" msgstr "Administração" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "Identidades" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "Reencaminhar" @@ -150,7 +150,7 @@ msgstr "Importação da conta falhou (%s): valor para quota inválido" msgid "domain alias" msgstr "'Alias' de domínio" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "Nome de Utilizador" @@ -160,11 +160,11 @@ msgid "" "administrators with a mailbox." msgstr "" -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "Papel" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "Escolher" @@ -184,32 +184,32 @@ msgstr "Confirmação" msgid "Enter the same password as above, for verification." msgstr "Repita a password acima, para verificação." -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "Ativo" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "Os dois campos de password não são idênticos." -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "Não pode desativar a sua própria conta" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "E-mail" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "Quota" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -219,12 +219,12 @@ msgstr "" "usar o valor predefinido pelo domínio. Deixar em branco para definir uma " "valor ilimitado (não permitido para administradores do domínio)." -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "Alias(es)" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -234,13 +234,13 @@ msgstr "" "clique ENTER para adicionar uma nova entrada. Use o '*' para criar um alias " "'catchall' (ex: *@domain.tld)." -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 #, fuzzy #| msgid "Invalid request" msgid "Sender addresses" msgstr "Pedido inválido" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 #, fuzzy #| msgid "" #| "Mailbox(es) this alias will point to. Indicate only one address per " @@ -253,47 +253,47 @@ msgstr "" "Caixa(s) de correio para o qual este 'alias' aponta. Indicar apenas um " "endereço por entrada, pressionar ENTER para acrescentar uma nova entrada." -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "O domínio não existe" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain does not exist" msgstr "O domínio não existe" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "Domínio(s)" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "Domínio(s) administrado pelo utilizador" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "Geral" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "Correio" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "Permissões" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "Conta actualizada" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "Nova conta" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "Conta criada" @@ -319,7 +319,7 @@ msgstr "" "O endereço do alias (sem a parte do domínio). Para um endereço 'cath-all', " "digite apenas o caractere *" -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "Destinatários" @@ -335,26 +335,26 @@ msgstr "" "Caixa(s) de correio para o qual este 'alias' aponta. Indicar apenas um " "endereço por entrada, pressionar ENTER para acrescentar uma nova entrada." -#: admin/forms/alias.py:92 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 +#: admin/templates/admin/domain_statistics.html:49 +msgid "Domain" +msgstr "Domínio" + +#: admin/forms/alias.py:95 msgid "You don't have access to this domain" msgstr "Não tem acesso a este domínio" -#: admin/forms/alias.py:109 admin/forms/alias.py:111 +#: admin/forms/alias.py:112 admin/forms/alias.py:114 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required" msgstr "É necessária uma caixa de correio" -#: admin/forms/alias.py:115 +#: admin/forms/alias.py:118 msgid "No recipient defined" msgstr "Sem destinatário definido" -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 -#: admin/templates/admin/domain_statistics.html:49 -msgid "Domain" -msgstr "Domínio" - -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "Tipo" @@ -392,7 +392,7 @@ msgstr "Criar um administrador de domínio" msgid "Automatically create an administrator for this domain" msgstr "Criar automaticamente um administrador para este domínio" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -424,19 +424,19 @@ msgstr "Formato inválido" msgid "User '%s' already exists" msgstr "O utilizador '%s' já existe" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "Domínio alterado" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "Opções" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "Novo domínio" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "Domínio criado" @@ -507,20 +507,20 @@ msgstr "Não é possível eliminar o seu próprio domínio" msgid "You are not allowed to import domain aliases." msgstr "" -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -534,66 +534,66 @@ msgstr "endereços" msgid "The alias address." msgstr "O nome do 'alias'" -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "ativo" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "Marcar para ativar este alias" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "alias" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 #, fuzzy #| msgid "Invalid request" msgid "Invalid address" msgstr "Pedido inválido" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 #, fuzzy #| msgid "Local recipient %s not found" msgid "Local recipient {}@{} not found" msgstr "O destinatário local %s não foi encontrado" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "Linha inválida: %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "O domínio '%s' não existe" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "nome" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "O nome do domínio" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "Marcar para ativar este domínio" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "Linha inválida" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "Valor de quota inválido para o dominio '%s'" @@ -796,34 +796,39 @@ msgstr "" msgid "DNS status" msgstr "Estatísticas" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "Data de criação" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "Data da última modificação" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "Aliases de domínio" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "Aliases para caixas de correio" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "Administradores" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "Remover esta permissão" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 #, fuzzy #| msgid "No domain administrator defined" msgid "No domain administrator defined yet." diff --git a/modoboa/admin/locale/ru/LC_MESSAGES/django.po b/modoboa/admin/locale/ru/LC_MESSAGES/django.po index ab0cb930d..3fe74fc56 100644 --- a/modoboa/admin/locale/ru/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2013-12-03 09:35+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Russian (http://www.transifex.com/projects/p/modoboa/language/" @@ -51,7 +51,7 @@ msgstr "" msgid "Check every domain against major DNSBL providers" msgstr "" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "Почтовые ящики" @@ -103,7 +103,7 @@ msgstr "Домен создан" msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "" @@ -112,13 +112,13 @@ msgstr "" msgid "Administration" msgstr "" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "Пользователи" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "Перенаправленые" @@ -142,7 +142,7 @@ msgstr "Ошибка импорта аккаунта (%s): домен долже msgid "domain alias" msgstr "" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "Логин пользователя" @@ -152,11 +152,11 @@ msgid "" "administrators with a mailbox." msgstr "" -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "Роль" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "Выбрать" @@ -176,32 +176,32 @@ msgstr "Подтверждение" msgid "Enter the same password as above, for verification." msgstr "Введите такой же пароль как выше. Для проверки." -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "Разрешено" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "Пароли не совпадают" -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "Вы не можете запретить собственный аккаунт" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "Е-майл" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "Квота" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -212,12 +212,12 @@ msgstr "" "Оставьте пустым для неограниченного значения. (Не разрешено администраторам " "домена)" -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "Синоним(ы)" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -226,13 +226,13 @@ msgstr "" "Синонимы этого почтового ящика. Вводите один адрес за раз. Нажмите ENTER для " "добавления. Используйте '*' для создания синонима 'для всех' (*@domain.tld)" -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 #, fuzzy #| msgid "Invalid request" msgid "Sender addresses" msgstr "Ошибочный запрос" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 #, fuzzy #| msgid "" #| "Mailbox(es) this alias will point to. Indicate only one address per " @@ -245,47 +245,47 @@ msgstr "" "Этот синоним почтового ящика. Вводите один адрес за раз. Нажмите ENTER для " "добавления." -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "Домен не существует" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain does not exist" msgstr "Домен не существует" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "Домен(ы)" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "Домен(ы) администрируемые пользователем" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "Основные" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "Почта" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "Права" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "аккаунт изменен" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "Новый аккаунт" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "Аккаунт создан" @@ -311,7 +311,7 @@ msgstr "" "Адреса синонимов (без доменной части). Для указания адреса 'для всех' " "введите символ *" -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "Получатели" @@ -327,26 +327,26 @@ msgstr "" "Этот синоним почтового ящика. Вводите один адрес за раз. Нажмите ENTER для " "добавления." -#: admin/forms/alias.py:92 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 +#: admin/templates/admin/domain_statistics.html:49 +msgid "Domain" +msgstr "" + +#: admin/forms/alias.py:95 msgid "You don't have access to this domain" msgstr "Вы не имеете права доступа к этому домену" -#: admin/forms/alias.py:109 admin/forms/alias.py:111 +#: admin/forms/alias.py:112 admin/forms/alias.py:114 #, fuzzy #| msgid "A quota is required" msgid "This field is required" msgstr "Требуется квота" -#: admin/forms/alias.py:115 +#: admin/forms/alias.py:118 msgid "No recipient defined" msgstr "Получатель не определен" -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 -#: admin/templates/admin/domain_statistics.html:49 -msgid "Domain" -msgstr "" - -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "" @@ -382,7 +382,7 @@ msgstr "Создание администратора домена" msgid "Automatically create an administrator for this domain" msgstr "Автоматически создаст администратора для этого домена" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -414,19 +414,19 @@ msgstr "Неверный формат" msgid "User '%s' already exists" msgstr "Пользователь '%s' уже существует" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "Домен изменен" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "Опции" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "Новый домен" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "Домен создан" @@ -498,20 +498,20 @@ msgstr "Вы не можете удалить собственный домен" msgid "You are not allowed to import domain aliases." msgstr "" -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -525,66 +525,66 @@ msgstr "адрес" msgid "The alias address." msgstr "Имя синонима" -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "Разрешен" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "Отметить для активации синонима" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "Синоним" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 #, fuzzy #| msgid "Invalid request" msgid "Invalid address" msgstr "Ошибочный запрос" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 #, fuzzy #| msgid "Local recipient %s not found" msgid "Local recipient {}@{} not found" msgstr "Локальный получатель %s не найден" -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "Неверная строка %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "Домен '%s' не существует" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "имя" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "Имя домена" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "Отметить для активации этого домена" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "Ошибочная строка" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "" @@ -786,34 +786,39 @@ msgstr "" msgid "DNS status" msgstr "Статистика" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "Дата создания" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "Дата последней модификации" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "Синонимы доменов" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "Синонимы почтового ящика" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "Администраторы" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "Удалить это разрешение" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 #, fuzzy #| msgid "No domain administrator defined" msgid "No domain administrator defined yet." diff --git a/modoboa/admin/locale/sv/LC_MESSAGES/django.po b/modoboa/admin/locale/sv/LC_MESSAGES/django.po index 3958c9478..f6c26d3fe 100644 --- a/modoboa/admin/locale/sv/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/sv/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-05-30 18:05+0000\n" "Last-Translator: Olle Gustafsson \n" "Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/" @@ -52,7 +52,7 @@ msgstr "" msgid "Check every domain against major DNSBL providers" msgstr "" -#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html.py:40 +#: admin/app_settings.py:84 admin/templates/admin/domain_detail.html:44 msgid "Mailboxes" msgstr "Brevlådor" @@ -104,7 +104,7 @@ msgstr "Automatisk skapande av domän/brevlåda" msgid "Create a domain and a mailbox when an account is automatically created." msgstr "Skapa en domän och en brevlåda när ett konto skapas automatiskt." -#: admin/app_settings.py:170 admin/forms/account.py:279 +#: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 msgid "Must be a positive integer" msgstr "Måste vara ett positivt heltal" @@ -113,13 +113,13 @@ msgstr "Måste vara ett positivt heltal" msgid "Administration" msgstr "Administration" -#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html.py:36 +#: admin/callbacks.py:35 admin/templates/admin/domain_statistics.html:36 #: admin/templates/admin/domain_statistics.html:50 #: admin/templates/admin/identities.html:5 msgid "Identities" msgstr "Konton" -#: admin/callbacks.py:50 admin/templates/admin/forward.html.py:2 +#: admin/callbacks.py:50 admin/templates/admin/forward.html:2 msgid "Forward" msgstr "Vidarebefordra" @@ -141,7 +141,7 @@ msgstr "Importering av konto misslyckades (%s): Fel kvota värde" msgid "domain alias" msgstr "domän alias" -#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/account.py:33 admin/templates/admin/domain_detail.html:72 msgid "Username" msgstr "Användarnamn" @@ -153,11 +153,11 @@ msgstr "" "Användarens namn. Måste vara en giltig e-postadress för vanliga användare " "eller för administratörer med brevlåda." -#: admin/forms/account.py:40 admin/templates/admin/account_detail.html.py:29 +#: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" msgstr "Roll" -#: admin/forms/account.py:41 admin/forms/account.py:79 +#: admin/forms/account.py:41 msgid "Choose" msgstr "Välj" @@ -177,32 +177,32 @@ msgstr "Bekräftelse" msgid "Enter the same password as above, for verification." msgstr "Ange samma lösenord som ovan för verifiering." -#: admin/forms/account.py:70 +#: admin/forms/account.py:63 msgid "Enabled" msgstr "Aktiverad" -#: admin/forms/account.py:142 +#: admin/forms/account.py:155 msgid "The two password fields didn't match." msgstr "Dessa två lösnordsfält matchar inte." -#: admin/forms/account.py:157 +#: admin/forms/account.py:170 msgid "Only super administrators are allowed for this mode" msgstr "Endast superadmininstratörer tillåts åtkomst till det här läget" -#: admin/forms/account.py:165 +#: admin/forms/account.py:178 msgid "You can't disable your own account" msgstr "Du kan inte inaktivera ditt eget konto" -#: admin/forms/account.py:180 +#: admin/forms/account.py:193 msgid "E-mail" msgstr "E-post" -#: admin/forms/account.py:182 admin/forms/domain.py:36 +#: admin/forms/account.py:195 admin/forms/domain.py:36 #: admin/templates/admin/account_detail.html:45 msgid "Quota" msgstr "Kvot" -#: admin/forms/account.py:184 +#: admin/forms/account.py:197 msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " @@ -212,12 +212,12 @@ msgstr "" "domänens förvalda. Lämna tomt för att definiera ett obegränsat värde (ej " "tillåtet för domänadministratörer)." -#: admin/forms/account.py:192 admin/forms/domain.py:44 +#: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 msgid "Alias(es)" msgstr "Alias" -#: admin/forms/account.py:195 +#: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " @@ -227,13 +227,13 @@ msgstr "" "lägga till ny rad. Använd '*' för att skapa ett 'catchall' alias (ex: " "*@domain.tld)." -#: admin/forms/account.py:201 +#: admin/forms/account.py:214 #, fuzzy #| msgid "Invalid address" msgid "Sender addresses" msgstr "Ogiltigt adress" -#: admin/forms/account.py:204 +#: admin/forms/account.py:217 #, fuzzy #| msgid "" #| "Addresses this alias will point to. Indicate only one address per input, " @@ -246,45 +246,45 @@ msgstr "" "Adresser detta alias kommer peka på. Ange bara en adress per fält, tryck " "RETUR för att lägga till ytterligare." -#: admin/forms/account.py:258 admin/forms/alias.py:89 +#: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 msgid "Domain does not exist" msgstr "Domän existerar inte" -#: admin/forms/account.py:288 +#: admin/forms/account.py:301 msgid "Local domain does not exist" msgstr "Lokal domän existerar inte" -#: admin/forms/account.py:386 +#: admin/forms/account.py:399 msgid "Domain(s)" msgstr "Domän(er)" -#: admin/forms/account.py:388 +#: admin/forms/account.py:401 msgid "Domain(s) that user administrates" msgstr "Domän(er) användaren administrerar" -#: admin/forms/account.py:434 admin/forms/account.py:518 -#: admin/forms/domain.py:266 admin/forms/domain.py:336 +#: admin/forms/account.py:447 admin/forms/account.py:532 +#: admin/forms/domain.py:266 admin/forms/domain.py:332 msgid "General" msgstr "Generellt" -#: admin/forms/account.py:439 admin/forms/account.py:524 +#: admin/forms/account.py:452 admin/forms/account.py:538 msgid "Mail" msgstr "Post" -#: admin/forms/account.py:441 +#: admin/forms/account.py:454 msgid "Permissions" msgstr "Rättigheter" -#: admin/forms/account.py:507 +#: admin/forms/account.py:521 msgid "Account updated" msgstr "Konto uppdaterat" -#: admin/forms/account.py:531 +#: admin/forms/account.py:545 msgid "New account" msgstr "Nytt konto" -#: admin/forms/account.py:543 +#: admin/forms/account.py:557 msgid "Account created" msgstr "Konto skapat" @@ -305,7 +305,7 @@ msgid "" msgstr "" "Alias adress. För en \"catch-all\"-alias, ange bara domännamnet (@domän.tld)." -#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html.py:37 +#: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" msgstr "Mottagare" @@ -317,26 +317,26 @@ msgstr "" "Adresser detta alias kommer peka på. Ange bara en adress per fält, tryck " "RETUR för att lägga till ytterligare." -#: admin/forms/alias.py:92 +#: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 +#: admin/templates/admin/domain_statistics.html:49 +msgid "Domain" +msgstr "Domän" + +#: admin/forms/alias.py:95 msgid "You don't have access to this domain" msgstr "Du har inte åtkomst till denna domän" -#: admin/forms/alias.py:109 admin/forms/alias.py:111 +#: admin/forms/alias.py:112 admin/forms/alias.py:114 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required" msgstr "En brevlåda krävs" -#: admin/forms/alias.py:115 +#: admin/forms/alias.py:118 msgid "No recipient defined" msgstr "Ingen mottagare definierad" -#: admin/forms/domain.py:24 admin/models/alias.py:37 admin/models/domain.py:87 -#: admin/templates/admin/domain_statistics.html:49 -msgid "Domain" -msgstr "Domän" - -#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html.py:26 +#: admin/forms/domain.py:33 admin/templates/admin/domain_statistics.html:26 msgid "Type" msgstr "Typ" @@ -374,7 +374,7 @@ msgstr "Skapa en domän administratör" msgid "Automatically create an administrator for this domain" msgstr "Skapa en domän administratör automatiskt för denna domän" -#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html.py:68 +#: admin/forms/domain.py:174 admin/templates/admin/domain_detail.html:72 #: admin/templates/admin/domains.html:34 #: admin/templates/admin/identity_headers.html:2 #: admin/templates/admin/mx_domain_detail.html:9 @@ -406,19 +406,19 @@ msgstr "Ogiltigt format" msgid "User '%s' already exists" msgstr "Användare '%s' finns redan" -#: admin/forms/domain.py:325 +#: admin/forms/domain.py:321 msgid "Domain modified" msgstr "Domän ändrad" -#: admin/forms/domain.py:345 +#: admin/forms/domain.py:341 msgid "Options" msgstr "Inställningar" -#: admin/forms/domain.py:353 +#: admin/forms/domain.py:349 msgid "New domain" msgstr "Ny domän" -#: admin/forms/domain.py:366 +#: admin/forms/domain.py:362 msgid "Domain created" msgstr "Domän skapad" @@ -486,20 +486,20 @@ msgstr "Du tillåts inte att importera domäner" msgid "You are not allowed to import domain aliases." msgstr "Du tillåts inte att importera domän alias." -#: admin/management/commands/subcommands/_mx.py:155 +#: admin/management/commands/subcommands/_mx.py:159 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:176 -msgid "Domain {} as no MX record" +#: admin/management/commands/subcommands/_mx.py:180 +msgid "Domain {} has no MX record" msgstr "" -#: admin/management/commands/subcommands/_mx.py:187 +#: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format -msgid "Domain {0} got an invalid MX record. Got {1}" +msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: admin/management/commands/subcommands/_mx.py:203 +#: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -511,62 +511,62 @@ msgstr "adress" msgid "The alias address." msgstr "Alias adressen." -#: admin/models/alias.py:39 admin/models/domain.py:42 +#: admin/models/alias.py:38 admin/models/domain.py:45 #: admin/models/domain_alias.py:44 msgid "enabled" msgstr "aktiverad" -#: admin/models/alias.py:40 admin/models/domain_alias.py:45 +#: admin/models/alias.py:39 admin/models/domain_alias.py:45 msgid "Check to activate this alias" msgstr "Markera för aktivera detta alias" -#: admin/models/alias.py:45 admin/templates/admin/alias_detail.html.py:32 +#: admin/models/alias.py:44 admin/templates/admin/alias_detail.html:32 msgid "Description" msgstr "" -#: admin/models/alias.py:47 admin/templates/admin/alias_detail.html.py:29 +#: admin/models/alias.py:46 admin/templates/admin/alias_detail.html:29 msgid "Expire at" msgstr "" -#: admin/models/alias.py:90 +#: admin/models/alias.py:89 msgid "alias" msgstr "alias" -#: admin/models/alias.py:122 +#: admin/models/alias.py:121 msgid "Invalid address" msgstr "Ogiltigt adress" -#: admin/models/alias.py:143 +#: admin/models/alias.py:142 msgid "Local recipient {}@{} not found" msgstr "Lokal mottagare {}@{} kunde inte hittas." -#: admin/models/alias.py:173 +#: admin/models/alias.py:172 #, python-format msgid "Invalid line: %s" msgstr "Ogiltig rad: %s" -#: admin/models/alias.py:179 +#: admin/models/alias.py:178 #, python-format msgid "Domain '%s' does not exist" msgstr "Domänen '%s' existerar inte" -#: admin/models/domain.py:38 admin/models/domain_alias.py:37 +#: admin/models/domain.py:41 admin/models/domain_alias.py:37 msgid "name" msgstr "namn" -#: admin/models/domain.py:39 +#: admin/models/domain.py:42 msgid "The domain name" msgstr "Domännamnet" -#: admin/models/domain.py:43 +#: admin/models/domain.py:46 msgid "Check to activate this domain" msgstr "Markera för att aktivera denna domän" -#: admin/models/domain.py:198 admin/models/domain_alias.py:71 +#: admin/models/domain.py:211 admin/models/domain_alias.py:71 msgid "Invalid line" msgstr "Ogiltig rad" -#: admin/models/domain.py:206 +#: admin/models/domain.py:219 #, python-format msgid "Invalid quota value for domain '%s'" msgstr "Ogiltig kvota värde för domänen '%s'" @@ -765,34 +765,39 @@ msgstr "" msgid "DNS status" msgstr "Statistik" -#: admin/templates/admin/domain_detail.html:36 +#: admin/templates/admin/domain_detail.html:28 +#: admin/templates/admin/domains_table.html:12 +msgid "Awaiting checks" +msgstr "" + +#: admin/templates/admin/domain_detail.html:40 msgid "Creation date" msgstr "Skapelsedatum" -#: admin/templates/admin/domain_detail.html:38 +#: admin/templates/admin/domain_detail.html:42 msgid "Last modification date" msgstr "Senast ändrad" -#: admin/templates/admin/domain_detail.html:39 -#: admin/templates/admin/domain_detail.html:48 +#: admin/templates/admin/domain_detail.html:43 +#: admin/templates/admin/domain_detail.html:52 #: admin/templates/admin/domain_statistics.html:33 msgid "Domain aliases" msgstr "Domän alias" -#: admin/templates/admin/domain_detail.html:41 +#: admin/templates/admin/domain_detail.html:45 msgid "Mailbox aliases" msgstr "Brevlåde alias" -#: admin/templates/admin/domain_detail.html:65 +#: admin/templates/admin/domain_detail.html:69 msgid "Administrators" msgstr "Administratörer" -#: admin/templates/admin/domain_detail.html:75 +#: admin/templates/admin/domain_detail.html:79 #: admin/templatetags/admin_tags.py:252 msgid "Remove this permission" msgstr "Radera detta tillstånd" -#: admin/templates/admin/domain_detail.html:80 +#: admin/templates/admin/domain_detail.html:84 #, fuzzy #| msgid "No domain administrator defined" msgid "No domain administrator defined yet." diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py index 2fe3bbd81..fa4908df0 100644 --- a/modoboa/lib/templatetags/lib_tags.py +++ b/modoboa/lib/templatetags/lib_tags.py @@ -6,6 +6,7 @@ from datetime import datetime from django import template from django.template import Template, Context from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ from modoboa.lib import events @@ -94,3 +95,12 @@ def extra_static_content(caller, st_type, user): "GetStaticContent", caller, st_type, user) }) ) + + +@register.filter(name='localize_header_name') +def localize_header_name(headername): + """ Localizes the header names """ + names = {'From': _('From'), 'To': _('To'), 'Date': _('Date'), 'Subject': _('Subject')} + if names.has_key(headername): + return names[headername] + return headername diff --git a/modoboa/limits/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/limits/locale/cs_CZ/LC_MESSAGES/django.po index aeff2df98..10379e2fe 100644 --- a/modoboa/limits/locale/cs_CZ/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/cs_CZ/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2015-01-06 10:05+0000\n" "Last-Translator: Miroslav Abrahám \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/" @@ -209,7 +209,7 @@ msgstr "Neplatné omezení" msgid "You're not allowed to define unlimited values" msgstr "Nemáte oprávnění nastavovat neomezené hodnoty" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "Zdroje" diff --git a/modoboa/limits/locale/de/LC_MESSAGES/django.po b/modoboa/limits/locale/de/LC_MESSAGES/django.po index ba16c4c5d..85a5891d8 100644 --- a/modoboa/limits/locale/de/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/de/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-03 11:02+0000\n" "Last-Translator: Arvedui \n" "Language-Team: German (http://www.transifex.com/projects/p/modoboa/language/" @@ -210,7 +210,7 @@ msgstr "" "Sie verfügen nicht über die erforderlichen Rechte, um unbegrenzte Werte " "anzugeben" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "Ressourcen" diff --git a/modoboa/limits/locale/en/LC_MESSAGES/django.po b/modoboa/limits/locale/en/LC_MESSAGES/django.po index 215c0c478..ca931e678 100644 --- a/modoboa/limits/locale/en/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -167,7 +167,7 @@ msgstr "" msgid "You're not allowed to define unlimited values" msgstr "" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "" diff --git a/modoboa/limits/locale/es/LC_MESSAGES/django.po b/modoboa/limits/locale/es/LC_MESSAGES/django.po index ab2d2834f..c6ffb7c6a 100644 --- a/modoboa/limits/locale/es/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/es/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2013-10-01 09:56+0000\n" "Last-Translator: Pedro Gracia \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/modoboa/language/" @@ -210,7 +210,7 @@ msgstr "Límite inválido" msgid "You're not allowed to define unlimited values" msgstr "No está autorizado definir valores ilimitados" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "Recursos" diff --git a/modoboa/limits/locale/fr/LC_MESSAGES/django.po b/modoboa/limits/locale/fr/LC_MESSAGES/django.po index 7c945f3b4..5e439787f 100644 --- a/modoboa/limits/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-04-27 20:12+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" @@ -187,7 +187,7 @@ msgstr "Limite invalide" msgid "You're not allowed to define unlimited values" msgstr "Vous n'êtes pas autorisé à définir des valeurs illimitées" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "Ressources" diff --git a/modoboa/limits/locale/it/LC_MESSAGES/django.po b/modoboa/limits/locale/it/LC_MESSAGES/django.po index c2ea214cb..8e219010e 100644 --- a/modoboa/limits/locale/it/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2013-12-23 00:56+0100\n" "Last-Translator: Alberto Berti \n" "Language-Team: ITALIANO \n" @@ -211,7 +211,7 @@ msgstr "Limite non valido" msgid "You're not allowed to define unlimited values" msgstr "Non ti è consentito definire valori non limitati" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "Risorse" diff --git a/modoboa/limits/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/limits/locale/ja_JP/LC_MESSAGES/django.po index e18998035..d8d28f965 100644 --- a/modoboa/limits/locale/ja_JP/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/ja_JP/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-06-07 07:16+0000\n" "Last-Translator: cwatanab \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/" @@ -187,7 +187,7 @@ msgstr "不正な制限" msgid "You're not allowed to define unlimited values" msgstr "無制限な値に設定するのは許可されていません" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "リソース" diff --git a/modoboa/limits/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/limits/locale/nl_NL/LC_MESSAGES/django.po index a5dd9392f..e959f52e5 100644 --- a/modoboa/limits/locale/nl_NL/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/nl_NL/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-31 11:37+0000\n" "Last-Translator: TuxBrother \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" @@ -204,7 +204,7 @@ msgstr "Ongeldige limiet" msgid "You're not allowed to define unlimited values" msgstr "U mag geen ongelimiteerde waardes opgeven" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "Capaciteiten" diff --git a/modoboa/limits/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/limits/locale/pt_BR/LC_MESSAGES/django.po index 3e461407f..3ebff5d8c 100644 --- a/modoboa/limits/locale/pt_BR/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/pt_BR/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-05-17 12:19+0000\n" "Last-Translator: Jose Marcos Araujo \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/" @@ -193,7 +193,7 @@ msgstr "Limite inválido" msgid "You're not allowed to define unlimited values" msgstr "Você não tem permissão para definir valores ilimitados" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "Recursos" diff --git a/modoboa/limits/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/limits/locale/pt_PT/LC_MESSAGES/django.po index bfcef7b8f..7efd550dc 100644 --- a/modoboa/limits/locale/pt_PT/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/pt_PT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-29 12:51+0000\n" "Last-Translator: Mike C. \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" @@ -216,7 +216,7 @@ msgstr "Limite inválido" msgid "You're not allowed to define unlimited values" msgstr "Não está autorizado a definir valores ilimitados" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "Recursos" diff --git a/modoboa/limits/locale/ru/LC_MESSAGES/django.po b/modoboa/limits/locale/ru/LC_MESSAGES/django.po index afed21669..0d6ec116a 100644 --- a/modoboa/limits/locale/ru/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2013-12-03 09:35+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Russian (http://www.transifex.com/projects/p/modoboa/language/" @@ -217,7 +217,7 @@ msgstr "Ошибочный лимит" msgid "You're not allowed to define unlimited values" msgstr "Вам не позволено определять нелимитированные значения" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "Ресурсы" diff --git a/modoboa/limits/locale/sv/LC_MESSAGES/django.po b/modoboa/limits/locale/sv/LC_MESSAGES/django.po index b7c00184f..7287201de 100644 --- a/modoboa/limits/locale/sv/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/sv/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-05-30 18:08+0000\n" "Last-Translator: Olle Gustafsson \n" "Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/" @@ -187,7 +187,7 @@ msgstr "Ogiltig gräns" msgid "You're not allowed to define unlimited values" msgstr "Du har inte tillåtelse att definiera obegränsat värden" -#: limits/general_callbacks.py:52 limits/general_callbacks.py:65 +#: limits/general_callbacks.py:56 limits/general_callbacks.py:69 msgid "Resources" msgstr "Resurser" diff --git a/modoboa/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/locale/cs_CZ/LC_MESSAGES/django.po index cec8705f4..51c5df7bf 100644 --- a/modoboa/locale/cs_CZ/LC_MESSAGES/django.po +++ b/modoboa/locale/cs_CZ/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2015-01-06 10:05+0000\n" "Last-Translator: Miroslav Abrahám \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/" @@ -464,24 +464,24 @@ msgstr "Nebylo možné změnit heslo: LDAP modul není instalován" msgid "account" msgstr "účet" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "Neplatný řádek" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "Nemůžete importvat účet s vyšším oprávněním, než máte vy sám" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Běžný uživatel '%s' musí mít nastavenou platnou emailovou adresu" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "pole uživatelského jména a emailu se nesmí pro '%s' lišit" @@ -566,8 +566,8 @@ msgid "Active users" msgstr "Aktivní uživatelé" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "Název skupiny" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -581,7 +581,7 @@ msgstr "Záznamy" msgid "Previously on Modoboa..." msgstr "Dříve v Modoboa..." -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "Datum" @@ -653,7 +653,7 @@ msgstr "Odhlásit se" msgid "API" msgstr "" -#: core/utils.py:22 +#: core/utils.py:34 #, fuzzy #| msgid "Welcome to Modoboa" msgid "The core part of Modoboa" @@ -738,7 +738,19 @@ msgstr "Ne" msgid "Failed to update password: {}" msgstr "Nebylo možné změnit heslo: %s" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "Předmět" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "Omlouváme se" @@ -758,10 +770,6 @@ msgstr "Hledat..." msgid "From address" msgstr "Z adresy" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "Předmět" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "Obojí" @@ -801,6 +809,9 @@ msgstr "Zapamatovat si" msgid "Log in" msgstr "Přihlásit" +#~ msgid "Group name" +#~ msgstr "Název skupiny" + #~ msgid "Display" #~ msgstr "Zobrazení" diff --git a/modoboa/locale/de/LC_MESSAGES/django.po b/modoboa/locale/de/LC_MESSAGES/django.po index 24f5778e1..b90267b8d 100644 --- a/modoboa/locale/de/LC_MESSAGES/django.po +++ b/modoboa/locale/de/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2015-07-09 14:03+0000\n" "Last-Translator: controlc.de\n" "Language-Team: German (http://www.transifex.com/tonio/modoboa/language/de/)\n" @@ -456,25 +456,25 @@ msgstr "Konnte Passwort nicht aktualisieren: LDAP-Modul nicht installiert" msgid "account" msgstr "Konto" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "Ungültige Zeile" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "" "Sie können kein Konto mit einer höheren Rolle als Ihrer eigenen importieren" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Der normale Benutzer '%s' muss eine gültige E-Mail-Adresse besitzen" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "Benutzername und E-Mail für '%s' dürfen sich nicht unterscheiden" @@ -555,8 +555,8 @@ msgid "Active users" msgstr "Aktive Benutzer" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "Gruppenname" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -570,7 +570,7 @@ msgstr "Logs" msgid "Previously on Modoboa..." msgstr "Vorher auf Modoboa…" -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "Datum" @@ -642,7 +642,7 @@ msgstr "Logout" msgid "API" msgstr "" -#: core/utils.py:22 +#: core/utils.py:34 msgid "The core part of Modoboa" msgstr "Der Kern von Modoboa" @@ -726,7 +726,19 @@ msgstr "Nein" msgid "Failed to update password: {}" msgstr "Konnte Passwort nicht aktualisieren: %s" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "Absender" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "Empfänger" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "Betreff" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "Entschuldigung" @@ -746,10 +758,6 @@ msgstr "Suchen..." msgid "From address" msgstr "Absender-Adresse" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "Betreff" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "Beide" @@ -789,6 +797,9 @@ msgstr "An mich erinnern" msgid "Log in" msgstr "Anmelden" +#~ msgid "Group name" +#~ msgstr "Gruppenname" + #~ msgid "Display" #~ msgstr "Darstellung" diff --git a/modoboa/locale/en/LC_MESSAGES/django.po b/modoboa/locale/en/LC_MESSAGES/django.po index ba1519740..db46a66e6 100644 --- a/modoboa/locale/en/LC_MESSAGES/django.po +++ b/modoboa/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -429,24 +429,24 @@ msgstr "" msgid "account" msgstr "" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "" @@ -525,7 +525,7 @@ msgid "Active users" msgstr "" #: core/templates/core/information.html:37 -msgid "Group name" +msgid "Role" msgstr "" #: core/templates/core/information.html:38 @@ -540,7 +540,7 @@ msgstr "" msgid "Previously on Modoboa..." msgstr "" -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "" @@ -610,7 +610,7 @@ msgstr "" msgid "API" msgstr "" -#: core/utils.py:22 +#: core/utils.py:34 msgid "The core part of Modoboa" msgstr "" @@ -686,7 +686,19 @@ msgstr "" msgid "Failed to update password: {}" msgstr "" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "" @@ -706,10 +718,6 @@ msgstr "" msgid "From address" msgstr "" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "" diff --git a/modoboa/locale/es/LC_MESSAGES/django.po b/modoboa/locale/es/LC_MESSAGES/django.po index 7c71bd678..e15fc219f 100644 --- a/modoboa/locale/es/LC_MESSAGES/django.po +++ b/modoboa/locale/es/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2013-10-01 09:56+0000\n" "Last-Translator: Pedro Gracia \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/modoboa/language/" @@ -466,24 +466,24 @@ msgstr "Falló al actualizar la contraseña: módulo LDAP no instalado" msgid "account" msgstr "cuenta" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "Línea inválida" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "No puede importar una cuenta con un rol mayor que el suyo" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "El usuario normal '%s' debe tener una dirección de email válida" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "" @@ -568,8 +568,8 @@ msgid "Active users" msgstr "Usuarios activos" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "Nombre del grupo" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -583,7 +583,7 @@ msgstr "Logs" msgid "Previously on Modoboa..." msgstr "Anteriormente en Modoboa..." -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "Fecha" @@ -655,7 +655,7 @@ msgstr "Salir" msgid "API" msgstr "" -#: core/utils.py:22 +#: core/utils.py:34 #, fuzzy #| msgid "Welcome to Modoboa" msgid "The core part of Modoboa" @@ -741,7 +741,19 @@ msgstr "No " msgid "Failed to update password: {}" msgstr "Falló la actualización de la contraseña: %s" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "Tema" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "Lo siento" @@ -761,10 +773,6 @@ msgstr "Buscar..." msgid "From address" msgstr "De la dirección" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "Tema" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "Ambos" @@ -804,6 +812,9 @@ msgstr "Recuerdame" msgid "Log in" msgstr "Entrar" +#~ msgid "Group name" +#~ msgstr "Nombre del grupo" + #~ msgid "Display" #~ msgstr "Mostrar" diff --git a/modoboa/locale/fr/LC_MESSAGES/django.po b/modoboa/locale/fr/LC_MESSAGES/django.po index 9a1c8730f..d3d9b999e 100644 --- a/modoboa/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/locale/fr/LC_MESSAGES/django.po @@ -1,21 +1,21 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Antoine Nguyen , 2016 msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-09-16 14:04+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" +"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: core/__init__.py:63 @@ -64,7 +64,8 @@ msgstr "plain (faible)" #: core/app_settings.py:61 msgid "Scheme used to crypt mailbox passwords" -msgstr "Méthode utilisée pour chiffrer les mots de passe des boites aux lettres" +msgstr "" +"Méthode utilisée pour chiffrer les mots de passe des boites aux lettres" #: core/app_settings.py:66 msgid "Rounds" @@ -74,7 +75,9 @@ msgstr "Tours" msgid "" "Number of rounds to use (only used by sha256crypt and sha512crypt). Must be " "between 1000 and 999999999, inclusive." -msgstr "Nombre de tours à utiliser (sha256crypt et sha512crypt uniquement). Doit être compris entre 1000 et 999999999 inclue." +msgstr "" +"Nombre de tours à utiliser (sha256crypt et sha512crypt uniquement). Doit " +"être compris entre 1000 et 999999999 inclue." #: core/app_settings.py:76 msgid "Secret key" @@ -136,7 +139,9 @@ msgstr "ND de connexion" msgid "" "The distinguished name to use when binding to the LDAP server. Leave empty " "for an anonymous bind" -msgstr "Le nom distinctif à utiliser pour les connections au serveur LDAP. Laisser vide pour une connexion anonyme" +msgstr "" +"Le nom distinctif à utiliser pour les connections au serveur LDAP. Laisser " +"vide pour une connexion anonyme" #: core/app_settings.py:128 msgid "Bind password" @@ -144,7 +149,9 @@ msgstr "Mot de passe de connexion" #: core/app_settings.py:131 msgid "The password to use when binding to the LDAP server (with 'Bind DN')" -msgstr "Le mot de passe à utiliser pour les connections au serveur LDAP (avec 'ND de connexion')" +msgstr "" +"Le mot de passe à utiliser pour les connections au serveur LDAP (avec 'ND de " +"connexion')" #: core/app_settings.py:140 msgid "Users search base" @@ -152,7 +159,9 @@ msgstr "Base de recherche des utilisateurs" #: core/app_settings.py:143 msgid "The distinguished name of the search base used to find users" -msgstr "Le nom distinctif de la base de recherche utilisée pour rechercher les utilisateurs" +msgstr "" +"Le nom distinctif de la base de recherche utilisée pour rechercher les " +"utilisateurs" #: core/app_settings.py:150 msgid "Search filter" @@ -162,7 +171,9 @@ msgstr "Filtre de recherche" msgid "" "An optional filter string (e.g. '(objectClass=person)'). In order to be " "valid, it must be enclosed in parentheses." -msgstr "Un filtre de recherche optionel (ex. '(objectClass=person)'). Pour être valide, il doit être entouré de parenthèses." +msgstr "" +"Un filtre de recherche optionel (ex. '(objectClass=person)'). Pour être " +"valide, il doit être entouré de parenthèses." #: core/app_settings.py:161 msgid "User DN template" @@ -173,7 +184,9 @@ msgstr "Modèle de nom distinctif utilisateur" msgid "" "The template used to construct a user's DN. It should contain one " "placeholder (ie. %(user)s)" -msgstr "Le modèle utilisé pour construire le nom distinctif d'un utilisateur. Il doit contenir un espace réservé (ex. %(user)s)" +msgstr "" +"Le modèle utilisé pour construire le nom distinctif d'un utilisateur. Il " +"doit contenir un espace réservé (ex. %(user)s)" #: core/app_settings.py:172 msgid "Password attribute" @@ -197,9 +210,12 @@ msgstr "Groupes administrateurs" #: core/app_settings.py:189 msgid "" -"Members of those LDAP Posix groups will be created as domain administrators." -" Use ';' characters to separate groups." -msgstr "Les membres de ces groupes LDAP (Posix) seront créés en tant qu'administrateurs de domaine. Utiliser des caractères ';' pour séparer les groupes." +"Members of those LDAP Posix groups will be created as domain administrators. " +"Use ';' characters to separate groups." +msgstr "" +"Les membres de ces groupes LDAP (Posix) seront créés en tant " +"qu'administrateurs de domaine. Utiliser des caractères ';' pour séparer les " +"groupes." #: core/app_settings.py:196 msgid "Group type" @@ -215,7 +231,9 @@ msgstr "Base de recherche des groupes" #: core/app_settings.py:208 msgid "The distinguished name of the search base used to find groups" -msgstr "Le nom distinctif de la base de recherche utilisée pour rechercher les groupes" +msgstr "" +"Le nom distinctif de la base de recherche utilisée pour rechercher les " +"groupes" #: core/app_settings.py:213 msgid "Notifications" @@ -255,7 +273,9 @@ msgstr "Envoyer des statistiques" #: core/app_settings.py:243 msgid "Send statistics to Modoboa public API (counters and used extensions)" -msgstr "Envoyer des statistiques à l'API publique de Modoboa (compteurs et extensions utilisées)" +msgstr "" +"Envoyer des statistiques à l'API publique de Modoboa (compteurs et " +"extensions utilisées)" #: core/app_settings.py:247 msgid "Miscellaneous" @@ -291,7 +311,8 @@ msgstr "Redirection par défaut" #: core/app_settings.py:277 msgid "The default redirection used when no application is specified" -msgstr "La redirection appliquée par défaut quand aucune application n'est spécifiée" +msgstr "" +"La redirection appliquée par défaut quand aucune application n'est spécifiée" #: core/app_settings.py:310 msgid "Key must be either 16, 24, or 32 bytes long" @@ -424,30 +445,31 @@ msgstr "Vous ne pouvez pas supprimer votre propre compte" #: core/models.py:164 msgid "Failed to update password: LDAP module not installed" -msgstr "Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé" +msgstr "" +"Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé" #: core/models.py:222 msgid "account" msgstr "compte" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "Inconnu" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "Ligne invalide" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "Vous ne pouvez pas importer un compte avec un rôle supérieur au votre" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "L'utilisateur simple '%s' doit avoir une adresse email valide" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "Les champs username et email de '%s' ne doivent pas différer" @@ -482,7 +504,9 @@ msgstr "Dernières nouvelles" msgid "" "Visit the official " "weblog for more information." -msgstr "Visitez le blog officiel pour plus d'information." +msgstr "" +"Visitez le blog " +"officiel pour plus d'information." #: core/templates/core/information.html:2 core/templatetags/core_tags.py:53 msgid "Information" @@ -498,7 +522,8 @@ msgstr "Une ou plusieurs mises à jour sont disponibles!" #: core/templates/core/information.html:6 msgid "Check the following list to find the component(s) that can be updated." -msgstr "Consulter la liste suivante pour trouver le(s) composant(s) concerné(s)." +msgstr "" +"Consulter la liste suivante pour trouver le(s) composant(s) concerné(s)." #: core/templates/core/information.html:10 msgid "Applications" @@ -526,8 +551,8 @@ msgid "Active users" msgstr "Utilisateurs actifs" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "Nom du groupe" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -541,7 +566,7 @@ msgstr "Journaux" msgid "Previously on Modoboa..." msgstr "Précédemment dans Modoboa..." -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "Date" @@ -611,7 +636,7 @@ msgstr "Déconnexion" msgid "API" msgstr "API" -#: core/utils.py:22 +#: core/utils.py:34 msgid "The core part of Modoboa" msgstr "Le coeur de Modoboa" @@ -626,7 +651,9 @@ msgstr "Utiliseur '%s' connecté avec succès" #: core/views/auth.py:48 msgid "Your username and password didn't match. Please try again." -msgstr "Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez réessayer." +msgstr "" +"Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez " +"réessayer." #: core/views/auth.py:76 #, python-format @@ -687,7 +714,19 @@ msgstr "Non" msgid "Failed to update password: {}" msgstr "Impossible de mettre à jour le mot de passe : {}" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "Sujet" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "Désolé" @@ -707,10 +746,6 @@ msgstr "Chercher..." msgid "From address" msgstr "Emetteur" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "Sujet" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "Tous" @@ -749,3 +784,6 @@ msgstr "Se souvenir de moi" #: templates/registration/login.html:43 msgid "Log in" msgstr "Se connecter" + +#~ msgid "Group name" +#~ msgstr "Nom du groupe" diff --git a/modoboa/locale/it/LC_MESSAGES/django.po b/modoboa/locale/it/LC_MESSAGES/django.po index cdc51a4e7..1dcbcbd81 100644 --- a/modoboa/locale/it/LC_MESSAGES/django.po +++ b/modoboa/locale/it/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2015-10-11 11:47+0000\n" "Last-Translator: Rocco \n" "Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/" @@ -466,24 +466,24 @@ msgstr "Aggiornamento della password fallito: il modulo LDAP non è installato" msgid "account" msgstr "account" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "Riga non valida" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "Non puoi importare un account con un ruolo superiore al tuo" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "L'utente '%s' deve avere un indirizzo email valido" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "I campi nome utente e email di '%s' devono avere lo stesso valore" @@ -564,8 +564,8 @@ msgid "Active users" msgstr "Utenti attivi" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "Nome gruppo" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -579,7 +579,7 @@ msgstr "Log" msgid "Previously on Modoboa..." msgstr "Precedentemente su Modoboa ..." -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "Data" @@ -651,7 +651,7 @@ msgstr "Esci" msgid "API" msgstr "" -#: core/utils.py:22 +#: core/utils.py:34 msgid "The core part of Modoboa" msgstr "Parte centrale di Modoboa" @@ -733,7 +733,19 @@ msgstr "No" msgid "Failed to update password: {}" msgstr "Aggiornamento della password fallito: %s" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "Oggetto" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "Dispiace" @@ -753,10 +765,6 @@ msgstr "Ricerca ..." msgid "From address" msgstr "Mittente" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "Oggetto" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "Entrambi" @@ -796,6 +804,9 @@ msgstr "Ricordami" msgid "Log in" msgstr "Registrati" +#~ msgid "Group name" +#~ msgstr "Nome gruppo" + #~ msgid "Display" #~ msgstr "Mostra" diff --git a/modoboa/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/locale/ja_JP/LC_MESSAGES/django.po index 14ec76d35..2892d834f 100644 --- a/modoboa/locale/ja_JP/LC_MESSAGES/django.po +++ b/modoboa/locale/ja_JP/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-09-14 17:06+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/" @@ -452,25 +452,25 @@ msgstr "" msgid "account" msgstr "アカウント" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "不正な行" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "あなた以上のロールを持ったアカウントはインポートできません" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "" "ユーザー \"%s\" は、正しい電子メールアドレスを持っていなければいけません" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "\"%s\" のユーザー名と電子メールフィールドが同一である必要があります。" @@ -551,8 +551,8 @@ msgid "Active users" msgstr "アクティブユーザー" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "グループ名" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -566,7 +566,7 @@ msgstr "ログ" msgid "Previously on Modoboa..." msgstr "Modoboa 以前 ..." -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "日付" @@ -636,7 +636,7 @@ msgstr "ログアウト" msgid "API" msgstr "API" -#: core/utils.py:22 +#: core/utils.py:34 msgid "The core part of Modoboa" msgstr "Modoboaのコア部分" @@ -712,7 +712,19 @@ msgstr "いいえ" msgid "Failed to update password: {}" msgstr "パスワードの更新に失敗しました: {}" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "件名" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "すみません" @@ -732,10 +744,6 @@ msgstr "検索 ..." msgid "From address" msgstr "From アドレス" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "件名" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "両方" @@ -774,3 +782,6 @@ msgstr "記憶する" #: templates/registration/login.html:43 msgid "Log in" msgstr "ログイン" + +#~ msgid "Group name" +#~ msgstr "グループ名" diff --git a/modoboa/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/locale/nl_NL/LC_MESSAGES/django.po index 51bda6363..079311ccc 100644 --- a/modoboa/locale/nl_NL/LC_MESSAGES/django.po +++ b/modoboa/locale/nl_NL/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-31 11:37+0000\n" "Last-Translator: TuxBrother \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" @@ -464,24 +464,24 @@ msgstr "Mislukt om wachtwoord aan te passen: LDAP module niet geinstalleerd" msgid "account" msgstr "account" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "Verkeerde regel" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "U kunt geen accounts importeren met hogere rechten dan die van uzelf." -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "De gebruiker '%s' moet een geldig email adres hebben" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "gebruikersnaam en email velden moeten niet verschillen van '%s'" @@ -566,8 +566,8 @@ msgid "Active users" msgstr "Actieve gebruikers" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "Groep naam" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -581,7 +581,7 @@ msgstr "Logs" msgid "Previously on Modoboa..." msgstr "Vorige gebeurtenissen op Modoboa..." -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "Datum" @@ -653,7 +653,7 @@ msgstr "Uitloggen" msgid "API" msgstr "" -#: core/utils.py:22 +#: core/utils.py:34 #, fuzzy #| msgid "Welcome to Modoboa" msgid "The core part of Modoboa" @@ -739,7 +739,19 @@ msgstr "Nee" msgid "Failed to update password: {}" msgstr "Mislukt om wachtwoord aan te passen: %s" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "Onderwerp" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "Sorry" @@ -759,10 +771,6 @@ msgstr "Zoeken..." msgid "From address" msgstr "Van adres" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "Onderwerp" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "Beiden" @@ -802,6 +810,9 @@ msgstr "Onthoud mij" msgid "Log in" msgstr "Inloggen" +#~ msgid "Group name" +#~ msgstr "Groep naam" + #~ msgid "Display" #~ msgstr "Weergeven" diff --git a/modoboa/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/locale/pt_BR/LC_MESSAGES/django.po index 8f86f1179..79ce0ea3f 100644 --- a/modoboa/locale/pt_BR/LC_MESSAGES/django.po +++ b/modoboa/locale/pt_BR/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-05-17 12:26+0000\n" "Last-Translator: Jose Marcos Araujo \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/" @@ -457,24 +457,24 @@ msgstr "Falha ao atualizar senha: módulo LDAP não instalado" msgid "account" msgstr "conta" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "Linha inválida" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "Você não pode importar uma conta com um papel maior que o seu" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "O usuário simples '%s' deve ter um endereço de e-mail válido" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "os campos nome de usuário e e-mail não diferem de '%s'" @@ -554,8 +554,8 @@ msgid "Active users" msgstr "Usuários ativos" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "Nome do grupo" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -569,7 +569,7 @@ msgstr "Logs" msgid "Previously on Modoboa..." msgstr "Previamente no Modoboa..." -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "Data" @@ -639,7 +639,7 @@ msgstr "Sair" msgid "API" msgstr "API" -#: core/utils.py:22 +#: core/utils.py:34 msgid "The core part of Modoboa" msgstr "Core do Modoboa" @@ -715,7 +715,19 @@ msgstr "Não" msgid "Failed to update password: {}" msgstr "Falha ao atualizar a senha: {}" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "Assunto" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "Desculpe" @@ -735,10 +747,6 @@ msgstr "Buscar..." msgid "From address" msgstr "Do endereço" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "Assunto" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "Ambos" @@ -777,3 +785,6 @@ msgstr "Lembrar-me" #: templates/registration/login.html:43 msgid "Log in" msgstr "Entrar" + +#~ msgid "Group name" +#~ msgstr "Nome do grupo" diff --git a/modoboa/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/locale/pt_PT/LC_MESSAGES/django.po index de780c0f6..a7456fa7c 100644 --- a/modoboa/locale/pt_PT/LC_MESSAGES/django.po +++ b/modoboa/locale/pt_PT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-29 12:51+0000\n" "Last-Translator: Mike C. \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" @@ -465,24 +465,24 @@ msgstr "Falha ao actualizar password: Modulo LDAP não instalado" msgid "account" msgstr "conta" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "Linha inválida" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "Não é possível importa uma conta com permissões superiores" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "O simple utilizador '%s' deve ter endereço de e-mail válido" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "" @@ -569,8 +569,8 @@ msgid "Active users" msgstr "Utilizadores ativos" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "Nome do grupo" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -584,7 +584,7 @@ msgstr "Logs" msgid "Previously on Modoboa..." msgstr "Anteriormente no Modoboa..." -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "Data" @@ -656,7 +656,7 @@ msgstr "Sair" msgid "API" msgstr "" -#: core/utils.py:22 +#: core/utils.py:34 #, fuzzy #| msgid "Welcome to Modoboa" msgid "The core part of Modoboa" @@ -740,7 +740,19 @@ msgstr "Não" msgid "Failed to update password: {}" msgstr "Falha ao actualizar a password: %s" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "Assunto" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "Lamentamos" @@ -760,10 +772,6 @@ msgstr "Procurar..." msgid "From address" msgstr "Do endereço" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "Assunto" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "Ambos" @@ -803,6 +811,9 @@ msgstr "Lembrar-me" msgid "Log in" msgstr "Entrar" +#~ msgid "Group name" +#~ msgstr "Nome do grupo" + #~ msgid "Display" #~ msgstr "Exibir" diff --git a/modoboa/locale/ru/LC_MESSAGES/django.po b/modoboa/locale/ru/LC_MESSAGES/django.po index 0fe87bad7..dd7f47ac7 100644 --- a/modoboa/locale/ru/LC_MESSAGES/django.po +++ b/modoboa/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2013-12-03 09:35+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Russian (http://www.transifex.com/projects/p/modoboa/language/" @@ -455,24 +455,24 @@ msgstr "Ошибка обновления пароля: модуль LDAP не msgid "account" msgstr "Аккаунт" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "Ошибочная строка" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "Вы не можете импортировать аккаунт с ролью старше чем у вас" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Пользователь '%s' должен иметь действительный почтовый адрес" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "Имя пользователя и адрес не должны отличатся для пользователя '%s'" @@ -556,8 +556,8 @@ msgid "Active users" msgstr "Активные пользователи" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "Название группы" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -571,7 +571,7 @@ msgstr "Логи" msgid "Previously on Modoboa..." msgstr "Ранее в Modoboa ..." -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "Дата" @@ -643,7 +643,7 @@ msgstr "Завершить сеанс" msgid "API" msgstr "" -#: core/utils.py:22 +#: core/utils.py:34 #, fuzzy #| msgid "Welcome to Modoboa" msgid "The core part of Modoboa" @@ -727,7 +727,19 @@ msgstr "Нет" msgid "Failed to update password: {}" msgstr "Ошибка обновления пароля: %s" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "Тема" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "Жаль" @@ -747,10 +759,6 @@ msgstr "Поиск..." msgid "From address" msgstr "Адрес отправителя" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "Тема" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "Оба" @@ -790,6 +798,9 @@ msgstr "Запомнить меня" msgid "Log in" msgstr "Войти" +#~ msgid "Group name" +#~ msgstr "Название группы" + #~ msgid "Display" #~ msgstr "Отображение" diff --git a/modoboa/locale/sv/LC_MESSAGES/django.po b/modoboa/locale/sv/LC_MESSAGES/django.po index 60ee0fccc..bb984ab91 100644 --- a/modoboa/locale/sv/LC_MESSAGES/django.po +++ b/modoboa/locale/sv/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-05-30 18:03+0000\n" "Last-Translator: Olle Gustafsson \n" "Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/" @@ -452,24 +452,24 @@ msgstr "Misslyckades med att uppdatera lösenord: LDAP modul ej installerad" msgid "account" msgstr "konto" -#: core/models.py:367 +#: core/models.py:354 msgid "Unknown" msgstr "" -#: core/models.py:406 +#: core/models.py:393 msgid "Invalid line" msgstr "Ogiltig rad" -#: core/models.py:414 +#: core/models.py:401 msgid "You can't import an account with a role greater than yours" msgstr "Du kan inte importera konto med en roll större än din" -#: core/models.py:429 +#: core/models.py:416 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Den enkla användaren '%s' måste ha en gällande e-postadress" -#: core/models.py:434 +#: core/models.py:421 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "användarnamn och e-post fält får inte avvika för '%s'" @@ -549,8 +549,8 @@ msgid "Active users" msgstr "Aktiva användare" #: core/templates/core/information.html:37 -msgid "Group name" -msgstr "Gruppnamn" +msgid "Role" +msgstr "" #: core/templates/core/information.html:38 msgid "Last login" @@ -564,7 +564,7 @@ msgstr "Loggar" msgid "Previously on Modoboa..." msgstr "Tidigare på Modoboa..." -#: core/templates/core/logs.html:6 +#: core/templates/core/logs.html:6 lib/templatetags/lib_tags.py:103 msgid "Date" msgstr "Datum" @@ -634,7 +634,7 @@ msgstr "Logga ut" msgid "API" msgstr "API" -#: core/utils.py:22 +#: core/utils.py:34 msgid "The core part of Modoboa" msgstr "Kärnan av Modoboa" @@ -710,7 +710,19 @@ msgstr "Nej" msgid "Failed to update password: {}" msgstr "Misslyckades med att uppdatera lösenord: {}" -#: templates/404.html:4 templates/500.html.py:4 +#: lib/templatetags/lib_tags.py:103 +msgid "From" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 +msgid "To" +msgstr "" + +#: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 +msgid "Subject" +msgstr "Ämne" + +#: templates/404.html:4 templates/500.html:4 msgid "Sorry" msgstr "Ursäkta" @@ -730,10 +742,6 @@ msgstr "Sök..." msgid "From address" msgstr "Från adress" -#: templates/common/email_searchbar.html:17 -msgid "Subject" -msgstr "Ämne" - #: templates/common/email_searchbar.html:33 msgid "Both" msgstr "Båda" @@ -772,3 +780,6 @@ msgstr "Kom ihåg mig" #: templates/registration/login.html:43 msgid "Log in" msgstr "Logga in" + +#~ msgid "Group name" +#~ msgstr "Gruppnamn" diff --git a/modoboa/relaydomains/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/cs_CZ/LC_MESSAGES/django.po index 29827774d..023ced06b 100644 --- a/modoboa/relaydomains/locale/cs_CZ/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/cs_CZ/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2015-01-06 10:05+0000\n" "Last-Translator: Miroslav Abrahám \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/" diff --git a/modoboa/relaydomains/locale/de/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/de/LC_MESSAGES/django.po index 2953fabe7..bf99be890 100644 --- a/modoboa/relaydomains/locale/de/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/de/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-03 11:02+0000\n" "Last-Translator: Arvedui \n" "Language-Team: German (http://www.transifex.com/projects/p/modoboa/language/" diff --git a/modoboa/relaydomains/locale/en/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/en/LC_MESSAGES/django.po index 151758f52..23b027948 100644 --- a/modoboa/relaydomains/locale/en/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/modoboa/relaydomains/locale/es/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/es/LC_MESSAGES/django.po index 5b4a9b351..44b6a2d60 100644 --- a/modoboa/relaydomains/locale/es/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/es/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2013-10-01 09:56+0000\n" "Last-Translator: Pedro Gracia \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/modoboa/language/" diff --git a/modoboa/relaydomains/locale/fr/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/fr/LC_MESSAGES/django.po index bc3bc42c7..eb56361f6 100644 --- a/modoboa/relaydomains/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: modoboa-1.1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2011-01-07 10:00+100\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: FR \n" diff --git a/modoboa/relaydomains/locale/it/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/it/LC_MESSAGES/django.po index dacccdd0a..275b64e6e 100644 --- a/modoboa/relaydomains/locale/it/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2013-12-23 00:56+0100\n" "Last-Translator: Alberto Berti \n" "Language-Team: ITALIANO \n" diff --git a/modoboa/relaydomains/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/ja_JP/LC_MESSAGES/django.po index c38f4bffb..0b6620361 100644 --- a/modoboa/relaydomains/locale/ja_JP/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/ja_JP/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2016-06-07 07:27+0000\n" "Last-Translator: cwatanab \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/" diff --git a/modoboa/relaydomains/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/nl_NL/LC_MESSAGES/django.po index 6c4a9c495..28d4b0020 100644 --- a/modoboa/relaydomains/locale/nl_NL/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/nl_NL/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-31 11:37+0000\n" "Last-Translator: TuxBrother \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" diff --git a/modoboa/relaydomains/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/pt_BR/LC_MESSAGES/django.po index 71a7f7377..15c7ef798 100644 --- a/modoboa/relaydomains/locale/pt_BR/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/pt_BR/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-13 09:10+0000\n" "Last-Translator: Paulino Michelazzo \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" diff --git a/modoboa/relaydomains/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/pt_PT/LC_MESSAGES/django.po index 4b615f8c4..8b4201eda 100644 --- a/modoboa/relaydomains/locale/pt_PT/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/pt_PT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2014-12-29 12:51+0000\n" "Last-Translator: Mike C. \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" diff --git a/modoboa/relaydomains/locale/ru/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/ru/LC_MESSAGES/django.po index 244fdffa7..9dbf54986 100644 --- a/modoboa/relaydomains/locale/ru/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2013-12-03 09:35+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Russian (http://www.transifex.com/projects/p/modoboa/language/" diff --git a/modoboa/relaydomains/locale/sv/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/sv/LC_MESSAGES/django.po index 88297bea9..f9754fb6e 100644 --- a/modoboa/relaydomains/locale/sv/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/sv/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-16 16:03+0200\n" +"POT-Creation-Date: 2016-10-06 13:36+0200\n" "PO-Revision-Date: 2015-01-13 15:18+0000\n" "Last-Translator: Olle Gustafsson \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/modoboa/language/" diff --git a/modoboa/templates/common/mailheaders.html b/modoboa/templates/common/mailheaders.html index 6e0cc12a3..d3b5ba54a 100644 --- a/modoboa/templates/common/mailheaders.html +++ b/modoboa/templates/common/mailheaders.html @@ -1,8 +1,8 @@ -{% load i18n %} +{% load i18n lib_tags %} {% block emailheaders %}
{% for hdr in headers %}
-
{{ hdr.name }}
{{ hdr.value }}
+
{{ hdr.name|localize_header_name }}
{{ hdr.value }}
{% endfor %} {% block extraheaders %}{% endblock %}
diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index 79ffdacbe..b26afe484 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -106,6 +106,25 @@ USE_L10N = False USE_TZ = True +# Webmail datetime formats according to +# https://docs.djangoproject.com/en/1.10/ref/templates/builtins/ +# modoboa-webmail is able to show the datetime of emails +# in two ways. +# If none is provided, default is RFC 5322 formatted date. +# For this, USE_L10N must be set to True! + +# emails of the last week +# en-us style +WEBMAIL_SHORT_DATETIME_FORMAT = "l, P" +# european style +# WEBMAIL_SHORT_DATETIME_FORMAT = "l, H:i" + +# emails older than a week +# en-us style +WEBMAIL_DATETIME_FORMAT = "N, j Y P" +# european style +# WEBMAIL_DATETIME_FORMAT = "d. N Y H:i" + # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.6/howto/static-files/ From 0fd1fafef3de48692a34344179f93e70f4b45d29 Mon Sep 17 00:00:00 2001 From: Christian Wiegand Date: Thu, 6 Oct 2016 15:53:44 +0200 Subject: [PATCH 22/40] Changed string delimiters form ' to ". Moved the webmail locale datetime formatting settings to new settings.py in webmail module. --- modoboa/lib/templatetags/lib_tags.py | 6 ++---- test_project/test_project/settings.py | 20 -------------------- 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py index fa4908df0..88e01a000 100644 --- a/modoboa/lib/templatetags/lib_tags.py +++ b/modoboa/lib/templatetags/lib_tags.py @@ -100,7 +100,5 @@ def extra_static_content(caller, st_type, user): @register.filter(name='localize_header_name') def localize_header_name(headername): """ Localizes the header names """ - names = {'From': _('From'), 'To': _('To'), 'Date': _('Date'), 'Subject': _('Subject')} - if names.has_key(headername): - return names[headername] - return headername + names = {"From": _("From"), "To": _("To"), "Date": _("Date"), "Subject": _("Subject")} + return names.get(headername, headername) diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index b26afe484..e4ca61d1d 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -106,26 +106,6 @@ USE_L10N = False USE_TZ = True -# Webmail datetime formats according to -# https://docs.djangoproject.com/en/1.10/ref/templates/builtins/ -# modoboa-webmail is able to show the datetime of emails -# in two ways. -# If none is provided, default is RFC 5322 formatted date. -# For this, USE_L10N must be set to True! - -# emails of the last week -# en-us style -WEBMAIL_SHORT_DATETIME_FORMAT = "l, P" -# european style -# WEBMAIL_SHORT_DATETIME_FORMAT = "l, H:i" - -# emails older than a week -# en-us style -WEBMAIL_DATETIME_FORMAT = "N, j Y P" -# european style -# WEBMAIL_DATETIME_FORMAT = "d. N Y H:i" - - # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.6/howto/static-files/ From d9c934e432b6a3414f8a60f87ff1517b19973be9 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 8 Oct 2016 09:10:18 +0200 Subject: [PATCH 23/40] Updated french translation. --- modoboa/admin/locale/fr/LC_MESSAGES/django.po | 146 +++++------------- modoboa/locale/fr/LC_MESSAGES/django.po | 76 +++------ 2 files changed, 59 insertions(+), 163 deletions(-) diff --git a/modoboa/admin/locale/fr/LC_MESSAGES/django.po b/modoboa/admin/locale/fr/LC_MESSAGES/django.po index 8c0d64371..896118478 100644 --- a/modoboa/admin/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/fr/LC_MESSAGES/django.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Antoine Nguyen , 2015-2016 msgid "" @@ -9,13 +9,13 @@ msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-10-06 13:36+0200\n" -"PO-Revision-Date: 2016-09-16 13:56+0000\n" +"PO-Revision-Date: 2016-10-08 07:09+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" -"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: admin/app_settings.py:54 admin/callbacks.py:25 @@ -38,11 +38,9 @@ msgstr "MX(s) valide(s)" #: admin/app_settings.py:68 msgid "" -"IP(s) or network(s) of the MX that should match with domains' MX records. On " -"per line." -msgstr "" -"IP(s) ou réseau(x) avec lesquels les enregistrements MX des domaines doivent " -"correspondre. Un par ligne." +"IP(s) or network(s) of the MX that should match with domains' MX records. On" +" per line." +msgstr "IP(s) ou réseau(x) avec lesquels les enregistrements MX des domaines doivent correspondre. Un par ligne." #: admin/app_settings.py:77 msgid "Enable DNSBL checks" @@ -64,9 +62,7 @@ msgstr "Gérer les boites sur le système de fichiers" msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" -msgstr "" -"Renommer ou supprimer les boites sur le système de fichiers quand elles sont " -"renommées ou supprimées dans Modoboa" +msgstr "Renommer ou supprimer les boites sur le système de fichiers quand elles sont renommées ou supprimées dans Modoboa" #: admin/app_settings.py:96 msgid "Mailboxes owner" @@ -84,9 +80,7 @@ msgstr "Quota de domaine par défaut" msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." -msgstr "" -"Quota par défaut (en Mo) appliqué aux domaines fraichement créés et ne " -"spécifiant pas de valeur. 0 signifie qu'aucun quota ne sera appliqué." +msgstr "Quota par défaut (en Mo) appliqué aux domaines fraichement créés et ne spécifiant pas de valeur. 0 signifie qu'aucun quota ne sera appliqué." #: admin/app_settings.py:113 msgid "Automatic account removal" @@ -94,19 +88,16 @@ msgstr "Suppression automatique de compte" #: admin/app_settings.py:116 msgid "When a mailbox is removed, also remove the associated account" -msgstr "" -"Lorsqu'une boite aux lettres est supprimée, supprimer le compte associé en " -"même temps" +msgstr "Lorsqu'une boite aux lettres est supprimée, supprimer le compte associé en même temps" #: admin/app_settings.py:120 msgid "Automatic domain/mailbox creation" msgstr "Création automatique de domaine/boite aux lettres" #: admin/app_settings.py:123 -msgid "Create a domain and a mailbox when an account is automatically created." -msgstr "" -"Créer un domaine et une boite aux lettres quand un compte est créé " -"automatiquement." +msgid "" +"Create a domain and a mailbox when an account is automatically created." +msgstr "Créer un domaine et une boite aux lettres quand un compte est créé automatiquement." #: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 @@ -153,9 +144,7 @@ msgstr "Nom d'utilisateur" msgid "" "The user's name. Must be a valid e-mail address for simple users or " "administrators with a mailbox." -msgstr "" -"Le nom de l'utilisateur. Doit être une adresse e-mail valide pour les " -"utilisateurs simples ou les administrateurs avec une boite aux lettres." +msgstr "Le nom de l'utilisateur. Doit être une adresse e-mail valide pour les utilisateurs simples ou les administrateurs avec une boite aux lettres." #: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" @@ -211,10 +200,7 @@ msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " "administrators)." -msgstr "" -"Quota en Mo pour cette boite. 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)." +msgstr "Quota en Mo pour cette boite. 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)." #: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 @@ -226,10 +212,7 @@ msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " "*@domain.tld)." -msgstr "" -"Alias de cette boite. Indiquer seulement une adresse par champ, appuyer sur " -"ENTREE pour ajouter un nouveau champ. Utiliser le caractère '*' pour créer " -"une adresse 'attrape tout' (ex: *@domain.tld)." +msgstr "Alias de cette boite. Indiquer seulement une adresse par champ, appuyer sur ENTREE pour ajouter un nouveau champ. Utiliser le caractère '*' pour créer une adresse 'attrape tout' (ex: *@domain.tld)." #: admin/forms/account.py:214 msgid "Sender addresses" @@ -240,11 +223,7 @@ msgid "" "Additional sender address(es) for this account. The user will be allowed to " "send emails using this address, even if it does not exist locally. Indicate " "one address per input. Press ENTER to add a new input." -msgstr "" -"Adresse(s) d'envoi supplémentaire(s) pour ce compte. L'utilisateur sera " -"autorisé à envoyer des e-mails en utilisant la/les adresse(s) déclarée(s), " -"même si elle(s) n'existe(nt) pas localement. Indiquer une adresse par champ. " -"Appuyer sur ENTREE pour ajouter un nouveau champ." +msgstr "Adresse(s) d'envoi supplémentaire(s) pour ce compte. L'utilisateur sera autorisé à envoyer des e-mails en utilisant la/les adresse(s) déclarée(s), même si elle(s) n'existe(nt) pas localement. Indiquer une adresse par champ. Appuyer sur ENTREE pour ajouter un nouveau champ." #: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 @@ -300,9 +279,7 @@ msgstr "Adresse email" msgid "" "The alias address. To create a catchall alias, just enter the domain name " "(@domain.tld)." -msgstr "" -"L'adresse de l'alias. Pour créer un alias \"fourre-tout\", saisissez " -"uniquement le nom du domaine (@domain.tld)." +msgstr "L'adresse de l'alias. Pour créer un alias \"fourre-tout\", saisissez uniquement le nom du domaine (@domain.tld)." #: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" @@ -312,9 +289,7 @@ msgstr "Destinataires" msgid "" "Addresses this alias will point to. Indicate only one address per input, " "press ENTER to add a new input." -msgstr "" -"Les adresses vers lesquelles cet alias pointera. Indiquer une adresse par " -"champ, appuyer sur ENTREE pour ajouter un nouveau champ." +msgstr "Les adresses vers lesquelles cet alias pointera. Indiquer une adresse par champ, appuyer sur ENTREE pour ajouter un nouveau champ." #: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 #: admin/templates/admin/domain_statistics.html:49 @@ -341,17 +316,13 @@ msgstr "Type" msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." -msgstr "" -"Quota par défaut en Mo appliqué aux boites aux lettres. Laisser vide pour " -"utiliser la valeur par défaut." +msgstr "Quota par défaut en Mo appliqué aux boites aux lettres. Laisser vide pour utiliser la valeur par défaut." #: admin/forms/domain.py:47 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." -msgstr "" -"Alias de ce domaine. Indiquer seulement un nom par champ, appuyer sur ENTREE " -"pour ajouter un nouveau champ." +msgstr "Alias de ce domaine. Indiquer seulement un nom par champ, appuyer sur ENTREE pour ajouter un nouveau champ." #: admin/forms/domain.py:101 admin/forms/domain.py:113 #: admin/forms/domain.py:121 @@ -382,9 +353,7 @@ msgstr "Nom" msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." -msgstr "" -"Le nom de l'administrateur. Ne pas include un nom de domaine ici, il sera " -"ajouté automatiquement." +msgstr "Le nom de l'administrateur. Ne pas include un nom de domaine ici, il sera ajouté automatiquement." #: admin/forms/domain.py:184 msgid "Create aliases" @@ -447,9 +416,7 @@ msgstr "Transférer les messages et conserver une copie dans votre boite locale" msgid "" "You can't define a forward to a local destination. Please ask your " "administrator to create an alias instead." -msgstr "" -"Vous ne pouvez pas définir un transfert vers une destination locale. " -"Veuillez plutôt demander à votre administrateur de créer un alias" +msgstr "Vous ne pouvez pas définir un transfert vers une destination locale. Veuillez plutôt demander à votre administrateur de créer un alias" #: admin/forms/import_.py:11 msgid "Select a file" @@ -469,9 +436,7 @@ msgstr "Chiffrer les mots de passe" #: admin/forms/import_.py:40 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" #: admin/lib.py:31 msgid "A mailbox is required" @@ -490,15 +455,13 @@ msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] Problème(s) DNSBL pour le domaine {}" #: admin/management/commands/subcommands/_mx.py:180 -#, fuzzy -#| msgid "Domain {} as no MX record" msgid "Domain {} has no MX record" -msgstr "Le domaine {} n'a aucun enregistrement MX" +msgstr "Le domaine {} n'a pas d'enregistrement MX" #: admin/management/commands/subcommands/_mx.py:191 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" -msgstr "" +msgstr "Enregistrement MX invalide pour le domaine {0} : {1}" #: admin/management/commands/subcommands/_mx.py:207 msgid "[modoboa] MX issue(s) for domain {}" @@ -614,9 +577,7 @@ msgstr "Permission refusée." #: admin/serializers.py:82 msgid "" "List of administered domains (resellers and domain administrators only)." -msgstr "" -"Liste des domaines administrés (revendeurs et administrateurs de domaine " -"seulement)." +msgstr "Liste des domaines administrés (revendeurs et administrateurs de domaine seulement)." #: admin/serializers.py:189 msgid "Not allowed for this role." @@ -745,7 +706,7 @@ msgstr "Statut DNS" #: admin/templates/admin/domain_detail.html:28 #: admin/templates/admin/domains_table.html:12 msgid "Awaiting checks" -msgstr "" +msgstr "En attente de vérification" #: admin/templates/admin/domain_detail.html:40 msgid "Creation date" @@ -866,9 +827,7 @@ msgstr "Mis à jour" #: admin/templates/admin/mx_domain_detail.html:23 msgid "This IP does not match any of the valid MXs defined in parameters" -msgstr "" -"Cette IP ne correspond à un aucun des MX valides déclarés dans les " -"paramètres." +msgstr "Cette IP ne correspond à un aucun des MX valides déclarés dans les paramètres." #: admin/templates/admin/mx_domain_detail.html:36 msgid "No MX record found for this domain." @@ -879,26 +838,19 @@ msgstr "Aucun enregistrement MX trouvé pour ce domaine." msgid "" "Modoboa detected that domain %(domain)s is listed by the following DNSBL " "providers:" -msgstr "" -"Modoboa a détecté que le domaine %(domain)s est listé par les fournisseurs " -"de DNSBL suivants :" +msgstr "Modoboa a détecté que le domaine %(domain)s est listé par les fournisseurs de DNSBL suivants :" #: admin/templates/admin/notifications/domain_in_dnsbl.html:11 msgid "" "The domain's reputation will be affected and there is a chance that emails " "coming from it are considered as spam. You should contact those providers " "and ask them to unlist detected IP address(es)." -msgstr "" -"La réputation de ce domaine sera affectée et il est probable que les emails " -"venant de lui soient considérés comme du spam. Vous devriez contacter ces " -"fournisseurs pour leur demander de délister la/les adresse(s) détectée(s)." +msgstr "La réputation de ce domaine sera affectée et il est probable que les emails venant de lui soient considérés comme du spam. Vous devriez contacter ces fournisseurs pour leur demander de délister la/les adresse(s) détectée(s)." #: admin/templates/admin/notifications/domain_invalid_mx.html:3 #, python-format msgid "Modoboa detected that domain %(domain)s has no valid MX record:" -msgstr "" -"Modoboa a détecté que le domain %(domain)s n'a aucun enregistrement MX " -"valide :" +msgstr "Modoboa a détecté que le domain %(domain)s n'a aucun enregistrement MX valide :" #: admin/templates/admin/quota_headers.html:3 msgid "Value" @@ -1044,19 +996,9 @@ msgid "" "
  • domainalias; name; targeted domain; enabled
  • \n" " %s\n" "\n" -"

    The first element of each line is mandatory and must be equal to one of " -"the previous values.

    \n" +"

    The first element of each line is mandatory and must be equal to one of the previous values.

    \n" "

    You can use a different character as separator.

    \n" -msgstr "" -"Fournir un fichier CSV ou chaque ligne respècte un des formats suivants :\n" -"
      \n" -"
    • domain; nom; quota; activé
    • \n" -"
    • domainalias; nom; domaine cible; activé
    • \n" -" %s\n" -"
    \n" -"

    Le premier élément de chaque ligne est obligatoire et doit être égal à " -"l'une des valeurs précédentes.

    \n" -"

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" +msgstr "Fournir un fichier CSV ou chaque ligne respècte un des formats suivants :\n
      \n
    • domain; nom; quota; activé
    • \n
    • domainalias; nom; domaine cible; activé
    • \n %s\n
    \n

    Le premier élément de chaque ligne est obligatoire et doit être égal à l'une des valeurs précédentes.

    \n

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" #: admin/views/import_.py:98 msgid "Import domains" @@ -1066,26 +1008,13 @@ msgstr "Importer des domaines" msgid "" "Provide a CSV file where lines respect one of the following formats:\n" "
      \n" -"
    • account; loginname; password; first name; last name; enabled; group; " -"address; quota; [, domain, ...]
    • \n" +"
    • account; loginname; password; first name; last name; enabled; group; address; quota; [, domain, ...]
    • \n" "
    • alias; address; enabled; recipient; recipient; ...
    • \n" "
    \n" -"

    The first element of each line is mandatory and must be equal to one of " -"the previous values.

    \n" +"

    The first element of each line is mandatory and must be equal to one of the previous values.

    \n" "\n" "

    You can use a different character as separator.

    \n" -msgstr "" -"Fournir un fichier CSV dans lequel les lignes respectent un des formats " -"suivants :\n" -"
      \n" -"
    • account; loginname; password; first name; last name; enabled; group; " -"address; quota; [, domain, ...]
    • \n" -"
    • alias; address; enabled; recipient; recipient; ...
    • \n" -"
    \n" -"

    Le premier élément de chaque ligne est obligatoire et doit être égal à " -"l'une des valeurs précédentes..

    \n" -"\n" -"

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" +msgstr "Fournir un fichier CSV dans lequel les lignes respectent un des formats suivants :\n
      \n
    • account; loginname; password; first name; last name; enabled; group; address; quota; [, domain, ...]
    • \n
    • alias; address; enabled; recipient; recipient; ...
    • \n
    \n

    Le premier élément de chaque ligne est obligatoire et doit être égal à l'une des valeurs précédentes..

    \n\n

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" #: admin/views/import_.py:130 msgid "Import identities" @@ -1094,6 +1023,3 @@ msgstr "Importer des identités" #: admin/views/user.py:35 msgid "Forward updated" msgstr "Transfert mis à jour" - -#~ msgid "Domain {0} got an invalid MX record. Got {1}" -#~ msgstr "L'enregistrement MX du domaine {0} n'est pas bon : {1}." diff --git a/modoboa/locale/fr/LC_MESSAGES/django.po b/modoboa/locale/fr/LC_MESSAGES/django.po index d3d9b999e..1493f4b53 100644 --- a/modoboa/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/locale/fr/LC_MESSAGES/django.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Antoine Nguyen , 2016 msgid "" @@ -9,13 +9,13 @@ msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-10-06 13:36+0200\n" -"PO-Revision-Date: 2016-09-16 14:04+0000\n" +"PO-Revision-Date: 2016-10-08 07:07+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" -"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: core/__init__.py:63 @@ -64,8 +64,7 @@ msgstr "plain (faible)" #: core/app_settings.py:61 msgid "Scheme used to crypt mailbox passwords" -msgstr "" -"Méthode utilisée pour chiffrer les mots de passe des boites aux lettres" +msgstr "Méthode utilisée pour chiffrer les mots de passe des boites aux lettres" #: core/app_settings.py:66 msgid "Rounds" @@ -75,9 +74,7 @@ msgstr "Tours" msgid "" "Number of rounds to use (only used by sha256crypt and sha512crypt). Must be " "between 1000 and 999999999, inclusive." -msgstr "" -"Nombre de tours à utiliser (sha256crypt et sha512crypt uniquement). Doit " -"être compris entre 1000 et 999999999 inclue." +msgstr "Nombre de tours à utiliser (sha256crypt et sha512crypt uniquement). Doit être compris entre 1000 et 999999999 inclue." #: core/app_settings.py:76 msgid "Secret key" @@ -139,9 +136,7 @@ msgstr "ND de connexion" msgid "" "The distinguished name to use when binding to the LDAP server. Leave empty " "for an anonymous bind" -msgstr "" -"Le nom distinctif à utiliser pour les connections au serveur LDAP. Laisser " -"vide pour une connexion anonyme" +msgstr "Le nom distinctif à utiliser pour les connections au serveur LDAP. Laisser vide pour une connexion anonyme" #: core/app_settings.py:128 msgid "Bind password" @@ -149,9 +144,7 @@ msgstr "Mot de passe de connexion" #: core/app_settings.py:131 msgid "The password to use when binding to the LDAP server (with 'Bind DN')" -msgstr "" -"Le mot de passe à utiliser pour les connections au serveur LDAP (avec 'ND de " -"connexion')" +msgstr "Le mot de passe à utiliser pour les connections au serveur LDAP (avec 'ND de connexion')" #: core/app_settings.py:140 msgid "Users search base" @@ -159,9 +152,7 @@ msgstr "Base de recherche des utilisateurs" #: core/app_settings.py:143 msgid "The distinguished name of the search base used to find users" -msgstr "" -"Le nom distinctif de la base de recherche utilisée pour rechercher les " -"utilisateurs" +msgstr "Le nom distinctif de la base de recherche utilisée pour rechercher les utilisateurs" #: core/app_settings.py:150 msgid "Search filter" @@ -171,9 +162,7 @@ msgstr "Filtre de recherche" msgid "" "An optional filter string (e.g. '(objectClass=person)'). In order to be " "valid, it must be enclosed in parentheses." -msgstr "" -"Un filtre de recherche optionel (ex. '(objectClass=person)'). Pour être " -"valide, il doit être entouré de parenthèses." +msgstr "Un filtre de recherche optionel (ex. '(objectClass=person)'). Pour être valide, il doit être entouré de parenthèses." #: core/app_settings.py:161 msgid "User DN template" @@ -184,9 +173,7 @@ msgstr "Modèle de nom distinctif utilisateur" msgid "" "The template used to construct a user's DN. It should contain one " "placeholder (ie. %(user)s)" -msgstr "" -"Le modèle utilisé pour construire le nom distinctif d'un utilisateur. Il " -"doit contenir un espace réservé (ex. %(user)s)" +msgstr "Le modèle utilisé pour construire le nom distinctif d'un utilisateur. Il doit contenir un espace réservé (ex. %(user)s)" #: core/app_settings.py:172 msgid "Password attribute" @@ -210,12 +197,9 @@ msgstr "Groupes administrateurs" #: core/app_settings.py:189 msgid "" -"Members of those LDAP Posix groups will be created as domain administrators. " -"Use ';' characters to separate groups." -msgstr "" -"Les membres de ces groupes LDAP (Posix) seront créés en tant " -"qu'administrateurs de domaine. Utiliser des caractères ';' pour séparer les " -"groupes." +"Members of those LDAP Posix groups will be created as domain administrators." +" Use ';' characters to separate groups." +msgstr "Les membres de ces groupes LDAP (Posix) seront créés en tant qu'administrateurs de domaine. Utiliser des caractères ';' pour séparer les groupes." #: core/app_settings.py:196 msgid "Group type" @@ -231,9 +215,7 @@ msgstr "Base de recherche des groupes" #: core/app_settings.py:208 msgid "The distinguished name of the search base used to find groups" -msgstr "" -"Le nom distinctif de la base de recherche utilisée pour rechercher les " -"groupes" +msgstr "Le nom distinctif de la base de recherche utilisée pour rechercher les groupes" #: core/app_settings.py:213 msgid "Notifications" @@ -273,9 +255,7 @@ msgstr "Envoyer des statistiques" #: core/app_settings.py:243 msgid "Send statistics to Modoboa public API (counters and used extensions)" -msgstr "" -"Envoyer des statistiques à l'API publique de Modoboa (compteurs et " -"extensions utilisées)" +msgstr "Envoyer des statistiques à l'API publique de Modoboa (compteurs et extensions utilisées)" #: core/app_settings.py:247 msgid "Miscellaneous" @@ -311,8 +291,7 @@ msgstr "Redirection par défaut" #: core/app_settings.py:277 msgid "The default redirection used when no application is specified" -msgstr "" -"La redirection appliquée par défaut quand aucune application n'est spécifiée" +msgstr "La redirection appliquée par défaut quand aucune application n'est spécifiée" #: core/app_settings.py:310 msgid "Key must be either 16, 24, or 32 bytes long" @@ -445,8 +424,7 @@ msgstr "Vous ne pouvez pas supprimer votre propre compte" #: core/models.py:164 msgid "Failed to update password: LDAP module not installed" -msgstr "" -"Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé" +msgstr "Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé" #: core/models.py:222 msgid "account" @@ -504,9 +482,7 @@ msgstr "Dernières nouvelles" msgid "" "Visit the official " "weblog for more information." -msgstr "" -"Visitez le blog " -"officiel pour plus d'information." +msgstr "Visitez le blog officiel pour plus d'information." #: core/templates/core/information.html:2 core/templatetags/core_tags.py:53 msgid "Information" @@ -522,8 +498,7 @@ msgstr "Une ou plusieurs mises à jour sont disponibles!" #: core/templates/core/information.html:6 msgid "Check the following list to find the component(s) that can be updated." -msgstr "" -"Consulter la liste suivante pour trouver le(s) composant(s) concerné(s)." +msgstr "Consulter la liste suivante pour trouver le(s) composant(s) concerné(s)." #: core/templates/core/information.html:10 msgid "Applications" @@ -552,7 +527,7 @@ msgstr "Utilisateurs actifs" #: core/templates/core/information.html:37 msgid "Role" -msgstr "" +msgstr "Rôle" #: core/templates/core/information.html:38 msgid "Last login" @@ -651,9 +626,7 @@ msgstr "Utiliseur '%s' connecté avec succès" #: core/views/auth.py:48 msgid "Your username and password didn't match. Please try again." -msgstr "" -"Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez " -"réessayer." +msgstr "Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez réessayer." #: core/views/auth.py:76 #, python-format @@ -716,11 +689,11 @@ msgstr "Impossible de mettre à jour le mot de passe : {}" #: lib/templatetags/lib_tags.py:103 msgid "From" -msgstr "" +msgstr "De" #: lib/templatetags/lib_tags.py:103 msgid "To" -msgstr "" +msgstr "À" #: lib/templatetags/lib_tags.py:103 templates/common/email_searchbar.html:17 msgid "Subject" @@ -784,6 +757,3 @@ msgstr "Se souvenir de moi" #: templates/registration/login.html:43 msgid "Log in" msgstr "Se connecter" - -#~ msgid "Group name" -#~ msgstr "Nom du groupe" From a6c092c06cba1ece1ec045d7d84d1c7176e1eaf1 Mon Sep 17 00:00:00 2001 From: Felipe Morato Date: Sun, 9 Oct 2016 00:08:55 -0300 Subject: [PATCH 24/40] Update upgrade.rst Typo fix: `now` -> `know` --- doc/getting_started/upgrade.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/getting_started/upgrade.rst b/doc/getting_started/upgrade.rst index 8f8cb82dc..55ae4a40b 100644 --- a/doc/getting_started/upgrade.rst +++ b/doc/getting_started/upgrade.rst @@ -55,7 +55,7 @@ Specific upgrade instructions An interesting feature brougth by this version is the capability to make different checks about MX records. For example, Modoboa can query main `DNSBL `_ providers -for every defined domain. With this, you will quickly now if one the +for every defined domain. With this, you will quickly know if one the domains you manage is listed or not. To activate it, add the following line to your crontab:: From 00094f7adaf45d852f151a57cc3623b7e2308281 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 10 Oct 2016 13:08:46 +0200 Subject: [PATCH 25/40] Remove deprecated provider and full DNS names. see #921 --- modoboa/admin/constants.py | 1 - modoboa/admin/management/commands/subcommands/_mx.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/modoboa/admin/constants.py b/modoboa/admin/constants.py index ce41092be..45704b6d7 100644 --- a/modoboa/admin/constants.py +++ b/modoboa/admin/constants.py @@ -21,7 +21,6 @@ DNSBL_PROVIDERS = [ "dnsbl-3.uceprotect.net", "dnsbl.cyberlogic.net", "dnsbl.inps.de", - "dnsbl.njabl.org", "dnsbl.sorbs.net", "drone.abuse.ch", "duinv.aupads.org", diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index 8c1a8e7d2..09fe918fe 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -114,7 +114,7 @@ class CheckMXRecords(BaseCommand): results = {} for mx in mx_list: reverse = ".".join(reversed(mx.address.split("."))) - pattern = "{}.{}".format(reverse, provider) + pattern = "{}.{}.".format(reverse, provider) try: results[mx] = socket.gethostbyname(pattern) except socket.gaierror: From abe88b37c87b12e13d1aaa3a11002809dcf41121 Mon Sep 17 00:00:00 2001 From: Christian Wiegand Date: Mon, 10 Oct 2016 19:54:41 +0200 Subject: [PATCH 26/40] Added datetime formats for all supported languages --- modoboa/core/constants.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/modoboa/core/constants.py b/modoboa/core/constants.py index 8adce607f..3b0a7eca8 100644 --- a/modoboa/core/constants.py +++ b/modoboa/core/constants.py @@ -38,6 +38,24 @@ LANGUAGES = ( ) +# according to https://en.wikipedia.org/wiki/Date_format_by_country +# and https://en.wikipedia.org/wiki/Date_and_time_representation_by_country +DATETIME_FORMATS = { + "cs": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, + "de": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, + "en": {'SHORT': 'l, P', 'LONG': 'N j, Y P'}, + "es": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, + "fr": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, + "it": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, + "ja_JP": {'SHORT': 'l, P', 'LONG': 'N j, Y P'}, + "nl": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, + "pt_PT": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, + "pt_BR": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, + "ru": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, + "sv": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, + +} + LDAP_GROUP_TYPES = ( ("posixgroup", "PosixGroup"), ("groupofnames", "GroupOfNames"), From c13ba5fa90473302c6821c89cd95c2371f06a1b0 Mon Sep 17 00:00:00 2001 From: Christian Wiegand Date: Tue, 11 Oct 2016 10:50:20 +0200 Subject: [PATCH 27/40] Moved the DATETIME_FORMATS dictionary to from modoboa/core/constants.py to modoboa_webmail/imapheaders.py to seperate plugins from modoboa core. --- modoboa/core/constants.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/modoboa/core/constants.py b/modoboa/core/constants.py index 3b0a7eca8..8adce607f 100644 --- a/modoboa/core/constants.py +++ b/modoboa/core/constants.py @@ -38,24 +38,6 @@ LANGUAGES = ( ) -# according to https://en.wikipedia.org/wiki/Date_format_by_country -# and https://en.wikipedia.org/wiki/Date_and_time_representation_by_country -DATETIME_FORMATS = { - "cs": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, - "de": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, - "en": {'SHORT': 'l, P', 'LONG': 'N j, Y P'}, - "es": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, - "fr": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, - "it": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, - "ja_JP": {'SHORT': 'l, P', 'LONG': 'N j, Y P'}, - "nl": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, - "pt_PT": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, - "pt_BR": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, - "ru": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, - "sv": {'SHORT': 'l, H:i', 'LONG': 'd. N Y H:i'}, - -} - LDAP_GROUP_TYPES = ( ("posixgroup", "PosixGroup"), ("groupofnames", "GroupOfNames"), From fe7d4abe6fb0079cd40a47efc9c1a64dd0097b76 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 12 Oct 2016 10:39:01 +0200 Subject: [PATCH 28/40] Make sure to set the owner. see #937 --- modoboa/admin/tests/test_account.py | 20 +++++++++++++++++++- modoboa/core/models.py | 3 +++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py index def372820..ea3080ad4 100644 --- a/modoboa/admin/tests/test_account.py +++ b/modoboa/admin/tests/test_account.py @@ -74,6 +74,24 @@ class AccountTestCase(ModoTestCase): alias__internal=True).exists() ) + def test_delete_default_superadmin(self): + """Delete default superadmin.""" + sadmin2 = core_factories.UserFactory( + username="admin2", is_superuser=True) + sadmin = User.objects.get(username="admin") + self.client.force_login(sadmin2) + self.ajax_post( + reverse("admin:account_delete", args=[sadmin.pk]), {} + ) + values = { + "username": "user@test.com", "role": "DomainAdmins", + "is_active": True, "email": "user@test.com" + } + account = User.objects.get(username="user@test.com") + self.ajax_post( + reverse("admin:account_change", args=[account.pk]), values + ) + def test_sender_address(self): """Check if sender addresses are saved.""" account = User.objects.get(username="user@test.com") @@ -198,7 +216,7 @@ class AccountTestCase(ModoTestCase): self.assertIn("Resources usage", response.content) -@skipIf(NO_LDAP, 'No ldap module installed') +@skipIf(NO_LDAP, "No ldap module installed") @override_settings(AUTHENTICATION_BACKENDS=( 'modoboa.lib.authbackends.LDAPBackend', 'modoboa.lib.authbackends.SimpleBackend', diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 39816d66f..5af31543b 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -118,6 +118,9 @@ class User(PermissionsMixin): raise PermDeniedException owner = get_object_owner(self) + if owner == self: + # The default admin is being removed... + owner = fromuser for ooentry in self.objectaccess_set.filter(is_owner=True): if ooentry.content_object is not None: grant_access_to_object(owner, ooentry.content_object, True) From 327b0a557f87300685472bd8587b89dafc3b47f7 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 12 Oct 2016 11:29:21 +0200 Subject: [PATCH 29/40] Added missing upgrade instruction. fix #926 --- doc/getting_started/upgrade.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/getting_started/upgrade.rst b/doc/getting_started/upgrade.rst index 55ae4a40b..8b79350d1 100644 --- a/doc/getting_started/upgrade.rst +++ b/doc/getting_started/upgrade.rst @@ -73,6 +73,16 @@ configuration as follows:: MODOBOA_API_URL = 'https://api.modoboa.org/1/' +Finally, it is now possible to declare additional sender addresses on +a per-account basis. You need to update your postfix configuration in +order to use this functionality. Just edit the :file:`main.cf` file +and change the following parameter:: + + smtpd_sender_login_maps = + :/etc/postfix/sql-sender-login-mailboxes.cf + :/etc/postfix/sql-sender-login-aliases.cf + :/etc/postfix/sql-sender-login-mailboxes-extra.cf + 1.5.0 ===== From f3586789d72b426adaba517b8eb760f5996a8693 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 12 Oct 2016 11:30:55 +0200 Subject: [PATCH 30/40] Removed deprecated property. --- modoboa/core/models.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 5af31543b..d2ef47cdb 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -242,16 +242,6 @@ class User(PermissionsMixin): return "%s %s" % (self.first_name, self.last_name) return "----" - @property - def group(self): - """FIXME: DEPRECATED""" - if self.is_superuser: - return "SuperAdmins" - try: - return self.groups.all()[0].name - except IndexError: - return "---" - @property def enabled(self): return self.is_active From e2703e45c2e47dc28ef3c3ea0c47cc2291f653e4 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 12 Oct 2016 14:32:49 +0200 Subject: [PATCH 31/40] Version 1.6.1 --- doc/conf.py | 2 +- setup.py | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 5272f3e50..44da751d4 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -52,7 +52,7 @@ copyright = u'2016, Antoine Nguyen' # The short X.Y version. version = '1.6' # The full version, including alpha/beta/rc tags. -release = '1.6.0' +release = '1.6.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/setup.py b/setup.py index 0fa5090f0..7554a2a39 100644 --- a/setup.py +++ b/setup.py @@ -54,24 +54,24 @@ def read(fname): setup( name="modoboa", - version='1.6.0', - url='http://modoboa.org/', - license='MIT', + version="1.6.1", + url="http://modoboa.org/", + license="ISC", description="Mail hosting made simple", - long_description=read('README.rst'), - author='Antoine Nguyen', - author_email='tonio@ngyn.org', + long_description=read("README.rst"), + author="Antoine Nguyen", + author_email="tonio@ngyn.org", packages=find_packages(), include_package_data=True, scripts=["bin/modoboa-admin.py"], zip_safe=False, install_requires=parse_requirements(PIP_REQUIRES), dependency_links=parse_dependency_links(PIP_REQUIRES), - classifiers=['Development Status :: 5 - Production/Stable', - 'Framework :: Django', - 'Intended Audience :: System Administrators', - 'License :: OSI Approved :: MIT License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Topic :: Internet :: WWW/HTTP'] + classifiers=["Development Status :: 5 - Production/Stable", + "Framework :: Django", + "Intended Audience :: System Administrators", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Topic :: Internet :: WWW/HTTP"] ) From a58f1204c58df578a3081e6268371dd3f76886f1 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 13 Oct 2016 14:13:12 +0200 Subject: [PATCH 32/40] Update README.rst Remove stats --- README.rst | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.rst b/README.rst index bc2388426..e950c8616 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,7 @@ `Modoboa `_ ################################ -|travis| |codecov| |landscape| |latest-version| |downloads| +|travis| |codecov| |landscape| |latest-version| Modoboa is a mail hosting and management platform including a modern and simplified Web User Interface. It provides useful components such @@ -58,9 +58,6 @@ The following external libraries are provided with Modoboa: .. |landscape| image:: https://landscape.io/github/tonioo/modoboa/master/landscape.svg?style=flat :target: https://landscape.io/github/tonioo/modoboa/master :alt: Code Health -.. |downloads| image:: https://img.shields.io/pypi/dm/modoboa.svg - :target: https://pypi.python.org/pypi/modoboa/ - :alt: Downloads from Pypi .. |travis| image:: https://travis-ci.org/tonioo/modoboa.png?branch=master :target: https://travis-ci.org/tonioo/modoboa .. |codecov| image:: http://codecov.io/github/tonioo/modoboa/coverage.svg?branch=master From 0ff6de98ad4f2dfa6c33b9fb6cad22b0e97f1eb6 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 13 Oct 2016 21:59:26 +0200 Subject: [PATCH 33/40] Fixed syntax error. fix #940 --- modoboa/admin/postfix_maps.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modoboa/admin/postfix_maps.py b/modoboa/admin/postfix_maps.py index b8e19a3b0..9eca03ed4 100644 --- a/modoboa/admin/postfix_maps.py +++ b/modoboa/admin/postfix_maps.py @@ -125,13 +125,13 @@ class SenderLoginMailboxExtraMap(object): "WHERE sad.address='%s'" ) postgres = ( - "SELECT mb.address || '@' || dom.name) FROM admin_mailbox mb " + "SELECT mb.address || '@' || dom.name FROM admin_mailbox mb " "INNER JOIN admin_senderaddress sad ON sad.mailbox_id=mb.id " "INNER JOIN admin_domain dom ON dom.id=mb.domain_id " "WHERE sad.address='%s'" ) sqlite = ( - "SELECT mb.address || '@' || dom.name) FROM admin_mailbox mb " + "SELECT mb.address || '@' || dom.name FROM admin_mailbox mb " "INNER JOIN admin_senderaddress sad ON sad.mailbox_id=mb.id " "INNER JOIN admin_domain dom ON dom.id=mb.domain_id " "WHERE sad.address='%s'" From 5e0b5de94afcdf917237434cef91b405c4c8fc1d Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 14 Oct 2016 14:24:10 +0200 Subject: [PATCH 34/40] Improve documentation. see #942 --- modoboa/admin/api.py | 9 ++++++--- modoboa/admin/serializers.py | 8 ++++++-- modoboa/core/commands/templates/settings.py.tpl | 8 ++++++-- requirements.txt | 2 +- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/modoboa/admin/api.py b/modoboa/admin/api.py index c8c39fa92..24684c4fa 100644 --- a/modoboa/admin/api.py +++ b/modoboa/admin/api.py @@ -56,9 +56,12 @@ class AccountViewSet(viewsets.ModelViewSet): def get_serializer_class(self): """Return a serializer.""" - if self.request.method == "GET": - return serializers.AccountSerializer - return serializers.WritableAccountSerializer + action_dict = { + "list": serializers.AccountSerializer, + "retrive": serializers.AccountSerializer + } + return action_dict.get( + self.action, serializers.WritableAccountSerializer) def get_queryset(self): """Filter queryset based on current user.""" diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index 8a842f5ae..a37907d86 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -8,6 +8,7 @@ from rest_framework import serializers from passwords import validators from modoboa.admin import models as admin_models +from modoboa.core import constants as core_constants from modoboa.core import models as core_models from modoboa.core import signals as core_signals from modoboa.lib import exceptions as lib_exceptions @@ -154,6 +155,8 @@ class AccountPasswordSerializer(serializers.ModelSerializer): class WritableAccountSerializer(AccountSerializer): """Serializer to create account.""" + role = serializers.ChoiceField(choices=core_constants.ROLES) + class Meta(AccountSerializer.Meta): fields = AccountSerializer.Meta.fields + ( "password", ) @@ -184,11 +187,12 @@ class WritableAccountSerializer(AccountSerializer): def validate(self, data): """Check constraints.""" master_user = data.get("master_user", False) - if master_user and data["role"] != "SuperAdmins": + role = data.get("role") + if master_user and role != "SuperAdmins": raise serializers.ValidationError({ "master_user": _("Not allowed for this role.") }) - if data["role"] == "SimpleUsers": + if role == "SimpleUsers": mailbox = data.get("mailbox") if mailbox is None: data["mailbox"] = { diff --git a/modoboa/core/commands/templates/settings.py.tpl b/modoboa/core/commands/templates/settings.py.tpl index 655702486..5eb1d00e0 100644 --- a/modoboa/core/commands/templates/settings.py.tpl +++ b/modoboa/core/commands/templates/settings.py.tpl @@ -167,8 +167,12 @@ SWAGGER_SETTINGS = { "exclude_namespaces": [], "info": { "contact": "contact@modoboa.com", - "description": ("Modoboa API, requires a valid token."), - "title": "Modoboa API", + "description": ( + "Modoboa API, requires a valid token. To obtain a token, login " + "as super administrator, go to 'User settings > API' and enable " + "API access. Click on 'Update' and wait for page refresh." + ), + "title": "Modoboa API documentation", } } diff --git a/requirements.txt b/requirements.txt index c11bde24b..1bad2a489 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ django-xforwardedfor-middleware django-passwords==0.3.10 rfc6266 progressbar==2.3 -djangorestframework==3.3.1 +djangorestframework==3.3.3 django-rest-swagger==0.3.5 django-subcommand2==0.1.1 gevent==1.1.1 From 6c6f440f84dc69e8ab710c093984b96445de20a5 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 14 Oct 2016 17:50:43 +0200 Subject: [PATCH 35/40] Catch LookupError exception. fix #944 --- modoboa/lib/u2u_decode.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/modoboa/lib/u2u_decode.py b/modoboa/lib/u2u_decode.py index 7ff7c8fee..085e714e8 100644 --- a/modoboa/lib/u2u_decode.py +++ b/modoboa/lib/u2u_decode.py @@ -1,12 +1,9 @@ -#!/usr/bin/env python # coding: utf-8 -""" -u2u_decode.py -unstructured rfc2047 header to unicode -""" -import re +"""Unstructured rfc2047 header to unicode.""" + from email.header import decode_header, make_header +import re # check spaces between encoded_words (and strip them) sre = re.compile(r'\?=[ \t]+=\?') @@ -15,7 +12,7 @@ mre = re.compile(r'=\?[^?]*?\?[bq]\?[^?\t]*?\?=', re.I) def clean_spaces(m): - """Replace unencoded spaces in string + """Replace unencoded spaces in string. :param str m: a match object :return: the cleaned string @@ -24,12 +21,11 @@ def clean_spaces(m): def decode_mime(m): - """substitute matching encoded_word with unicode equiv. - """ + """Substitute matching encoded_word with unicode equiv.""" h = decode_header(clean_spaces(m)) try: u = unicode(make_header(h)) - except UnicodeDecodeError: + except (LookupError, UnicodeDecodeError): return m.group(0) return u From 3f994c76b7b3c9eb5b77e58482f33496476d031b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20de=20l=27Epine?= Date: Fri, 14 Oct 2016 23:13:36 +0200 Subject: [PATCH 36/40] Update account.py tip update on the alias field according the new wildcard syntax (without '*') --- modoboa/admin/forms/account.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index 63ed90e1e..36246ba38 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -206,8 +206,8 @@ class AccountFormMail(forms.Form, DynamicForm): required=False, help_text=ugettext_lazy( "Alias(es) of this mailbox. Indicate only one address per input, " - "press ENTER to add a new input. Use the '*' character to create " - "a 'catchall' alias (ex: *@domain.tld)." + "press ENTER to add a new input. To create a catchall alias, just " + "enter the domain name (@domain.tld)." ) ) senderaddress = lib_fields.UTF8AndEmptyUserEmailField( From 8ec95a4cd0d9f315b1ce5adffd816d48c4e35d12 Mon Sep 17 00:00:00 2001 From: Christian Wiegand Date: Sun, 16 Oct 2016 10:55:22 +0200 Subject: [PATCH 37/40] Improved German translation: Translation of user settings dialog, corrected wrong parenthesis in logging of login/logout, language label field had no label tag --- modoboa/core/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/core/models.py b/modoboa/core/models.py index d2ef47cdb..595992f21 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -67,7 +67,7 @@ class User(PermissionsMixin): ugettext_lazy('last login'), blank=True, null=True ) - language = models.CharField( + language = models.CharField(ugettext_lazy('language'), max_length=10, default="en", choices=constants.LANGUAGES, help_text=ugettext_lazy( "Prefered language to display pages." From b41183b7c2ff18989b2a0bab6c3e2f89863571e1 Mon Sep 17 00:00:00 2001 From: Christian Wiegand Date: Sun, 16 Oct 2016 10:55:48 +0200 Subject: [PATCH 38/40] Improved German translation: Translation of user settings dialog, corrected wrong parenthesis in logging of login/logout, language label field had no label tag --- modoboa/core/views/auth.py | 4 +-- modoboa/locale/de/LC_MESSAGES/django.po | 45 +++++++++---------------- 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/modoboa/core/views/auth.py b/modoboa/core/views/auth.py index ea9c69fd8..86051cf25 100644 --- a/modoboa/core/views/auth.py +++ b/modoboa/core/views/auth.py @@ -38,7 +38,7 @@ def dologin(request): request.user.language) logger.info( - _("User '%s' successfully logged in" % user.username) + _("User '%s' successfully logged in") % user.username ) events.raiseEvent("UserLogin", request, form.cleaned_data["username"], @@ -73,6 +73,6 @@ def dologout(request): if not request.user.is_anonymous(): events.raiseEvent("UserLogout", request) logger = logging.getLogger("modoboa.auth") - logger.info(_("User '%s' logged out" % request.user.username)) + logger.info(_("User '%s' logged out") % request.user.username) logout(request) return HttpResponseRedirect(reverse("core:login")) diff --git a/modoboa/locale/de/LC_MESSAGES/django.po b/modoboa/locale/de/LC_MESSAGES/django.po index b90267b8d..b1c8f7624 100644 --- a/modoboa/locale/de/LC_MESSAGES/django.po +++ b/modoboa/locale/de/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-11 11:43+0200\n" "PO-Revision-Date: 2015-07-09 14:03+0000\n" "Last-Translator: controlc.de\n" "Language-Team: German (http://www.transifex.com/tonio/modoboa/language/de/)\n" @@ -214,10 +214,8 @@ msgstr "" "angelegt werden. Nutzen Sie ';', um Gruppen zu separieren." #: core/app_settings.py:196 -#, fuzzy -#| msgid "Group name" msgid "Group type" -msgstr "Gruppenname" +msgstr "Gruppentyp" #: core/app_settings.py:200 msgid "The LDAP group type to use with your directory." @@ -399,16 +397,12 @@ msgid "deleted" msgstr "entfernt" #: core/models.py:51 -#, fuzzy -#| msgid "Group name" msgid "First name" -msgstr "Gruppenname" +msgstr "Vorname" #: core/models.py:53 -#, fuzzy -#| msgid "Last login" msgid "Last name" -msgstr "Letzte Anmeldung" +msgstr "Nachname" #: core/models.py:60 msgid "Allow mailboxes access" @@ -426,23 +420,25 @@ msgstr "Passwort" msgid "last login" msgstr "Letzte Anmeldung" +#: core/models.py:70 +msgid "language" +msgstr "Sprache" + #: core/models.py:73 -#, fuzzy -#| msgid "Prefered language to display pages" msgid "Prefered language to display pages." msgstr "Bevorzugte Sprache für Seitendarstellung" #: core/models.py:77 msgid "Phone number" -msgstr "" +msgstr "Telefonnummer" #: core/models.py:79 msgid "Secondary email" -msgstr "" +msgstr "Alternative Email-Adresse" #: core/models.py:82 msgid "An alternative e-mail address, can be used for recovery needs." -msgstr "" +msgstr "Eine alternative e-mail Adresse zur Widerherstellung." #: core/models.py:114 msgid "You can't delete your own account" @@ -458,7 +454,7 @@ msgstr "Konto" #: core/models.py:354 msgid "Unknown" -msgstr "" +msgstr "Unbekannt" #: core/models.py:393 msgid "Invalid line" @@ -499,11 +495,11 @@ msgstr "Aktualisieren" #: core/templates/core/dashboard.html:9 #, python-format msgid "Hello %(user)s." -msgstr "" +msgstr "Hallo %(user)s." #: core/templates/core/dashboard.html:15 msgid "Latest news" -msgstr "" +msgstr "Neueste Nachrichten" #: core/templates/core/dashboard.html:29 msgid "" @@ -556,7 +552,7 @@ msgstr "Aktive Benutzer" #: core/templates/core/information.html:37 msgid "Role" -msgstr "" +msgstr "Rolle" #: core/templates/core/information.html:38 msgid "Last login" @@ -651,7 +647,6 @@ msgid "Parameters saved" msgstr "Parameter gespeichert" #: core/views/auth.py:41 -#, python-format msgid "User '%s' successfully logged in" msgstr "Benutzer '%s' hat sich erfolgreich angemeldet" @@ -721,10 +716,8 @@ msgid "No" msgstr "Nein" #: lib/ldap_utils.py:124 -#, fuzzy -#| msgid "Failed to update password: %s" msgid "Failed to update password: {}" -msgstr "Konnte Passwort nicht aktualisieren: %s" +msgstr "Konnte Passwort nicht aktualisieren: {}" #: lib/templatetags/lib_tags.py:103 msgid "From" @@ -797,11 +790,5 @@ msgstr "An mich erinnern" msgid "Log in" msgstr "Anmelden" -#~ msgid "Group name" -#~ msgstr "Gruppenname" - #~ msgid "Display" #~ msgstr "Darstellung" - -#~ msgid "Prefered language" -#~ msgstr "Bevorzugte Sprache" From 5da45f277b0da1568a3d2783181723817407ad98 Mon Sep 17 00:00:00 2001 From: Christian Wiegand Date: Sun, 16 Oct 2016 14:37:24 +0200 Subject: [PATCH 39/40] Improved German translation: Translation of user settings dialog, corrected wrong parenthesis in logging of login/logout, language label field had no label tag --- .../admin/locale/cs_CZ/LC_MESSAGES/django.po | 23 ++- modoboa/admin/locale/de/LC_MESSAGES/django.po | 23 ++- modoboa/admin/locale/en/LC_MESSAGES/django.po | 18 +- modoboa/admin/locale/es/LC_MESSAGES/django.po | 23 ++- modoboa/admin/locale/fr/LC_MESSAGES/django.po | 156 +++++++++++++----- modoboa/admin/locale/it/LC_MESSAGES/django.po | 23 ++- .../admin/locale/ja_JP/LC_MESSAGES/django.po | 23 ++- .../admin/locale/nl_NL/LC_MESSAGES/django.po | 23 ++- .../admin/locale/pt_BR/LC_MESSAGES/django.po | 23 ++- .../admin/locale/pt_PT/LC_MESSAGES/django.po | 23 ++- modoboa/admin/locale/ru/LC_MESSAGES/django.po | 23 ++- modoboa/admin/locale/sv/LC_MESSAGES/django.po | 23 ++- modoboa/core/models.py | 4 +- .../limits/locale/cs_CZ/LC_MESSAGES/django.po | 2 +- .../limits/locale/de/LC_MESSAGES/django.po | 2 +- .../limits/locale/en/LC_MESSAGES/django.po | 2 +- .../limits/locale/es/LC_MESSAGES/django.po | 2 +- .../limits/locale/fr/LC_MESSAGES/django.po | 2 +- .../limits/locale/it/LC_MESSAGES/django.po | 2 +- .../limits/locale/ja_JP/LC_MESSAGES/django.po | 2 +- .../limits/locale/nl_NL/LC_MESSAGES/django.po | 2 +- .../limits/locale/pt_BR/LC_MESSAGES/django.po | 2 +- .../limits/locale/pt_PT/LC_MESSAGES/django.po | 2 +- .../limits/locale/ru/LC_MESSAGES/django.po | 2 +- .../limits/locale/sv/LC_MESSAGES/django.po | 2 +- modoboa/locale/cs_CZ/LC_MESSAGES/django.po | 25 +-- modoboa/locale/de/LC_MESSAGES/django.po | 17 +- modoboa/locale/en/LC_MESSAGES/django.po | 20 ++- modoboa/locale/es/LC_MESSAGES/django.po | 25 +-- modoboa/locale/fr/LC_MESSAGES/django.po | 85 +++++++--- modoboa/locale/it/LC_MESSAGES/django.po | 25 +-- modoboa/locale/ja_JP/LC_MESSAGES/django.po | 20 ++- modoboa/locale/nl_NL/LC_MESSAGES/django.po | 25 +-- modoboa/locale/pt_BR/LC_MESSAGES/django.po | 20 ++- modoboa/locale/pt_PT/LC_MESSAGES/django.po | 25 +-- modoboa/locale/ru/LC_MESSAGES/django.po | 25 +-- modoboa/locale/sv/LC_MESSAGES/django.po | 20 ++- .../locale/cs_CZ/LC_MESSAGES/django.po | 2 +- .../locale/de/LC_MESSAGES/django.po | 2 +- .../locale/en/LC_MESSAGES/django.po | 2 +- .../locale/es/LC_MESSAGES/django.po | 2 +- .../locale/fr/LC_MESSAGES/django.po | 2 +- .../locale/it/LC_MESSAGES/django.po | 2 +- .../locale/ja_JP/LC_MESSAGES/django.po | 2 +- .../locale/nl_NL/LC_MESSAGES/django.po | 2 +- .../locale/pt_BR/LC_MESSAGES/django.po | 2 +- .../locale/pt_PT/LC_MESSAGES/django.po | 2 +- .../locale/ru/LC_MESSAGES/django.po | 2 +- .../locale/sv/LC_MESSAGES/django.po | 2 +- 49 files changed, 489 insertions(+), 299 deletions(-) diff --git a/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po index 682dda141..cec79b89f 100644 --- a/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2015-01-06 10:05+0000\n" "Last-Translator: Miroslav Abrahám \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/" @@ -219,10 +219,15 @@ msgid "Alias(es)" msgstr "Alias(y)" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" "Alias(y) této schránky. Vložte pouze jeden alias na řádek, stiskněte ENTER " "pro vložení dalšího aliasu. Pro vytvoření doménového koše vložte '*' (např. " @@ -627,32 +632,32 @@ msgstr "Zvolená kvóta je větší než povolené omezení domény (%dM)" msgid "A quota is required" msgstr "Kvóta je vyžadována" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Oprávnění" -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "" -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "" -#: admin/serializers.py:211 +#: admin/serializers.py:215 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "Doména neexistuje" -#: admin/serializers.py:311 +#: admin/serializers.py:315 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." diff --git a/modoboa/admin/locale/de/LC_MESSAGES/django.po b/modoboa/admin/locale/de/LC_MESSAGES/django.po index 7e338fcce..3d80d545f 100644 --- a/modoboa/admin/locale/de/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/de/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2015-09-09 09:33+0000\n" "Last-Translator: controlc.de\n" "Language-Team: German (http://www.transifex.com/tonio/modoboa/language/de/)\n" @@ -224,10 +224,15 @@ msgid "Alias(es)" msgstr "Alias(e)" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" "Alias(e) für dieses Postfach. Geben Sie jeweils nur eine Adresse pro Eingabe " "an. Bestätigen Sie die Eingabe mit ENTER. Geben Sie '*' an, um einen " @@ -617,32 +622,32 @@ msgstr "Das Quota ist größer als das maximale Quota der Domain (%dM)" msgid "A quota is required" msgstr "Ein Quota ist erforderlich" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Berechtigungen" -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "" -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "" -#: admin/serializers.py:211 +#: admin/serializers.py:215 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "Domain existiert nicht" -#: admin/serializers.py:311 +#: admin/serializers.py:315 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." diff --git a/modoboa/admin/locale/en/LC_MESSAGES/django.po b/modoboa/admin/locale/en/LC_MESSAGES/django.po index ff190dc54..c2d5f9ea7 100644 --- a/modoboa/admin/locale/en/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -208,8 +208,8 @@ msgstr "" #: admin/forms/account.py:208 msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" #: admin/forms/account.py:214 @@ -568,28 +568,28 @@ msgstr "" msgid "A quota is required" msgstr "" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 msgid "Permission denied." msgstr "" -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "" -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "" -#: admin/serializers.py:211 +#: admin/serializers.py:215 msgid "Local domain {} does not exist" msgstr "" -#: admin/serializers.py:311 +#: admin/serializers.py:315 msgid "Domain not found." msgstr "" diff --git a/modoboa/admin/locale/es/LC_MESSAGES/django.po b/modoboa/admin/locale/es/LC_MESSAGES/django.po index ac46780e6..d88077e5d 100644 --- a/modoboa/admin/locale/es/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/es/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2013-10-01 09:56+0000\n" "Last-Translator: Pedro Gracia \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/modoboa/language/" @@ -222,10 +222,15 @@ msgid "Alias(es)" msgstr "Alias" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" "Alias de este mailbox. Indique sólo una dirección por entrada, presione " "ENTER para añadir una nueva entrada. Use el carácter '*' para crear una " @@ -632,32 +637,32 @@ msgstr "La cuota es mayor que el límite permitido para el dominio (%dM)" msgid "A quota is required" msgstr "Una cuota es obligatoria" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Permisos" -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "" -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "" -#: admin/serializers.py:211 +#: admin/serializers.py:215 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "El dominio no existe" -#: admin/serializers.py:311 +#: admin/serializers.py:315 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." diff --git a/modoboa/admin/locale/fr/LC_MESSAGES/django.po b/modoboa/admin/locale/fr/LC_MESSAGES/django.po index 896118478..ebbfc8c82 100644 --- a/modoboa/admin/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/fr/LC_MESSAGES/django.po @@ -1,21 +1,21 @@ # 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 , 2015-2016 msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-10-08 07:09+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" +"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: admin/app_settings.py:54 admin/callbacks.py:25 @@ -38,9 +38,11 @@ msgstr "MX(s) valide(s)" #: admin/app_settings.py:68 msgid "" -"IP(s) or network(s) of the MX that should match with domains' MX records. On" -" per line." -msgstr "IP(s) ou réseau(x) avec lesquels les enregistrements MX des domaines doivent correspondre. Un par ligne." +"IP(s) or network(s) of the MX that should match with domains' MX records. On " +"per line." +msgstr "" +"IP(s) ou réseau(x) avec lesquels les enregistrements MX des domaines doivent " +"correspondre. Un par ligne." #: admin/app_settings.py:77 msgid "Enable DNSBL checks" @@ -62,7 +64,9 @@ msgstr "Gérer les boites sur le système de fichiers" msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" -msgstr "Renommer ou supprimer les boites sur le système de fichiers quand elles sont renommées ou supprimées dans Modoboa" +msgstr "" +"Renommer ou supprimer les boites sur le système de fichiers quand elles sont " +"renommées ou supprimées dans Modoboa" #: admin/app_settings.py:96 msgid "Mailboxes owner" @@ -80,7 +84,9 @@ msgstr "Quota de domaine par défaut" msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." -msgstr "Quota par défaut (en Mo) appliqué aux domaines fraichement créés et ne spécifiant pas de valeur. 0 signifie qu'aucun quota ne sera appliqué." +msgstr "" +"Quota par défaut (en Mo) appliqué aux domaines fraichement créés et ne " +"spécifiant pas de valeur. 0 signifie qu'aucun quota ne sera appliqué." #: admin/app_settings.py:113 msgid "Automatic account removal" @@ -88,16 +94,19 @@ msgstr "Suppression automatique de compte" #: admin/app_settings.py:116 msgid "When a mailbox is removed, also remove the associated account" -msgstr "Lorsqu'une boite aux lettres est supprimée, supprimer le compte associé en même temps" +msgstr "" +"Lorsqu'une boite aux lettres est supprimée, supprimer le compte associé en " +"même temps" #: admin/app_settings.py:120 msgid "Automatic domain/mailbox creation" msgstr "Création automatique de domaine/boite aux lettres" #: admin/app_settings.py:123 -msgid "" -"Create a domain and a mailbox when an account is automatically created." -msgstr "Créer un domaine et une boite aux lettres quand un compte est créé automatiquement." +msgid "Create a domain and a mailbox when an account is automatically created." +msgstr "" +"Créer un domaine et une boite aux lettres quand un compte est créé " +"automatiquement." #: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 @@ -144,7 +153,9 @@ msgstr "Nom d'utilisateur" msgid "" "The user's name. Must be a valid e-mail address for simple users or " "administrators with a mailbox." -msgstr "Le nom de l'utilisateur. Doit être une adresse e-mail valide pour les utilisateurs simples ou les administrateurs avec une boite aux lettres." +msgstr "" +"Le nom de l'utilisateur. Doit être une adresse e-mail valide pour les " +"utilisateurs simples ou les administrateurs avec une boite aux lettres." #: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" @@ -200,7 +211,10 @@ msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " "administrators)." -msgstr "Quota en Mo pour cette boite. 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)." +msgstr "" +"Quota en Mo pour cette boite. 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)." #: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 @@ -208,11 +222,19 @@ msgid "Alias(es)" msgstr "Alias" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." -msgstr "Alias de cette boite. Indiquer seulement une adresse par champ, appuyer sur ENTREE pour ajouter un nouveau champ. Utiliser le caractère '*' pour créer une adresse 'attrape tout' (ex: *@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." +msgstr "" +"Alias de cette boite. Indiquer seulement une adresse par champ, appuyer sur " +"ENTREE pour ajouter un nouveau champ. Utiliser le caractère '*' pour créer " +"une adresse 'attrape tout' (ex: *@domain.tld)." #: admin/forms/account.py:214 msgid "Sender addresses" @@ -223,7 +245,11 @@ msgid "" "Additional sender address(es) for this account. The user will be allowed to " "send emails using this address, even if it does not exist locally. Indicate " "one address per input. Press ENTER to add a new input." -msgstr "Adresse(s) d'envoi supplémentaire(s) pour ce compte. L'utilisateur sera autorisé à envoyer des e-mails en utilisant la/les adresse(s) déclarée(s), même si elle(s) n'existe(nt) pas localement. Indiquer une adresse par champ. Appuyer sur ENTREE pour ajouter un nouveau champ." +msgstr "" +"Adresse(s) d'envoi supplémentaire(s) pour ce compte. L'utilisateur sera " +"autorisé à envoyer des e-mails en utilisant la/les adresse(s) déclarée(s), " +"même si elle(s) n'existe(nt) pas localement. Indiquer une adresse par champ. " +"Appuyer sur ENTREE pour ajouter un nouveau champ." #: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 @@ -279,7 +305,9 @@ msgstr "Adresse email" msgid "" "The alias address. To create a catchall alias, just enter the domain name " "(@domain.tld)." -msgstr "L'adresse de l'alias. Pour créer un alias \"fourre-tout\", saisissez uniquement le nom du domaine (@domain.tld)." +msgstr "" +"L'adresse de l'alias. Pour créer un alias \"fourre-tout\", saisissez " +"uniquement le nom du domaine (@domain.tld)." #: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" @@ -289,7 +317,9 @@ msgstr "Destinataires" msgid "" "Addresses this alias will point to. Indicate only one address per input, " "press ENTER to add a new input." -msgstr "Les adresses vers lesquelles cet alias pointera. Indiquer une adresse par champ, appuyer sur ENTREE pour ajouter un nouveau champ." +msgstr "" +"Les adresses vers lesquelles cet alias pointera. Indiquer une adresse par " +"champ, appuyer sur ENTREE pour ajouter un nouveau champ." #: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 #: admin/templates/admin/domain_statistics.html:49 @@ -316,13 +346,17 @@ msgstr "Type" msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." -msgstr "Quota par défaut en Mo appliqué aux boites aux lettres. Laisser vide pour utiliser la valeur par défaut." +msgstr "" +"Quota par défaut en Mo appliqué aux boites aux lettres. Laisser vide pour " +"utiliser la valeur par défaut." #: admin/forms/domain.py:47 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." -msgstr "Alias de ce domaine. Indiquer seulement un nom par champ, appuyer sur ENTREE pour ajouter un nouveau champ." +msgstr "" +"Alias de ce domaine. Indiquer seulement un nom par champ, appuyer sur ENTREE " +"pour ajouter un nouveau champ." #: admin/forms/domain.py:101 admin/forms/domain.py:113 #: admin/forms/domain.py:121 @@ -353,7 +387,9 @@ msgstr "Nom" msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." -msgstr "Le nom de l'administrateur. Ne pas include un nom de domaine ici, il sera ajouté automatiquement." +msgstr "" +"Le nom de l'administrateur. Ne pas include un nom de domaine ici, il sera " +"ajouté automatiquement." #: admin/forms/domain.py:184 msgid "Create aliases" @@ -416,7 +452,9 @@ msgstr "Transférer les messages et conserver une copie dans votre boite locale" msgid "" "You can't define a forward to a local destination. Please ask your " "administrator to create an alias instead." -msgstr "Vous ne pouvez pas définir un transfert vers une destination locale. Veuillez plutôt demander à votre administrateur de créer un alias" +msgstr "" +"Vous ne pouvez pas définir un transfert vers une destination locale. " +"Veuillez plutôt demander à votre administrateur de créer un alias" #: admin/forms/import_.py:11 msgid "Select a file" @@ -436,7 +474,9 @@ msgstr "Chiffrer les mots de passe" #: admin/forms/import_.py:40 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" #: admin/lib.py:31 msgid "A mailbox is required" @@ -570,28 +610,30 @@ msgstr "Le quota est supérieur à la limité autorisée pour le domaine (%dM)" msgid "A quota is required" msgstr "Un quota est requis" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 msgid "Permission denied." msgstr "Permission refusée." -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." -msgstr "Liste des domaines administrés (revendeurs et administrateurs de domaine seulement)." +msgstr "" +"Liste des domaines administrés (revendeurs et administrateurs de domaine " +"seulement)." -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "Non autorisé pour ce rôle." -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "Doit être égale au champ full_address dans mailbox" -#: admin/serializers.py:211 +#: admin/serializers.py:215 msgid "Local domain {} does not exist" msgstr "Le domaine local {} n'existe pas" -#: admin/serializers.py:311 +#: admin/serializers.py:315 msgid "Domain not found." msgstr "Domaine introuvable." @@ -827,7 +869,9 @@ msgstr "Mis à jour" #: admin/templates/admin/mx_domain_detail.html:23 msgid "This IP does not match any of the valid MXs defined in parameters" -msgstr "Cette IP ne correspond à un aucun des MX valides déclarés dans les paramètres." +msgstr "" +"Cette IP ne correspond à un aucun des MX valides déclarés dans les " +"paramètres." #: admin/templates/admin/mx_domain_detail.html:36 msgid "No MX record found for this domain." @@ -838,19 +882,26 @@ msgstr "Aucun enregistrement MX trouvé pour ce domaine." msgid "" "Modoboa detected that domain %(domain)s is listed by the following DNSBL " "providers:" -msgstr "Modoboa a détecté que le domaine %(domain)s est listé par les fournisseurs de DNSBL suivants :" +msgstr "" +"Modoboa a détecté que le domaine %(domain)s est listé par les fournisseurs " +"de DNSBL suivants :" #: admin/templates/admin/notifications/domain_in_dnsbl.html:11 msgid "" "The domain's reputation will be affected and there is a chance that emails " "coming from it are considered as spam. You should contact those providers " "and ask them to unlist detected IP address(es)." -msgstr "La réputation de ce domaine sera affectée et il est probable que les emails venant de lui soient considérés comme du spam. Vous devriez contacter ces fournisseurs pour leur demander de délister la/les adresse(s) détectée(s)." +msgstr "" +"La réputation de ce domaine sera affectée et il est probable que les emails " +"venant de lui soient considérés comme du spam. Vous devriez contacter ces " +"fournisseurs pour leur demander de délister la/les adresse(s) détectée(s)." #: admin/templates/admin/notifications/domain_invalid_mx.html:3 #, python-format msgid "Modoboa detected that domain %(domain)s has no valid MX record:" -msgstr "Modoboa a détecté que le domain %(domain)s n'a aucun enregistrement MX valide :" +msgstr "" +"Modoboa a détecté que le domain %(domain)s n'a aucun enregistrement MX " +"valide :" #: admin/templates/admin/quota_headers.html:3 msgid "Value" @@ -996,9 +1047,19 @@ msgid "" "
  • domainalias; name; targeted domain; enabled
  • \n" " %s\n" "\n" -"

    The first element of each line is mandatory and must be equal to one of the previous values.

    \n" +"

    The first element of each line is mandatory and must be equal to one of " +"the previous values.

    \n" "

    You can use a different character as separator.

    \n" -msgstr "Fournir un fichier CSV ou chaque ligne respècte un des formats suivants :\n
      \n
    • domain; nom; quota; activé
    • \n
    • domainalias; nom; domaine cible; activé
    • \n %s\n
    \n

    Le premier élément de chaque ligne est obligatoire et doit être égal à l'une des valeurs précédentes.

    \n

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" +msgstr "" +"Fournir un fichier CSV ou chaque ligne respècte un des formats suivants :\n" +"
      \n" +"
    • domain; nom; quota; activé
    • \n" +"
    • domainalias; nom; domaine cible; activé
    • \n" +" %s\n" +"
    \n" +"

    Le premier élément de chaque ligne est obligatoire et doit être égal à " +"l'une des valeurs précédentes.

    \n" +"

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" #: admin/views/import_.py:98 msgid "Import domains" @@ -1008,13 +1069,26 @@ msgstr "Importer des domaines" msgid "" "Provide a CSV file where lines respect one of the following formats:\n" "
      \n" -"
    • account; loginname; password; first name; last name; enabled; group; address; quota; [, domain, ...]
    • \n" +"
    • account; loginname; password; first name; last name; enabled; group; " +"address; quota; [, domain, ...]
    • \n" "
    • alias; address; enabled; recipient; recipient; ...
    • \n" "
    \n" -"

    The first element of each line is mandatory and must be equal to one of the previous values.

    \n" +"

    The first element of each line is mandatory and must be equal to one of " +"the previous values.

    \n" "\n" "

    You can use a different character as separator.

    \n" -msgstr "Fournir un fichier CSV dans lequel les lignes respectent un des formats suivants :\n
      \n
    • account; loginname; password; first name; last name; enabled; group; address; quota; [, domain, ...]
    • \n
    • alias; address; enabled; recipient; recipient; ...
    • \n
    \n

    Le premier élément de chaque ligne est obligatoire et doit être égal à l'une des valeurs précédentes..

    \n\n

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" +msgstr "" +"Fournir un fichier CSV dans lequel les lignes respectent un des formats " +"suivants :\n" +"
      \n" +"
    • account; loginname; password; first name; last name; enabled; group; " +"address; quota; [, domain, ...]
    • \n" +"
    • alias; address; enabled; recipient; recipient; ...
    • \n" +"
    \n" +"

    Le premier élément de chaque ligne est obligatoire et doit être égal à " +"l'une des valeurs précédentes..

    \n" +"\n" +"

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" #: admin/views/import_.py:130 msgid "Import identities" diff --git a/modoboa/admin/locale/it/LC_MESSAGES/django.po b/modoboa/admin/locale/it/LC_MESSAGES/django.po index 5f6917311..8a6221fb5 100644 --- a/modoboa/admin/locale/it/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/it/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2015-10-11 11:48+0000\n" "Last-Translator: Rocco \n" "Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/" @@ -224,10 +224,15 @@ msgid "Alias(es)" msgstr "Alias" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" "Alias per questa casella di posta. Inserire un solo indirizzo alla volta, " "premere INVIO per aggiungere un nuovo elemento. Utilizzare il carattere '*' " @@ -617,32 +622,32 @@ msgstr "La quota è maggiore del limite stabilito per il dominio (%dM)" msgid "A quota is required" msgstr "È richiesta una quota" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Permessi" -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "" -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "" -#: admin/serializers.py:211 +#: admin/serializers.py:215 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "Il dominio non esiste" -#: admin/serializers.py:311 +#: admin/serializers.py:315 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." diff --git a/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po index ae5df9fce..f66e3fd98 100644 --- a/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-09-14 17:06+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/" @@ -221,10 +221,15 @@ msgid "Alias(es)" msgstr "エイリアス" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" "メールボックスのエイリアス\n" "input ごとに1つだけのアドレスを記入し、 ENTER キーを押して、新しい input を追" @@ -607,28 +612,28 @@ msgstr "クォータが、ドメインに許可された制限 (%dM) より大 msgid "A quota is required" msgstr "クォータは必須です" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 msgid "Permission denied." msgstr "アクセス拒否" -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "管理しているドメインのリスト (リセーラーとドメイン管理者のみ)" -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "このロールには許可されていません" -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "メールボックス full_address に等しくなければなりません" -#: admin/serializers.py:211 +#: admin/serializers.py:215 msgid "Local domain {} does not exist" msgstr "ローカルドメイン {} は、存在しません" -#: admin/serializers.py:311 +#: admin/serializers.py:315 msgid "Domain not found." msgstr "ドメインが見つかりません" diff --git a/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po index dc0f236c9..845acc8fe 100644 --- a/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-31 11:37+0000\n" "Last-Translator: TuxBrother \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" @@ -223,10 +223,15 @@ msgid "Alias(es)" msgstr "Alias(sen)" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" "Alias(en) van deze mailbox. Geef slechts een adres per regel op, en toets " "ENTER om een nieuwe regel te krijgen. Gebruik een wildcard '*' om een 'catch-" @@ -630,32 +635,32 @@ msgstr "Quota is groter dan de maximaal toegestane domein limiet (%dM)" msgid "A quota is required" msgstr "Een quota is vereist" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Rechten" -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "" -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "" -#: admin/serializers.py:211 +#: admin/serializers.py:215 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "Domein bestaat niet" -#: admin/serializers.py:311 +#: admin/serializers.py:315 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." diff --git a/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po index b211f5534..d21d8ae9f 100644 --- a/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-05-17 12:28+0000\n" "Last-Translator: Jose Marcos Araujo \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/" @@ -223,10 +223,15 @@ msgid "Alias(es)" msgstr "Alias(es)" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" "Alias(es) para essa caixa de correio. Indique apenas um endereço por " "entrada, pressione ENTER para adicionar uma nova entrada. Use o caractere " @@ -613,30 +618,30 @@ msgstr "A cota é maior que o permitido pelo limite do domínio (%dM)" msgid "A quota is required" msgstr "Uma cota é requerida" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 msgid "Permission denied." msgstr "Permissão negada" -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" "Lista dos domínios administrados (somente revendedores e administradores de " "domínio)" -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "Não permitido para este perfil (role)" -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "Deve ser igual ao endereço completo da conta" -#: admin/serializers.py:211 +#: admin/serializers.py:215 msgid "Local domain {} does not exist" msgstr "Domínio local {} não existe" -#: admin/serializers.py:311 +#: admin/serializers.py:315 msgid "Domain not found." msgstr "Domínio não encontrado" diff --git a/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po index 2f0622c79..371d9f406 100644 --- a/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-29 12:51+0000\n" "Last-Translator: Mike C. \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" @@ -225,10 +225,15 @@ msgid "Alias(es)" msgstr "Alias(es)" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" "Alias(es) desta caixa de correio. Indique apenas um endereço por entrada, " "clique ENTER para adicionar uma nova entrada. Use o '*' para criar um alias " @@ -633,32 +638,32 @@ msgstr "A quota excede o limite permitido pelo domínio (%dM)" msgid "A quota is required" msgstr "É necessário uma quota" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Permissões" -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "" -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "" -#: admin/serializers.py:211 +#: admin/serializers.py:215 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "O domínio não existe" -#: admin/serializers.py:311 +#: admin/serializers.py:315 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." diff --git a/modoboa/admin/locale/ru/LC_MESSAGES/django.po b/modoboa/admin/locale/ru/LC_MESSAGES/django.po index 3fe74fc56..d92112f81 100644 --- a/modoboa/admin/locale/ru/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2013-12-03 09:35+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Russian (http://www.transifex.com/projects/p/modoboa/language/" @@ -218,10 +218,15 @@ msgid "Alias(es)" msgstr "Синоним(ы)" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" "Синонимы этого почтового ящика. Вводите один адрес за раз. Нажмите ENTER для " "добавления. Используйте '*' для создания синонима 'для всех' (*@domain.tld)" @@ -624,32 +629,32 @@ msgstr "Квота больше чем разрешено на уровне до msgid "A quota is required" msgstr "Требуется квота" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Права" -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "" -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "" -#: admin/serializers.py:211 +#: admin/serializers.py:215 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "Домен не существует" -#: admin/serializers.py:311 +#: admin/serializers.py:315 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." diff --git a/modoboa/admin/locale/sv/LC_MESSAGES/django.po b/modoboa/admin/locale/sv/LC_MESSAGES/django.po index f6c26d3fe..7ba3627af 100644 --- a/modoboa/admin/locale/sv/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/sv/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-05-30 18:05+0000\n" "Last-Translator: Olle Gustafsson \n" "Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/" @@ -218,10 +218,15 @@ msgid "Alias(es)" msgstr "Alias" #: admin/forms/account.py:208 +#, fuzzy +#| msgid "" +#| "Alias(es) of this mailbox. Indicate only one address per input, press " +#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " +#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " -"to add a new input. Use the '*' character to create a 'catchall' alias (ex: " -"*@domain.tld)." +"to add a new input. To create a catchall alias, just enter the domain name " +"(@domain.tld)." msgstr "" "Alias för denna brevlåda. Ange endast en adress per rad, tryck ENTER för att " "lägga till ny rad. Använd '*' för att skapa ett 'catchall' alias (ex: " @@ -606,30 +611,30 @@ msgstr "Kvotan är större än domänens gräns (%dM)" msgid "A quota is required" msgstr "En kvota krävs" -#: admin/serializers.py:44 admin/serializers.py:224 admin/serializers.py:313 +#: admin/serializers.py:45 admin/serializers.py:228 admin/serializers.py:317 msgid "Permission denied." msgstr "Åtskomst nekad." -#: admin/serializers.py:82 +#: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" "Lista över administrerade domäner (endast återförsäljare och " "domänadministratörer)." -#: admin/serializers.py:189 +#: admin/serializers.py:193 msgid "Not allowed for this role." msgstr "Inte tillåtet för denna roll." -#: admin/serializers.py:199 +#: admin/serializers.py:203 msgid "Must be equal to mailbox full_address" msgstr "Måste vara lika med brevlådans full_address" -#: admin/serializers.py:211 +#: admin/serializers.py:215 msgid "Local domain {} does not exist" msgstr "Lokal domän {} finns inte" -#: admin/serializers.py:311 +#: admin/serializers.py:315 msgid "Domain not found." msgstr "Domän kunde ej hittas." diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 595992f21..9b24424b0 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -62,12 +62,12 @@ class User(PermissionsMixin): "Allow this administrator to access user mailboxes" ) ) - password = models.CharField(ugettext_lazy('password'), max_length=256) + password = models.CharField(ugettext_lazy("password"), max_length=256) last_login = models.DateTimeField( ugettext_lazy('last login'), blank=True, null=True ) - language = models.CharField(ugettext_lazy('language'), + language = models.CharField(ugettext_lazy("language"), max_length=10, default="en", choices=constants.LANGUAGES, help_text=ugettext_lazy( "Prefered language to display pages." diff --git a/modoboa/limits/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/limits/locale/cs_CZ/LC_MESSAGES/django.po index 10379e2fe..84adf7cd7 100644 --- a/modoboa/limits/locale/cs_CZ/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/cs_CZ/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2015-01-06 10:05+0000\n" "Last-Translator: Miroslav Abrahám \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/" diff --git a/modoboa/limits/locale/de/LC_MESSAGES/django.po b/modoboa/limits/locale/de/LC_MESSAGES/django.po index 85a5891d8..f8d6082be 100644 --- a/modoboa/limits/locale/de/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/de/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-03 11:02+0000\n" "Last-Translator: Arvedui \n" "Language-Team: German (http://www.transifex.com/projects/p/modoboa/language/" diff --git a/modoboa/limits/locale/en/LC_MESSAGES/django.po b/modoboa/limits/locale/en/LC_MESSAGES/django.po index ca931e678..b25a30285 100644 --- a/modoboa/limits/locale/en/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/modoboa/limits/locale/es/LC_MESSAGES/django.po b/modoboa/limits/locale/es/LC_MESSAGES/django.po index c6ffb7c6a..76de1f234 100644 --- a/modoboa/limits/locale/es/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/es/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2013-10-01 09:56+0000\n" "Last-Translator: Pedro Gracia \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/modoboa/language/" diff --git a/modoboa/limits/locale/fr/LC_MESSAGES/django.po b/modoboa/limits/locale/fr/LC_MESSAGES/django.po index 5e439787f..e0ff92d08 100644 --- a/modoboa/limits/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-04-27 20:12+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" diff --git a/modoboa/limits/locale/it/LC_MESSAGES/django.po b/modoboa/limits/locale/it/LC_MESSAGES/django.po index 8e219010e..65c286571 100644 --- a/modoboa/limits/locale/it/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2013-12-23 00:56+0100\n" "Last-Translator: Alberto Berti \n" "Language-Team: ITALIANO \n" diff --git a/modoboa/limits/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/limits/locale/ja_JP/LC_MESSAGES/django.po index d8d28f965..38a8ba554 100644 --- a/modoboa/limits/locale/ja_JP/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/ja_JP/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-06-07 07:16+0000\n" "Last-Translator: cwatanab \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/" diff --git a/modoboa/limits/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/limits/locale/nl_NL/LC_MESSAGES/django.po index e959f52e5..198dac2e2 100644 --- a/modoboa/limits/locale/nl_NL/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/nl_NL/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-31 11:37+0000\n" "Last-Translator: TuxBrother \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" diff --git a/modoboa/limits/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/limits/locale/pt_BR/LC_MESSAGES/django.po index 3ebff5d8c..7312fb48a 100644 --- a/modoboa/limits/locale/pt_BR/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/pt_BR/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-05-17 12:19+0000\n" "Last-Translator: Jose Marcos Araujo \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/" diff --git a/modoboa/limits/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/limits/locale/pt_PT/LC_MESSAGES/django.po index 7efd550dc..5a4f674c9 100644 --- a/modoboa/limits/locale/pt_PT/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/pt_PT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-29 12:51+0000\n" "Last-Translator: Mike C. \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" diff --git a/modoboa/limits/locale/ru/LC_MESSAGES/django.po b/modoboa/limits/locale/ru/LC_MESSAGES/django.po index 0d6ec116a..da5077ca5 100644 --- a/modoboa/limits/locale/ru/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2013-12-03 09:35+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Russian (http://www.transifex.com/projects/p/modoboa/language/" diff --git a/modoboa/limits/locale/sv/LC_MESSAGES/django.po b/modoboa/limits/locale/sv/LC_MESSAGES/django.po index 7287201de..7982a4f73 100644 --- a/modoboa/limits/locale/sv/LC_MESSAGES/django.po +++ b/modoboa/limits/locale/sv/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-05-30 18:08+0000\n" "Last-Translator: Olle Gustafsson \n" "Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/" diff --git a/modoboa/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/locale/cs_CZ/LC_MESSAGES/django.po index 51c5df7bf..d212dd83a 100644 --- a/modoboa/locale/cs_CZ/LC_MESSAGES/django.po +++ b/modoboa/locale/cs_CZ/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2015-01-06 10:05+0000\n" "Last-Translator: Miroslav Abrahám \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/" @@ -434,6 +434,12 @@ msgstr "heslo" msgid "last login" msgstr "poslední přihlášení" +#: core/models.py:70 +#, fuzzy +#| msgid "Prefered language" +msgid "language" +msgstr "Preferovaný jazyk" + #: core/models.py:73 #, fuzzy #| msgid "Prefered language to display pages" @@ -456,32 +462,32 @@ msgstr "" msgid "You can't delete your own account" msgstr "Nemůžete smazat vlastní účet" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "Nebylo možné změnit heslo: LDAP modul není instalován" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "účet" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "Neplatný řádek" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "Nemůžete importvat účet s vyšším oprávněním, než máte vy sám" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Běžný uživatel '%s' musí mít nastavenou platnou emailovou adresu" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "pole uživatelského jména a emailu se nesmí pro '%s' lišit" @@ -814,6 +820,3 @@ msgstr "Přihlásit" #~ msgid "Display" #~ msgstr "Zobrazení" - -#~ msgid "Prefered language" -#~ msgstr "Preferovaný jazyk" diff --git a/modoboa/locale/de/LC_MESSAGES/django.po b/modoboa/locale/de/LC_MESSAGES/django.po index b1c8f7624..6a6da1075 100644 --- a/modoboa/locale/de/LC_MESSAGES/django.po +++ b/modoboa/locale/de/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-11 11:43+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2015-07-09 14:03+0000\n" "Last-Translator: controlc.de\n" "Language-Team: German (http://www.transifex.com/tonio/modoboa/language/de/)\n" @@ -444,33 +444,33 @@ msgstr "Eine alternative e-mail Adresse zur Widerherstellung." msgid "You can't delete your own account" msgstr "Sie können Ihr eigenes Konto nicht entfernen" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "Konnte Passwort nicht aktualisieren: LDAP-Modul nicht installiert" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "Konto" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "Unbekannt" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "Ungültige Zeile" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "" "Sie können kein Konto mit einer höheren Rolle als Ihrer eigenen importieren" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Der normale Benutzer '%s' muss eine gültige E-Mail-Adresse besitzen" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "Benutzername und E-Mail für '%s' dürfen sich nicht unterscheiden" @@ -647,6 +647,7 @@ msgid "Parameters saved" msgstr "Parameter gespeichert" #: core/views/auth.py:41 +#, python-format msgid "User '%s' successfully logged in" msgstr "Benutzer '%s' hat sich erfolgreich angemeldet" diff --git a/modoboa/locale/en/LC_MESSAGES/django.po b/modoboa/locale/en/LC_MESSAGES/django.po index db46a66e6..d1252296c 100644 --- a/modoboa/locale/en/LC_MESSAGES/django.po +++ b/modoboa/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -401,6 +401,10 @@ msgstr "" msgid "last login" msgstr "" +#: core/models.py:70 +msgid "language" +msgstr "" + #: core/models.py:73 msgid "Prefered language to display pages." msgstr "" @@ -421,32 +425,32 @@ msgstr "" msgid "You can't delete your own account" msgstr "" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "" diff --git a/modoboa/locale/es/LC_MESSAGES/django.po b/modoboa/locale/es/LC_MESSAGES/django.po index e15fc219f..a4ef85f1d 100644 --- a/modoboa/locale/es/LC_MESSAGES/django.po +++ b/modoboa/locale/es/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2013-10-01 09:56+0000\n" "Last-Translator: Pedro Gracia \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/modoboa/language/" @@ -436,6 +436,12 @@ msgstr "Contraseña" msgid "last login" msgstr "Última entrada" +#: core/models.py:70 +#, fuzzy +#| msgid "Prefered language" +msgid "language" +msgstr "Idioma preferido" + #: core/models.py:73 #, fuzzy #| msgid "Prefered language to display pages" @@ -458,32 +464,32 @@ msgstr "" msgid "You can't delete your own account" msgstr "No puede eliminar su propia cuenta" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "Falló al actualizar la contraseña: módulo LDAP no instalado" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "cuenta" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "Línea inválida" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "No puede importar una cuenta con un rol mayor que el suyo" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "El usuario normal '%s' debe tener una dirección de email válida" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "" @@ -817,6 +823,3 @@ msgstr "Entrar" #~ msgid "Display" #~ msgstr "Mostrar" - -#~ msgid "Prefered language" -#~ msgstr "Idioma preferido" diff --git a/modoboa/locale/fr/LC_MESSAGES/django.po b/modoboa/locale/fr/LC_MESSAGES/django.po index 1493f4b53..4e6563074 100644 --- a/modoboa/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/locale/fr/LC_MESSAGES/django.po @@ -1,21 +1,21 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Antoine Nguyen , 2016 msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-10-08 07:07+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" +"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: core/__init__.py:63 @@ -64,7 +64,8 @@ msgstr "plain (faible)" #: core/app_settings.py:61 msgid "Scheme used to crypt mailbox passwords" -msgstr "Méthode utilisée pour chiffrer les mots de passe des boites aux lettres" +msgstr "" +"Méthode utilisée pour chiffrer les mots de passe des boites aux lettres" #: core/app_settings.py:66 msgid "Rounds" @@ -74,7 +75,9 @@ msgstr "Tours" msgid "" "Number of rounds to use (only used by sha256crypt and sha512crypt). Must be " "between 1000 and 999999999, inclusive." -msgstr "Nombre de tours à utiliser (sha256crypt et sha512crypt uniquement). Doit être compris entre 1000 et 999999999 inclue." +msgstr "" +"Nombre de tours à utiliser (sha256crypt et sha512crypt uniquement). Doit " +"être compris entre 1000 et 999999999 inclue." #: core/app_settings.py:76 msgid "Secret key" @@ -136,7 +139,9 @@ msgstr "ND de connexion" msgid "" "The distinguished name to use when binding to the LDAP server. Leave empty " "for an anonymous bind" -msgstr "Le nom distinctif à utiliser pour les connections au serveur LDAP. Laisser vide pour une connexion anonyme" +msgstr "" +"Le nom distinctif à utiliser pour les connections au serveur LDAP. Laisser " +"vide pour une connexion anonyme" #: core/app_settings.py:128 msgid "Bind password" @@ -144,7 +149,9 @@ msgstr "Mot de passe de connexion" #: core/app_settings.py:131 msgid "The password to use when binding to the LDAP server (with 'Bind DN')" -msgstr "Le mot de passe à utiliser pour les connections au serveur LDAP (avec 'ND de connexion')" +msgstr "" +"Le mot de passe à utiliser pour les connections au serveur LDAP (avec 'ND de " +"connexion')" #: core/app_settings.py:140 msgid "Users search base" @@ -152,7 +159,9 @@ msgstr "Base de recherche des utilisateurs" #: core/app_settings.py:143 msgid "The distinguished name of the search base used to find users" -msgstr "Le nom distinctif de la base de recherche utilisée pour rechercher les utilisateurs" +msgstr "" +"Le nom distinctif de la base de recherche utilisée pour rechercher les " +"utilisateurs" #: core/app_settings.py:150 msgid "Search filter" @@ -162,7 +171,9 @@ msgstr "Filtre de recherche" msgid "" "An optional filter string (e.g. '(objectClass=person)'). In order to be " "valid, it must be enclosed in parentheses." -msgstr "Un filtre de recherche optionel (ex. '(objectClass=person)'). Pour être valide, il doit être entouré de parenthèses." +msgstr "" +"Un filtre de recherche optionel (ex. '(objectClass=person)'). Pour être " +"valide, il doit être entouré de parenthèses." #: core/app_settings.py:161 msgid "User DN template" @@ -173,7 +184,9 @@ msgstr "Modèle de nom distinctif utilisateur" msgid "" "The template used to construct a user's DN. It should contain one " "placeholder (ie. %(user)s)" -msgstr "Le modèle utilisé pour construire le nom distinctif d'un utilisateur. Il doit contenir un espace réservé (ex. %(user)s)" +msgstr "" +"Le modèle utilisé pour construire le nom distinctif d'un utilisateur. Il " +"doit contenir un espace réservé (ex. %(user)s)" #: core/app_settings.py:172 msgid "Password attribute" @@ -197,9 +210,12 @@ msgstr "Groupes administrateurs" #: core/app_settings.py:189 msgid "" -"Members of those LDAP Posix groups will be created as domain administrators." -" Use ';' characters to separate groups." -msgstr "Les membres de ces groupes LDAP (Posix) seront créés en tant qu'administrateurs de domaine. Utiliser des caractères ';' pour séparer les groupes." +"Members of those LDAP Posix groups will be created as domain administrators. " +"Use ';' characters to separate groups." +msgstr "" +"Les membres de ces groupes LDAP (Posix) seront créés en tant " +"qu'administrateurs de domaine. Utiliser des caractères ';' pour séparer les " +"groupes." #: core/app_settings.py:196 msgid "Group type" @@ -215,7 +231,9 @@ msgstr "Base de recherche des groupes" #: core/app_settings.py:208 msgid "The distinguished name of the search base used to find groups" -msgstr "Le nom distinctif de la base de recherche utilisée pour rechercher les groupes" +msgstr "" +"Le nom distinctif de la base de recherche utilisée pour rechercher les " +"groupes" #: core/app_settings.py:213 msgid "Notifications" @@ -255,7 +273,9 @@ msgstr "Envoyer des statistiques" #: core/app_settings.py:243 msgid "Send statistics to Modoboa public API (counters and used extensions)" -msgstr "Envoyer des statistiques à l'API publique de Modoboa (compteurs et extensions utilisées)" +msgstr "" +"Envoyer des statistiques à l'API publique de Modoboa (compteurs et " +"extensions utilisées)" #: core/app_settings.py:247 msgid "Miscellaneous" @@ -291,7 +311,8 @@ msgstr "Redirection par défaut" #: core/app_settings.py:277 msgid "The default redirection used when no application is specified" -msgstr "La redirection appliquée par défaut quand aucune application n'est spécifiée" +msgstr "" +"La redirection appliquée par défaut quand aucune application n'est spécifiée" #: core/app_settings.py:310 msgid "Key must be either 16, 24, or 32 bytes long" @@ -402,6 +423,10 @@ msgstr "mot de passe" msgid "last login" msgstr "dernière connexion" +#: core/models.py:70 +msgid "language" +msgstr "" + #: core/models.py:73 msgid "Prefered language to display pages." msgstr "Langage préféré pour afficher les pages" @@ -422,32 +447,33 @@ msgstr "Une adresse e-mail alternative ou de secours." msgid "You can't delete your own account" msgstr "Vous ne pouvez pas supprimer votre propre compte" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" -msgstr "Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé" +msgstr "" +"Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "compte" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "Inconnu" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "Ligne invalide" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "Vous ne pouvez pas importer un compte avec un rôle supérieur au votre" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "L'utilisateur simple '%s' doit avoir une adresse email valide" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "Les champs username et email de '%s' ne doivent pas différer" @@ -482,7 +508,9 @@ msgstr "Dernières nouvelles" msgid "" "Visit the official " "weblog for more information." -msgstr "Visitez le blog officiel pour plus d'information." +msgstr "" +"Visitez le blog " +"officiel pour plus d'information." #: core/templates/core/information.html:2 core/templatetags/core_tags.py:53 msgid "Information" @@ -498,7 +526,8 @@ msgstr "Une ou plusieurs mises à jour sont disponibles!" #: core/templates/core/information.html:6 msgid "Check the following list to find the component(s) that can be updated." -msgstr "Consulter la liste suivante pour trouver le(s) composant(s) concerné(s)." +msgstr "" +"Consulter la liste suivante pour trouver le(s) composant(s) concerné(s)." #: core/templates/core/information.html:10 msgid "Applications" @@ -626,7 +655,9 @@ msgstr "Utiliseur '%s' connecté avec succès" #: core/views/auth.py:48 msgid "Your username and password didn't match. Please try again." -msgstr "Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez réessayer." +msgstr "" +"Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez " +"réessayer." #: core/views/auth.py:76 #, python-format diff --git a/modoboa/locale/it/LC_MESSAGES/django.po b/modoboa/locale/it/LC_MESSAGES/django.po index 1dcbcbd81..fe8ac009a 100644 --- a/modoboa/locale/it/LC_MESSAGES/django.po +++ b/modoboa/locale/it/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2015-10-11 11:47+0000\n" "Last-Translator: Rocco \n" "Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/" @@ -436,6 +436,12 @@ msgstr "password" msgid "last login" msgstr "ultimo login" +#: core/models.py:70 +#, fuzzy +#| msgid "Prefered language" +msgid "language" +msgstr "Lingua preferita" + #: core/models.py:73 #, fuzzy #| msgid "Prefered language to display pages" @@ -458,32 +464,32 @@ msgstr "" msgid "You can't delete your own account" msgstr "Non puoi cancellare il tuo account" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "Aggiornamento della password fallito: il modulo LDAP non è installato" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "account" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "Riga non valida" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "Non puoi importare un account con un ruolo superiore al tuo" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "L'utente '%s' deve avere un indirizzo email valido" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "I campi nome utente e email di '%s' devono avere lo stesso valore" @@ -809,6 +815,3 @@ msgstr "Registrati" #~ msgid "Display" #~ msgstr "Mostra" - -#~ msgid "Prefered language" -#~ msgstr "Lingua preferita" diff --git a/modoboa/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/locale/ja_JP/LC_MESSAGES/django.po index 2892d834f..ba2d11ee5 100644 --- a/modoboa/locale/ja_JP/LC_MESSAGES/django.po +++ b/modoboa/locale/ja_JP/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-09-14 17:06+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/" @@ -422,6 +422,10 @@ msgstr "パスワード" msgid "last login" msgstr "最終ログイン" +#: core/models.py:70 +msgid "language" +msgstr "" + #: core/models.py:73 msgid "Prefered language to display pages." msgstr "ページの表示に優先言語を使う" @@ -442,35 +446,35 @@ msgstr "別の電子メールアドレスは、回復の必要のために使用 msgid "You can't delete your own account" msgstr "あなた自身のアカウントは削除できません" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "" "パスワードの更新に失敗しました : LDAP モジュールがインストールされていませ" "ん。" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "アカウント" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "不正な行" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "あなた以上のロールを持ったアカウントはインポートできません" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "" "ユーザー \"%s\" は、正しい電子メールアドレスを持っていなければいけません" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "\"%s\" のユーザー名と電子メールフィールドが同一である必要があります。" diff --git a/modoboa/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/locale/nl_NL/LC_MESSAGES/django.po index 079311ccc..f0eff9667 100644 --- a/modoboa/locale/nl_NL/LC_MESSAGES/django.po +++ b/modoboa/locale/nl_NL/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-31 11:37+0000\n" "Last-Translator: TuxBrother \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" @@ -434,6 +434,12 @@ msgstr "wachtwoord" msgid "last login" msgstr "laatste login" +#: core/models.py:70 +#, fuzzy +#| msgid "Prefered language" +msgid "language" +msgstr "Voorkeurs taal" + #: core/models.py:73 #, fuzzy #| msgid "Prefered language to display pages" @@ -456,32 +462,32 @@ msgstr "" msgid "You can't delete your own account" msgstr "U kunt uw eigen account niet verwijderen" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "Mislukt om wachtwoord aan te passen: LDAP module niet geinstalleerd" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "account" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "Verkeerde regel" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "U kunt geen accounts importeren met hogere rechten dan die van uzelf." -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "De gebruiker '%s' moet een geldig email adres hebben" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "gebruikersnaam en email velden moeten niet verschillen van '%s'" @@ -815,6 +821,3 @@ msgstr "Inloggen" #~ msgid "Display" #~ msgstr "Weergeven" - -#~ msgid "Prefered language" -#~ msgstr "Voorkeurs taal" diff --git a/modoboa/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/locale/pt_BR/LC_MESSAGES/django.po index 79ce0ea3f..2228ad7c2 100644 --- a/modoboa/locale/pt_BR/LC_MESSAGES/django.po +++ b/modoboa/locale/pt_BR/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-05-17 12:26+0000\n" "Last-Translator: Jose Marcos Araujo \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/" @@ -428,6 +428,10 @@ msgstr "senha" msgid "last login" msgstr "último login" +#: core/models.py:70 +msgid "language" +msgstr "" + #: core/models.py:73 msgid "Prefered language to display pages." msgstr "Linguagem padrão para visualizar mensagens" @@ -449,32 +453,32 @@ msgstr "" msgid "You can't delete your own account" msgstr "Você não pode deletar sua própria conta" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "Falha ao atualizar senha: módulo LDAP não instalado" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "conta" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "Linha inválida" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "Você não pode importar uma conta com um papel maior que o seu" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "O usuário simples '%s' deve ter um endereço de e-mail válido" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "os campos nome de usuário e e-mail não diferem de '%s'" diff --git a/modoboa/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/locale/pt_PT/LC_MESSAGES/django.po index a7456fa7c..a07a45d26 100644 --- a/modoboa/locale/pt_PT/LC_MESSAGES/django.po +++ b/modoboa/locale/pt_PT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-29 12:51+0000\n" "Last-Translator: Mike C. \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" @@ -435,6 +435,12 @@ msgstr "password" msgid "last login" msgstr "último login" +#: core/models.py:70 +#, fuzzy +#| msgid "Prefered language" +msgid "language" +msgstr "Idioma preferido" + #: core/models.py:73 #, fuzzy #| msgid "Prefered language to display pages" @@ -457,32 +463,32 @@ msgstr "" msgid "You can't delete your own account" msgstr "Não pode apagar a sua própria conta" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "Falha ao actualizar password: Modulo LDAP não instalado" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "conta" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "Linha inválida" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "Não é possível importa uma conta com permissões superiores" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "O simple utilizador '%s' deve ter endereço de e-mail válido" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "" @@ -816,6 +822,3 @@ msgstr "Entrar" #~ msgid "Display" #~ msgstr "Exibir" - -#~ msgid "Prefered language" -#~ msgstr "Idioma preferido" diff --git a/modoboa/locale/ru/LC_MESSAGES/django.po b/modoboa/locale/ru/LC_MESSAGES/django.po index dd7f47ac7..c75eb9fa4 100644 --- a/modoboa/locale/ru/LC_MESSAGES/django.po +++ b/modoboa/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2013-12-03 09:35+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Russian (http://www.transifex.com/projects/p/modoboa/language/" @@ -425,6 +425,12 @@ msgstr "" msgid "last login" msgstr "" +#: core/models.py:70 +#, fuzzy +#| msgid "Prefered language" +msgid "language" +msgstr "Предпочитаемый язык" + #: core/models.py:73 #, fuzzy #| msgid "Prefered language to display pages" @@ -447,32 +453,32 @@ msgstr "" msgid "You can't delete your own account" msgstr "Вы не можете удалить собственный аккаунт" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "Ошибка обновления пароля: модуль LDAP не установлен" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "Аккаунт" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "Ошибочная строка" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "Вы не можете импортировать аккаунт с ролью старше чем у вас" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Пользователь '%s' должен иметь действительный почтовый адрес" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "Имя пользователя и адрес не должны отличатся для пользователя '%s'" @@ -803,6 +809,3 @@ msgstr "Войти" #~ msgid "Display" #~ msgstr "Отображение" - -#~ msgid "Prefered language" -#~ msgstr "Предпочитаемый язык" diff --git a/modoboa/locale/sv/LC_MESSAGES/django.po b/modoboa/locale/sv/LC_MESSAGES/django.po index bb984ab91..30984860e 100644 --- a/modoboa/locale/sv/LC_MESSAGES/django.po +++ b/modoboa/locale/sv/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-05-30 18:03+0000\n" "Last-Translator: Olle Gustafsson \n" "Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/" @@ -424,6 +424,10 @@ msgstr "lösenord" msgid "last login" msgstr "senaste inloggning" +#: core/models.py:70 +msgid "language" +msgstr "" + #: core/models.py:73 msgid "Prefered language to display pages." msgstr "Önskat språk för att visa sidor." @@ -444,32 +448,32 @@ msgstr "En alternativ e-post adress, kan användas för återställningsbehov." msgid "You can't delete your own account" msgstr "Du kan inte radera ditt eget konto" -#: core/models.py:164 +#: core/models.py:167 msgid "Failed to update password: LDAP module not installed" msgstr "Misslyckades med att uppdatera lösenord: LDAP modul ej installerad" -#: core/models.py:222 +#: core/models.py:225 msgid "account" msgstr "konto" -#: core/models.py:354 +#: core/models.py:347 msgid "Unknown" msgstr "" -#: core/models.py:393 +#: core/models.py:386 msgid "Invalid line" msgstr "Ogiltig rad" -#: core/models.py:401 +#: core/models.py:394 msgid "You can't import an account with a role greater than yours" msgstr "Du kan inte importera konto med en roll större än din" -#: core/models.py:416 +#: core/models.py:409 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Den enkla användaren '%s' måste ha en gällande e-postadress" -#: core/models.py:421 +#: core/models.py:414 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "användarnamn och e-post fält får inte avvika för '%s'" diff --git a/modoboa/relaydomains/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/cs_CZ/LC_MESSAGES/django.po index 023ced06b..3f2e3ffa4 100644 --- a/modoboa/relaydomains/locale/cs_CZ/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/cs_CZ/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2015-01-06 10:05+0000\n" "Last-Translator: Miroslav Abrahám \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/" diff --git a/modoboa/relaydomains/locale/de/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/de/LC_MESSAGES/django.po index bf99be890..8972274d7 100644 --- a/modoboa/relaydomains/locale/de/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/de/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-03 11:02+0000\n" "Last-Translator: Arvedui \n" "Language-Team: German (http://www.transifex.com/projects/p/modoboa/language/" diff --git a/modoboa/relaydomains/locale/en/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/en/LC_MESSAGES/django.po index 23b027948..77b9a2d21 100644 --- a/modoboa/relaydomains/locale/en/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/modoboa/relaydomains/locale/es/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/es/LC_MESSAGES/django.po index 44b6a2d60..833be8f52 100644 --- a/modoboa/relaydomains/locale/es/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/es/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2013-10-01 09:56+0000\n" "Last-Translator: Pedro Gracia \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/modoboa/language/" diff --git a/modoboa/relaydomains/locale/fr/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/fr/LC_MESSAGES/django.po index eb56361f6..a0f77c255 100644 --- a/modoboa/relaydomains/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: modoboa-1.1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2011-01-07 10:00+100\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: FR \n" diff --git a/modoboa/relaydomains/locale/it/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/it/LC_MESSAGES/django.po index 275b64e6e..f5c05d421 100644 --- a/modoboa/relaydomains/locale/it/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2013-12-23 00:56+0100\n" "Last-Translator: Alberto Berti \n" "Language-Team: ITALIANO \n" diff --git a/modoboa/relaydomains/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/ja_JP/LC_MESSAGES/django.po index 0b6620361..1c8cd3476 100644 --- a/modoboa/relaydomains/locale/ja_JP/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/ja_JP/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2016-06-07 07:27+0000\n" "Last-Translator: cwatanab \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/" diff --git a/modoboa/relaydomains/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/nl_NL/LC_MESSAGES/django.po index 28d4b0020..dbcd3e741 100644 --- a/modoboa/relaydomains/locale/nl_NL/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/nl_NL/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-31 11:37+0000\n" "Last-Translator: TuxBrother \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" diff --git a/modoboa/relaydomains/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/pt_BR/LC_MESSAGES/django.po index 15c7ef798..a82680a23 100644 --- a/modoboa/relaydomains/locale/pt_BR/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/pt_BR/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-13 09:10+0000\n" "Last-Translator: Paulino Michelazzo \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" diff --git a/modoboa/relaydomains/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/pt_PT/LC_MESSAGES/django.po index 8b4201eda..e3d34d23c 100644 --- a/modoboa/relaydomains/locale/pt_PT/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/pt_PT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2014-12-29 12:51+0000\n" "Last-Translator: Mike C. \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" diff --git a/modoboa/relaydomains/locale/ru/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/ru/LC_MESSAGES/django.po index 9dbf54986..19c3a9124 100644 --- a/modoboa/relaydomains/locale/ru/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2013-12-03 09:35+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Russian (http://www.transifex.com/projects/p/modoboa/language/" diff --git a/modoboa/relaydomains/locale/sv/LC_MESSAGES/django.po b/modoboa/relaydomains/locale/sv/LC_MESSAGES/django.po index f9754fb6e..b1f0e3d7b 100644 --- a/modoboa/relaydomains/locale/sv/LC_MESSAGES/django.po +++ b/modoboa/relaydomains/locale/sv/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-06 13:36+0200\n" +"POT-Creation-Date: 2016-10-16 14:31+0200\n" "PO-Revision-Date: 2015-01-13 15:18+0000\n" "Last-Translator: Olle Gustafsson \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/modoboa/language/" From 699f94c70b251966b886e3d7643b4549b7356cb3 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 16 Oct 2016 21:54:50 +0200 Subject: [PATCH 40/40] Updated french translation. --- modoboa/admin/locale/fr/LC_MESSAGES/django.po | 140 +++++------------- modoboa/locale/fr/LC_MESSAGES/django.po | 69 +++------ 2 files changed, 54 insertions(+), 155 deletions(-) diff --git a/modoboa/admin/locale/fr/LC_MESSAGES/django.po b/modoboa/admin/locale/fr/LC_MESSAGES/django.po index ebbfc8c82..219a79e4d 100644 --- a/modoboa/admin/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/fr/LC_MESSAGES/django.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Antoine Nguyen , 2015-2016 msgid "" @@ -9,13 +9,13 @@ msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-10-16 14:31+0200\n" -"PO-Revision-Date: 2016-10-08 07:09+0000\n" +"PO-Revision-Date: 2016-10-16 19:52+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" -"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: admin/app_settings.py:54 admin/callbacks.py:25 @@ -38,11 +38,9 @@ msgstr "MX(s) valide(s)" #: admin/app_settings.py:68 msgid "" -"IP(s) or network(s) of the MX that should match with domains' MX records. On " -"per line." -msgstr "" -"IP(s) ou réseau(x) avec lesquels les enregistrements MX des domaines doivent " -"correspondre. Un par ligne." +"IP(s) or network(s) of the MX that should match with domains' MX records. On" +" per line." +msgstr "IP(s) ou réseau(x) avec lesquels les enregistrements MX des domaines doivent correspondre. Un par ligne." #: admin/app_settings.py:77 msgid "Enable DNSBL checks" @@ -64,9 +62,7 @@ msgstr "Gérer les boites sur le système de fichiers" msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" -msgstr "" -"Renommer ou supprimer les boites sur le système de fichiers quand elles sont " -"renommées ou supprimées dans Modoboa" +msgstr "Renommer ou supprimer les boites sur le système de fichiers quand elles sont renommées ou supprimées dans Modoboa" #: admin/app_settings.py:96 msgid "Mailboxes owner" @@ -84,9 +80,7 @@ msgstr "Quota de domaine par défaut" msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." -msgstr "" -"Quota par défaut (en Mo) appliqué aux domaines fraichement créés et ne " -"spécifiant pas de valeur. 0 signifie qu'aucun quota ne sera appliqué." +msgstr "Quota par défaut (en Mo) appliqué aux domaines fraichement créés et ne spécifiant pas de valeur. 0 signifie qu'aucun quota ne sera appliqué." #: admin/app_settings.py:113 msgid "Automatic account removal" @@ -94,19 +88,16 @@ msgstr "Suppression automatique de compte" #: admin/app_settings.py:116 msgid "When a mailbox is removed, also remove the associated account" -msgstr "" -"Lorsqu'une boite aux lettres est supprimée, supprimer le compte associé en " -"même temps" +msgstr "Lorsqu'une boite aux lettres est supprimée, supprimer le compte associé en même temps" #: admin/app_settings.py:120 msgid "Automatic domain/mailbox creation" msgstr "Création automatique de domaine/boite aux lettres" #: admin/app_settings.py:123 -msgid "Create a domain and a mailbox when an account is automatically created." -msgstr "" -"Créer un domaine et une boite aux lettres quand un compte est créé " -"automatiquement." +msgid "" +"Create a domain and a mailbox when an account is automatically created." +msgstr "Créer un domaine et une boite aux lettres quand un compte est créé automatiquement." #: admin/app_settings.py:170 admin/forms/account.py:292 #: admin/forms/domain.py:81 @@ -153,9 +144,7 @@ msgstr "Nom d'utilisateur" msgid "" "The user's name. Must be a valid e-mail address for simple users or " "administrators with a mailbox." -msgstr "" -"Le nom de l'utilisateur. Doit être une adresse e-mail valide pour les " -"utilisateurs simples ou les administrateurs avec une boite aux lettres." +msgstr "Le nom de l'utilisateur. Doit être une adresse e-mail valide pour les utilisateurs simples ou les administrateurs avec une boite aux lettres." #: admin/forms/account.py:40 admin/templates/admin/account_detail.html:29 msgid "Role" @@ -211,10 +200,7 @@ msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " "administrators)." -msgstr "" -"Quota en Mo pour cette boite. 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)." +msgstr "Quota en Mo pour cette boite. 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)." #: admin/forms/account.py:205 admin/forms/domain.py:44 #: admin/templates/admin/domains.html:35 @@ -222,19 +208,11 @@ msgid "Alias(es)" msgstr "Alias" #: admin/forms/account.py:208 -#, fuzzy -#| msgid "" -#| "Alias(es) of this mailbox. Indicate only one address per input, press " -#| "ENTER to add a new input. Use the '*' character to create a 'catchall' " -#| "alias (ex: *@domain.tld)." msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. To create a catchall alias, just enter the domain name " "(@domain.tld)." -msgstr "" -"Alias de cette boite. Indiquer seulement une adresse par champ, appuyer sur " -"ENTREE pour ajouter un nouveau champ. Utiliser le caractère '*' pour créer " -"une adresse 'attrape tout' (ex: *@domain.tld)." +msgstr "Alias de cette boîte aux lettres. Indiquer une adresse par champ, appuyer sur ENTREE pour ajouter un nouveau champ. Pour créer un alias 'fourre-tout', entrer seulement le nom du domaine (@domain.tld)." #: admin/forms/account.py:214 msgid "Sender addresses" @@ -245,11 +223,7 @@ msgid "" "Additional sender address(es) for this account. The user will be allowed to " "send emails using this address, even if it does not exist locally. Indicate " "one address per input. Press ENTER to add a new input." -msgstr "" -"Adresse(s) d'envoi supplémentaire(s) pour ce compte. L'utilisateur sera " -"autorisé à envoyer des e-mails en utilisant la/les adresse(s) déclarée(s), " -"même si elle(s) n'existe(nt) pas localement. Indiquer une adresse par champ. " -"Appuyer sur ENTREE pour ajouter un nouveau champ." +msgstr "Adresse(s) d'envoi supplémentaire(s) pour ce compte. L'utilisateur sera autorisé à envoyer des e-mails en utilisant la/les adresse(s) déclarée(s), même si elle(s) n'existe(nt) pas localement. Indiquer une adresse par champ. Appuyer sur ENTREE pour ajouter un nouveau champ." #: admin/forms/account.py:271 admin/forms/alias.py:92 #: admin/models/mailbox.py:293 @@ -305,9 +279,7 @@ msgstr "Adresse email" msgid "" "The alias address. To create a catchall alias, just enter the domain name " "(@domain.tld)." -msgstr "" -"L'adresse de l'alias. Pour créer un alias \"fourre-tout\", saisissez " -"uniquement le nom du domaine (@domain.tld)." +msgstr "L'adresse de l'alias. Pour créer un alias \"fourre-tout\", saisissez uniquement le nom du domaine (@domain.tld)." #: admin/forms/alias.py:35 admin/templates/admin/alias_detail.html:37 msgid "Recipients" @@ -317,9 +289,7 @@ msgstr "Destinataires" msgid "" "Addresses this alias will point to. Indicate only one address per input, " "press ENTER to add a new input." -msgstr "" -"Les adresses vers lesquelles cet alias pointera. Indiquer une adresse par " -"champ, appuyer sur ENTREE pour ajouter un nouveau champ." +msgstr "Les adresses vers lesquelles cet alias pointera. Indiquer une adresse par champ, appuyer sur ENTREE pour ajouter un nouveau champ." #: admin/forms/alias.py:47 admin/forms/domain.py:24 admin/models/domain.py:90 #: admin/templates/admin/domain_statistics.html:49 @@ -346,17 +316,13 @@ msgstr "Type" msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." -msgstr "" -"Quota par défaut en Mo appliqué aux boites aux lettres. Laisser vide pour " -"utiliser la valeur par défaut." +msgstr "Quota par défaut en Mo appliqué aux boites aux lettres. Laisser vide pour utiliser la valeur par défaut." #: admin/forms/domain.py:47 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." -msgstr "" -"Alias de ce domaine. Indiquer seulement un nom par champ, appuyer sur ENTREE " -"pour ajouter un nouveau champ." +msgstr "Alias de ce domaine. Indiquer seulement un nom par champ, appuyer sur ENTREE pour ajouter un nouveau champ." #: admin/forms/domain.py:101 admin/forms/domain.py:113 #: admin/forms/domain.py:121 @@ -387,9 +353,7 @@ msgstr "Nom" msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." -msgstr "" -"Le nom de l'administrateur. Ne pas include un nom de domaine ici, il sera " -"ajouté automatiquement." +msgstr "Le nom de l'administrateur. Ne pas include un nom de domaine ici, il sera ajouté automatiquement." #: admin/forms/domain.py:184 msgid "Create aliases" @@ -452,9 +416,7 @@ msgstr "Transférer les messages et conserver une copie dans votre boite locale" msgid "" "You can't define a forward to a local destination. Please ask your " "administrator to create an alias instead." -msgstr "" -"Vous ne pouvez pas définir un transfert vers une destination locale. " -"Veuillez plutôt demander à votre administrateur de créer un alias" +msgstr "Vous ne pouvez pas définir un transfert vers une destination locale. Veuillez plutôt demander à votre administrateur de créer un alias" #: admin/forms/import_.py:11 msgid "Select a file" @@ -474,9 +436,7 @@ msgstr "Chiffrer les mots de passe" #: admin/forms/import_.py:40 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" #: admin/lib.py:31 msgid "A mailbox is required" @@ -617,9 +577,7 @@ msgstr "Permission refusée." #: admin/serializers.py:83 msgid "" "List of administered domains (resellers and domain administrators only)." -msgstr "" -"Liste des domaines administrés (revendeurs et administrateurs de domaine " -"seulement)." +msgstr "Liste des domaines administrés (revendeurs et administrateurs de domaine seulement)." #: admin/serializers.py:193 msgid "Not allowed for this role." @@ -869,9 +827,7 @@ msgstr "Mis à jour" #: admin/templates/admin/mx_domain_detail.html:23 msgid "This IP does not match any of the valid MXs defined in parameters" -msgstr "" -"Cette IP ne correspond à un aucun des MX valides déclarés dans les " -"paramètres." +msgstr "Cette IP ne correspond à un aucun des MX valides déclarés dans les paramètres." #: admin/templates/admin/mx_domain_detail.html:36 msgid "No MX record found for this domain." @@ -882,26 +838,19 @@ msgstr "Aucun enregistrement MX trouvé pour ce domaine." msgid "" "Modoboa detected that domain %(domain)s is listed by the following DNSBL " "providers:" -msgstr "" -"Modoboa a détecté que le domaine %(domain)s est listé par les fournisseurs " -"de DNSBL suivants :" +msgstr "Modoboa a détecté que le domaine %(domain)s est listé par les fournisseurs de DNSBL suivants :" #: admin/templates/admin/notifications/domain_in_dnsbl.html:11 msgid "" "The domain's reputation will be affected and there is a chance that emails " "coming from it are considered as spam. You should contact those providers " "and ask them to unlist detected IP address(es)." -msgstr "" -"La réputation de ce domaine sera affectée et il est probable que les emails " -"venant de lui soient considérés comme du spam. Vous devriez contacter ces " -"fournisseurs pour leur demander de délister la/les adresse(s) détectée(s)." +msgstr "La réputation de ce domaine sera affectée et il est probable que les emails venant de lui soient considérés comme du spam. Vous devriez contacter ces fournisseurs pour leur demander de délister la/les adresse(s) détectée(s)." #: admin/templates/admin/notifications/domain_invalid_mx.html:3 #, python-format msgid "Modoboa detected that domain %(domain)s has no valid MX record:" -msgstr "" -"Modoboa a détecté que le domain %(domain)s n'a aucun enregistrement MX " -"valide :" +msgstr "Modoboa a détecté que le domain %(domain)s n'a aucun enregistrement MX valide :" #: admin/templates/admin/quota_headers.html:3 msgid "Value" @@ -1047,19 +996,9 @@ msgid "" "
  • domainalias; name; targeted domain; enabled
  • \n" " %s\n" "\n" -"

    The first element of each line is mandatory and must be equal to one of " -"the previous values.

    \n" +"

    The first element of each line is mandatory and must be equal to one of the previous values.

    \n" "

    You can use a different character as separator.

    \n" -msgstr "" -"Fournir un fichier CSV ou chaque ligne respècte un des formats suivants :\n" -"
      \n" -"
    • domain; nom; quota; activé
    • \n" -"
    • domainalias; nom; domaine cible; activé
    • \n" -" %s\n" -"
    \n" -"

    Le premier élément de chaque ligne est obligatoire et doit être égal à " -"l'une des valeurs précédentes.

    \n" -"

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" +msgstr "Fournir un fichier CSV ou chaque ligne respècte un des formats suivants :\n
      \n
    • domain; nom; quota; activé
    • \n
    • domainalias; nom; domaine cible; activé
    • \n %s\n
    \n

    Le premier élément de chaque ligne est obligatoire et doit être égal à l'une des valeurs précédentes.

    \n

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" #: admin/views/import_.py:98 msgid "Import domains" @@ -1069,26 +1008,13 @@ msgstr "Importer des domaines" msgid "" "Provide a CSV file where lines respect one of the following formats:\n" "
      \n" -"
    • account; loginname; password; first name; last name; enabled; group; " -"address; quota; [, domain, ...]
    • \n" +"
    • account; loginname; password; first name; last name; enabled; group; address; quota; [, domain, ...]
    • \n" "
    • alias; address; enabled; recipient; recipient; ...
    • \n" "
    \n" -"

    The first element of each line is mandatory and must be equal to one of " -"the previous values.

    \n" +"

    The first element of each line is mandatory and must be equal to one of the previous values.

    \n" "\n" "

    You can use a different character as separator.

    \n" -msgstr "" -"Fournir un fichier CSV dans lequel les lignes respectent un des formats " -"suivants :\n" -"
      \n" -"
    • account; loginname; password; first name; last name; enabled; group; " -"address; quota; [, domain, ...]
    • \n" -"
    • alias; address; enabled; recipient; recipient; ...
    • \n" -"
    \n" -"

    Le premier élément de chaque ligne est obligatoire et doit être égal à " -"l'une des valeurs précédentes..

    \n" -"\n" -"

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" +msgstr "Fournir un fichier CSV dans lequel les lignes respectent un des formats suivants :\n
      \n
    • account; loginname; password; first name; last name; enabled; group; address; quota; [, domain, ...]
    • \n
    • alias; address; enabled; recipient; recipient; ...
    • \n
    \n

    Le premier élément de chaque ligne est obligatoire et doit être égal à l'une des valeurs précédentes..

    \n\n

    Vous pouvez utiliser un caractère différent comme séparateur.

    \n" #: admin/views/import_.py:130 msgid "Import identities" diff --git a/modoboa/locale/fr/LC_MESSAGES/django.po b/modoboa/locale/fr/LC_MESSAGES/django.po index 4e6563074..6a1de9232 100644 --- a/modoboa/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/locale/fr/LC_MESSAGES/django.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Antoine Nguyen , 2016 msgid "" @@ -9,13 +9,13 @@ msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-10-16 14:31+0200\n" -"PO-Revision-Date: 2016-10-08 07:07+0000\n" +"PO-Revision-Date: 2016-10-16 19:46+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" -"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: core/__init__.py:63 @@ -64,8 +64,7 @@ msgstr "plain (faible)" #: core/app_settings.py:61 msgid "Scheme used to crypt mailbox passwords" -msgstr "" -"Méthode utilisée pour chiffrer les mots de passe des boites aux lettres" +msgstr "Méthode utilisée pour chiffrer les mots de passe des boites aux lettres" #: core/app_settings.py:66 msgid "Rounds" @@ -75,9 +74,7 @@ msgstr "Tours" msgid "" "Number of rounds to use (only used by sha256crypt and sha512crypt). Must be " "between 1000 and 999999999, inclusive." -msgstr "" -"Nombre de tours à utiliser (sha256crypt et sha512crypt uniquement). Doit " -"être compris entre 1000 et 999999999 inclue." +msgstr "Nombre de tours à utiliser (sha256crypt et sha512crypt uniquement). Doit être compris entre 1000 et 999999999 inclue." #: core/app_settings.py:76 msgid "Secret key" @@ -139,9 +136,7 @@ msgstr "ND de connexion" msgid "" "The distinguished name to use when binding to the LDAP server. Leave empty " "for an anonymous bind" -msgstr "" -"Le nom distinctif à utiliser pour les connections au serveur LDAP. Laisser " -"vide pour une connexion anonyme" +msgstr "Le nom distinctif à utiliser pour les connections au serveur LDAP. Laisser vide pour une connexion anonyme" #: core/app_settings.py:128 msgid "Bind password" @@ -149,9 +144,7 @@ msgstr "Mot de passe de connexion" #: core/app_settings.py:131 msgid "The password to use when binding to the LDAP server (with 'Bind DN')" -msgstr "" -"Le mot de passe à utiliser pour les connections au serveur LDAP (avec 'ND de " -"connexion')" +msgstr "Le mot de passe à utiliser pour les connections au serveur LDAP (avec 'ND de connexion')" #: core/app_settings.py:140 msgid "Users search base" @@ -159,9 +152,7 @@ msgstr "Base de recherche des utilisateurs" #: core/app_settings.py:143 msgid "The distinguished name of the search base used to find users" -msgstr "" -"Le nom distinctif de la base de recherche utilisée pour rechercher les " -"utilisateurs" +msgstr "Le nom distinctif de la base de recherche utilisée pour rechercher les utilisateurs" #: core/app_settings.py:150 msgid "Search filter" @@ -171,9 +162,7 @@ msgstr "Filtre de recherche" msgid "" "An optional filter string (e.g. '(objectClass=person)'). In order to be " "valid, it must be enclosed in parentheses." -msgstr "" -"Un filtre de recherche optionel (ex. '(objectClass=person)'). Pour être " -"valide, il doit être entouré de parenthèses." +msgstr "Un filtre de recherche optionel (ex. '(objectClass=person)'). Pour être valide, il doit être entouré de parenthèses." #: core/app_settings.py:161 msgid "User DN template" @@ -184,9 +173,7 @@ msgstr "Modèle de nom distinctif utilisateur" msgid "" "The template used to construct a user's DN. It should contain one " "placeholder (ie. %(user)s)" -msgstr "" -"Le modèle utilisé pour construire le nom distinctif d'un utilisateur. Il " -"doit contenir un espace réservé (ex. %(user)s)" +msgstr "Le modèle utilisé pour construire le nom distinctif d'un utilisateur. Il doit contenir un espace réservé (ex. %(user)s)" #: core/app_settings.py:172 msgid "Password attribute" @@ -210,12 +197,9 @@ msgstr "Groupes administrateurs" #: core/app_settings.py:189 msgid "" -"Members of those LDAP Posix groups will be created as domain administrators. " -"Use ';' characters to separate groups." -msgstr "" -"Les membres de ces groupes LDAP (Posix) seront créés en tant " -"qu'administrateurs de domaine. Utiliser des caractères ';' pour séparer les " -"groupes." +"Members of those LDAP Posix groups will be created as domain administrators." +" Use ';' characters to separate groups." +msgstr "Les membres de ces groupes LDAP (Posix) seront créés en tant qu'administrateurs de domaine. Utiliser des caractères ';' pour séparer les groupes." #: core/app_settings.py:196 msgid "Group type" @@ -231,9 +215,7 @@ msgstr "Base de recherche des groupes" #: core/app_settings.py:208 msgid "The distinguished name of the search base used to find groups" -msgstr "" -"Le nom distinctif de la base de recherche utilisée pour rechercher les " -"groupes" +msgstr "Le nom distinctif de la base de recherche utilisée pour rechercher les groupes" #: core/app_settings.py:213 msgid "Notifications" @@ -273,9 +255,7 @@ msgstr "Envoyer des statistiques" #: core/app_settings.py:243 msgid "Send statistics to Modoboa public API (counters and used extensions)" -msgstr "" -"Envoyer des statistiques à l'API publique de Modoboa (compteurs et " -"extensions utilisées)" +msgstr "Envoyer des statistiques à l'API publique de Modoboa (compteurs et extensions utilisées)" #: core/app_settings.py:247 msgid "Miscellaneous" @@ -311,8 +291,7 @@ msgstr "Redirection par défaut" #: core/app_settings.py:277 msgid "The default redirection used when no application is specified" -msgstr "" -"La redirection appliquée par défaut quand aucune application n'est spécifiée" +msgstr "La redirection appliquée par défaut quand aucune application n'est spécifiée" #: core/app_settings.py:310 msgid "Key must be either 16, 24, or 32 bytes long" @@ -425,7 +404,7 @@ msgstr "dernière connexion" #: core/models.py:70 msgid "language" -msgstr "" +msgstr "langue" #: core/models.py:73 msgid "Prefered language to display pages." @@ -449,8 +428,7 @@ msgstr "Vous ne pouvez pas supprimer votre propre compte" #: core/models.py:167 msgid "Failed to update password: LDAP module not installed" -msgstr "" -"Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé" +msgstr "Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé" #: core/models.py:225 msgid "account" @@ -508,9 +486,7 @@ msgstr "Dernières nouvelles" msgid "" "Visit the official " "weblog for more information." -msgstr "" -"Visitez le blog " -"officiel pour plus d'information." +msgstr "Visitez le blog officiel pour plus d'information." #: core/templates/core/information.html:2 core/templatetags/core_tags.py:53 msgid "Information" @@ -526,8 +502,7 @@ msgstr "Une ou plusieurs mises à jour sont disponibles!" #: core/templates/core/information.html:6 msgid "Check the following list to find the component(s) that can be updated." -msgstr "" -"Consulter la liste suivante pour trouver le(s) composant(s) concerné(s)." +msgstr "Consulter la liste suivante pour trouver le(s) composant(s) concerné(s)." #: core/templates/core/information.html:10 msgid "Applications" @@ -655,9 +630,7 @@ msgstr "Utiliseur '%s' connecté avec succès" #: core/views/auth.py:48 msgid "Your username and password didn't match. Please try again." -msgstr "" -"Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez " -"réessayer." +msgstr "Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez réessayer." #: core/views/auth.py:76 #, python-format