diff --git a/.travis.yml b/.travis.yml index 887e7d961..2464a8b36 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,7 +50,7 @@ before_script: script: - python ./tests.py - cd test_project - - coverage run --source ../modoboa manage.py test modoboa.core modoboa.lib modoboa.admin modoboa.limits modoboa.transport modoboa.relaydomains + - coverage run --source ../modoboa manage.py test modoboa.core modoboa.lib modoboa.admin modoboa.limits modoboa.transport modoboa.relaydomains modoboa.dnstools after_success: - coverage xml diff --git a/modoboa/admin/app_settings.py b/modoboa/admin/app_settings.py index d0ad679b0..8b343910a 100644 --- a/modoboa/admin/app_settings.py +++ b/modoboa/admin/app_settings.py @@ -51,6 +51,39 @@ class AdminParametersForm(param_forms.AdminParametersForm): ) ) + enable_spf_checks = YesNoField( + label=ugettext_lazy("Enable SPF checks"), + initial=True, + help_text=ugettext_lazy( + "Check if every domain has a valid SPF record" + ) + ) + + enable_dkim_checks = YesNoField( + label=ugettext_lazy("Enable DKIM checks"), + initial=True, + help_text=ugettext_lazy( + "Check if every domain with DKIM signin enabled has a valid DNS " + "record" + ) + ) + + enable_dmarc_checks = YesNoField( + label=ugettext_lazy("Enable DMARC checks"), + initial=True, + help_text=ugettext_lazy( + "Check if every domain has a valid DMARC record" + ) + ) + + enable_autoconfig_checks = YesNoField( + label=ugettext_lazy("Enable autoconfig checks"), + initial=True, + help_text=ugettext_lazy( + "Check if every domain has a valid records for autoconfiguration" + ) + ) + enable_dnsbl_checks = YesNoField( label=ugettext_lazy("Enable DNSBL checks"), initial=True, diff --git a/modoboa/admin/lib.py b/modoboa/admin/lib.py index ea5c54f4f..f2ac6f556 100644 --- a/modoboa/admin/lib.py +++ b/modoboa/admin/lib.py @@ -23,6 +23,7 @@ from modoboa.core import signals as core_signals from modoboa.core.models import User from modoboa.lib.exceptions import PermDeniedException from modoboa.parameters import tools as param_tools + from . import signals from .models import Alias, Domain, DomainAlias @@ -170,56 +171,70 @@ def import_dlist(user, row, formopts): _import_alias(user, row) -def get_domain_mx_list(domain): - """Return a list of MX IP address for domain.""" - result = [] - logger = logging.getLogger("modoboa.admin") +def get_dns_resolver(): + """Return a DNS resolver object.""" dns_server = param_tools.get_global_parameter("custom_dns_server") if dns_server: resolver = dns.resolver.Resolver() resolver.nameservers = [dns_server] else: resolver = dns.resolver + return resolver + +def get_dns_records(name, typ, resolver=None): + """Retrieve DNS records for given name and type.""" + logger = logging.getLogger("modoboa.admin") + if not resolver: + resolver = get_dns_resolver() try: - dns_answers = resolver.query(domain, "MX") + dns_answers = resolver.query(name, typ) except dns.resolver.NXDOMAIN as e: - logger.error(_("No DNS records found for %s") % domain, exc_info=e) + logger.error(_("No DNS record found for %s") % name, exc_info=e) except dns.resolver.NoAnswer as e: - logger.error(_("No MX record for %s") % domain, exc_info=e) + logger.error( + _("No %(type)s record for %(name)s") % {"type": typ, "name": name}, + exc_info=e + ) except dns.resolver.NoNameservers as e: logger.error(_("No working name servers found"), exc_info=e) except dns.resolver.Timeout as e: logger.warning( _("DNS resolution timeout, unable to query %s at the moment") % - domain, exc_info=e) + name, exc_info=e) else: - for dns_answer in dns_answers: - for rtype in ["A", "AAAA"]: + return dns_answers + return None + + +def get_domain_mx_list(domain): + """Return a list of MX IP address for domain.""" + result = [] + logger = logging.getLogger("modoboa.admin") + resolver = get_dns_resolver() + dns_answers = get_dns_records(domain, "MX", resolver) + if dns_answers is None: + return result + for dns_answer in dns_answers: + mx_domain = dns_answer.exchange.to_unicode( + omit_final_dot=True, idna_codec=IDNA_2008_UTS_46) + for rtype in ["A", "AAAA"]: + ip_answers = get_dns_records(mx_domain, rtype, resolver) + if not ip_answers: + continue + for ip_answer in ip_answers: try: - mx_domain = dns_answer.exchange.to_unicode( - omit_final_dot=True, idna_codec=IDNA_2008_UTS_46) - ip_answers = resolver.query(mx_domain, rtype) - except dns.resolver.NXDOMAIN as e: - logger.error( - _("No {type} record found for MX {mx}").format( - type=rtype, mx=domain), exc_info=e) - except dns.resolver.NoAnswer: - pass + address_smart = smart_text(ip_answer.address) + mx_ip = ipaddress.ip_address(address_smart) + except ValueError as e: + logger.warning( + _("Invalid IP address format for " + "{domain}; {addr}").format( + domain=mx_domain, + addr=smart_text(ip_answer.address) + ), exc_info=e) else: - for ip_answer in ip_answers: - try: - address_smart = smart_text(ip_answer.address) - mx_ip = ipaddress.ip_address(address_smart) - except ValueError as e: - logger.warning( - _("Invalid IP address format for " - "{domain}; {addr}").format( - domain=mx_domain, - addr=smart_text(ip_answer.address) - ), exc_info=e) - else: - result.append((mx_domain, mx_ip)) + result.append((mx_domain, mx_ip)) return result diff --git a/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po index f5621cc5e..614b7854c 100644 --- a/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" "PO-Revision-Date: 2018-08-10 11:53+0000\n" "Last-Translator: Jarda Tesar \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/tonio/" @@ -61,26 +61,74 @@ msgstr "" "zadaných adres." #: app_settings.py:55 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable SPF checks" +msgstr "Zapnout kontrolu DNS" + +#: app_settings.py:58 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid SPF record" +msgstr "Ověřit, zda má každá doména platný MX záznam" + +#: app_settings.py:63 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DKIM checks" +msgstr "Povolit MX kontroly" + +#: app_settings.py:66 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "Ověřit, zda má každá doména platný MX záznam" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DMARC checks" +msgstr "Povolit MX kontroly" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid DMARC record" +msgstr "Ověřit, zda má každá doména platný MX záznam" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable autoconfig checks" +msgstr "Povolit MX kontroly" + +#: app_settings.py:83 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "Ověřit, zda má každá doména platný MX záznam" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "Povolit DNSBL kontroly" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "Ověřit každou doménu vůči hlavním DNSBL providerům" -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "Složka pro uložení DKIM klíčů" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " @@ -90,23 +138,23 @@ msgstr "" "se, že vytvořená složka patří uživateli root a není možné z ní číst okolním " "světem." -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "Výchozí délka DKIM klíče" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "Výchozí délka v bitech pro nově vygenerované DKIM klíče." -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Schránky" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Spravovat schránky v souborovém systému" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -114,19 +162,19 @@ msgstr "" "Přejmenovat nebo odstranit schránky v souborovém systému, pokud jsou " "přejmenovány nebo odstraněny v Modoboa" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Majitel schránky" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "Účet UNIXu, který vlastní schránky v souborovém systému" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Výchozí kvóta domény" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -134,12 +182,12 @@ msgstr "" "Výchozí kvóta (v MB), které se použije u nově vytvořených domén bez uvedené " "hodnoty kvóty. Hodnota 0 znamená, že se kvóta nepoužívá." -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "Výchozí kvóta schránky" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." @@ -148,59 +196,59 @@ msgstr "" "které nemají specifikovanou vlastní hodnotu. Hodnota 0 znamená neomezenou " "kvótu." -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Automatické odstranění účtu" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "Když je schránka odstraněná, odstranit také přiřazený účet uživatele" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Automatické vytvoření domény/schránky" -#: app_settings.py:138 +#: app_settings.py:171 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." -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "Vytvořit alias, pokud je mailová schránka přejmenována" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" "Vytvořit alias použitím původní adresy, pokud je mailová schránka " "přejmenována." -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Musí se jednat o kladné číslo" -#: app_settings.py:214 +#: app_settings.py:247 msgid "Directory not found." msgstr "Složka nenalezena." -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "openssl nenalezeno, prosím ujistěte se, že je nainstalováno." -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "Definujte alespoň jednu autorizovanou síť / adresu" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Správa" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Doména" -#: constants.py:99 +#: constants.py:97 msgid "Relay domain" msgstr "Relay doména" @@ -261,7 +309,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Pouze super správci jsou oprávnění pro tento režim" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "Toto pole je vyžadováno." @@ -430,7 +478,7 @@ msgstr "" msgid "Key selector" msgstr "Identifikátor klíče" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota in MB applied to mailboxes. A value of 0 means no quota." @@ -457,7 +505,7 @@ msgstr "doménový alias" msgid "A %s with this name already exists" msgstr "%s s tímto názvem již existuje" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "Nebyly nalezeny žádné autorizované MX záznamy pro tuto doménu" @@ -465,7 +513,7 @@ msgstr "Nebyly nalezeny žádné autorizované MX záznamy pro tuto doménu" msgid "DKIM keys storage directory not configured" msgstr "Není nastavena složka pro ukládání DKIM klíčů" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "Nemůže být vyšší než kvóta domény" @@ -612,44 +660,40 @@ msgstr "Identity" msgid "Forward" msgstr "Přeposlat" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "Schránka je vyžadována" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "Nemáte oprávnění pro import domén" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "Nemáte oprávnění pri import doménových aliasů" -#: lib.py:187 tests/test_mx.py:135 -#, python-format -msgid "No DNS records found for %s" +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 +#, fuzzy, python-format +#| msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "Nenalezeny žádné DNS záznamy pro %s" -#: lib.py:189 tests/test_mx.py:138 -#, python-format -msgid "No MX record for %s" +#: lib.py:196 +#, fuzzy, python-format +#| msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "Žádný MX záznam pro %s" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "Nenalezeny žádné funkční DNS servery" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "Vypršel časový limit DNS požadavku, nelze získat %s v tuto chvíli" -#: lib.py:205 -#, fuzzy, python-brace-format -#| msgid "No DNS records found for %s" -msgid "No {type} record found for MX {mx}" -msgstr "Nenalezeny žádné DNS záznamy pro %s" - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid IP address format for %(domain)s; %(addr)s" msgid "Invalid IP address format for {domain}; {addr}" @@ -669,20 +713,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] DNSBL problém(y) pro doménu {}" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "Doména {} nemá MX záznam" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "MX záznam pro doménu {0} je neplatný: {1}" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] MX problém(y) pro doménu {}" @@ -694,7 +738,7 @@ msgstr "adresa" msgid "The alias address." msgstr "Adresa aliasu." -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "povoleno" @@ -740,53 +784,49 @@ msgstr "název" msgid "The domain name" msgstr "Doménové jméno" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "Výchozí kvóta v MB pro schránky. Hodnota 0 = žádná kvóta." - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Zatrhněte pole pro povolení této domény" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "Zapnout kontrolu DNS" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "Zaškrtněte pro zapnutí kontroly DNS pro tuto doménu" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "Povolit DKIM podepisování" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" "Pokud povolíte tuto možnost, bude vygenerován DKIM klíč pro tuto doménu." -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "Délka klíče" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Neplatný řádek" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "Nenalezeny žádný autorizovaný MX záznam pro doménu {}" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "Neplatná hodnota kvóty pro doménu '{}'" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "Neplatná výchozí hodnota kvóty schránky pro doménu '{}'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "Výchozí kvóta mailové schránky nemůže být větší než kvóta domény" @@ -824,40 +864,44 @@ msgstr "Kvóta je vyžadována" msgid "Domain quota exceeded" msgstr "Kvóta domény byla překročena" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "Výchozí kvóta v MB pro schránky. Hodnota 0 = žádná kvóta." + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "Přístup zamítnut." -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "Zobrazit spravované domény (jenom distributori a správci domén)" -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "Není povoleno pro tuto roli." -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "Musí být rovno hodnote schránky celá_adresa" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "Lokální doména {} neexistuje" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "Seznam příjemců" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "Doména nebyla nalezena." -#: serializers.py:449 +#: serializers.py:461 msgid "You don't have access to this domain." msgstr "K této doméně nemáte přístup." -#: serializers.py:457 +#: serializers.py:469 msgid "You don't have access to this mailbox." msgstr "K této schránce nemáte přístup." @@ -888,6 +932,18 @@ msgstr "Zákázáno" msgid "Awaiting checks" msgstr "Čeká na kontrolu" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "No DNS records found for %s" +msgid "No record found" +msgstr "Nenalezeny žádné DNS záznamy pro %s" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "Globální statistiky" @@ -1275,19 +1331,12 @@ msgstr "Upravit {}" msgid "Delete %s?" msgstr "Smazat %s?" -#: tests/test_mx.py:144 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No A record found for MX %(domain)s" -msgstr "Pro tuto doménu nebyl nalezen žádný MX záznam." +#: tests/test_mx.py:139 +#, python-format +msgid "No MX record for %s" +msgstr "Žádný MX záznam pro %s" -#: tests/test_mx.py:147 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No AAAA record found for MX %(domain)s" -msgstr "Pro tuto doménu nebyl nalezen žádný MX záznam." - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "Neplatný formát IP adresy pro %(domain)s; %(addr)s" @@ -1328,11 +1377,11 @@ msgstr "MX záznamy pro {}" msgid "DNSBL summary for {}" msgstr "DNSBL přehled pro {}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Nemůžete smazat vlastní doménu" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Doména smazána" @@ -1382,6 +1431,21 @@ msgstr "Importovat identity" msgid "Forward updated" msgstr "Přeposílání aktualizováno" +#, fuzzy +#~| msgid "No DNS records found for %s" +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "Nenalezeny žádné DNS záznamy pro %s" + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "Pro tuto doménu nebyl nalezen žádný MX záznam." + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "Pro tuto doménu nebyl nalezen žádný MX záznam." + #~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota." #~ msgstr "Kvóta v MB sdílená mezi schránky. Hodnota 0 = žádná kvóta." diff --git a/modoboa/admin/locale/de/LC_MESSAGES/django.po b/modoboa/admin/locale/de/LC_MESSAGES/django.po index 21c17614b..f9be7231d 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: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\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" @@ -55,49 +55,81 @@ msgid "" msgstr "" #: app_settings.py:55 -msgid "Enable DNSBL checks" +msgid "Enable SPF checks" msgstr "" #: app_settings.py:58 -msgid "Check every domain against major DNSBL providers" +msgid "Check if every domain has a valid SPF record" msgstr "" #: app_settings.py:63 -msgid "Custom DNS server" +msgid "Enable DKIM checks" msgstr "" #: app_settings.py:66 +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "" + +#: app_settings.py:72 +msgid "Enable DMARC checks" +msgstr "" + +#: app_settings.py:75 +msgid "Check if every domain has a valid DMARC record" +msgstr "" + +#: app_settings.py:80 +msgid "Enable autoconfig checks" +msgstr "" + +#: app_settings.py:83 +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "" + +#: app_settings.py:88 +msgid "Enable DNSBL checks" +msgstr "" + +#: app_settings.py:91 +msgid "Check every domain against major DNSBL providers" +msgstr "" + +#: app_settings.py:96 +msgid "Custom DNS server" +msgstr "" + +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " "world." msgstr "" -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Postfächer" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Postfächer im Dateisystem verwalten" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -105,21 +137,21 @@ msgstr "" "Postfächer auch in Dateisystem umbenennen oder entfernen wenn sie in Modoboa " "umbenannt oder entfernt werden" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Postfach-Besitzer" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "" "UID des virtuellen Benutzers, der Besitzer der Domains, Mailboxen und " "Nachrichten im Dateisystem ist." -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Standard-Domainquota" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -127,14 +159,14 @@ msgstr "" "Standardquota (in MB) für neu erstelle Domains ohne explizite Wertangabe. " "Der Wert 0 bedeutet „Kein Quota“" -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 #, fuzzy #| msgid "Default domain quota" msgid "Default mailbox quota" msgstr "Standard-Domainquota" -#: app_settings.py:122 +#: app_settings.py:155 #, fuzzy #| msgid "" #| "Default quota (in MB) applied to freshly created domains with no value " @@ -146,61 +178,61 @@ msgstr "" "Standardquota (in MB) für neu erstelle Domains ohne explizite Wertangabe. " "Der Wert 0 bedeutet „Kein Quota“" -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Automatische Konto-Entfernung" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "Beim Löschen des Postfachs auch das Konto entfernen." -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Automatische Domain- /Postfach-Erstellung" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" "Erstelle eine Domain und ein Postfach, wenn ein Konto automatisch erstellt " "wurde." -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Muss eine positive Ganzzahl sein" -#: app_settings.py:214 +#: app_settings.py:247 #, fuzzy #| msgid "Domain modified" msgid "Directory not found." msgstr "Domain verändert" -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "" -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Verwaltung" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Domain" -#: constants.py:99 +#: constants.py:97 #, fuzzy #| msgid "New domain" msgid "Relay domain" @@ -263,7 +295,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Nur Super-Administratoren dürfen diesen Modus benutzen." #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required." @@ -452,7 +484,7 @@ msgstr "" msgid "Key selector" msgstr "" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota (in MB) applied to freshly created domains with no value " @@ -485,7 +517,7 @@ msgstr "Domain-Alias" msgid "A %s with this name already exists" msgstr "Ein %s mit diesem Namen existiert bereits" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "" @@ -493,7 +525,7 @@ msgstr "" msgid "DKIM keys storage directory not configured" msgstr "" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "" @@ -647,44 +679,39 @@ msgstr "Identitäten" msgid "Forward" msgstr "Weiterleiten" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "Ein Postfach ist erforderlich" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "Sie verfügen nicht über ausreichend Rechte, um Domains zu importieren." -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "" "Sie verfügen nicht über ausreichend Rechte, um Domain Aliase zu importieren." -#: lib.py:187 tests/test_mx.py:135 +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 #, python-format -msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "" -#: lib.py:189 tests/test_mx.py:138 +#: lib.py:196 #, python-format -msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" -#: lib.py:205 -#, python-brace-format -msgid "No {type} record found for MX {mx}" -msgstr "" - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid quota value for domain '%s'" msgid "Invalid IP address format for {domain}; {addr}" @@ -704,20 +731,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -729,7 +756,7 @@ msgstr "Adresse" msgid "The alias address." msgstr "Die Alias-Adresse" -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "aktiviert" @@ -775,64 +802,54 @@ msgstr "Name" msgid "The domain name" msgstr "Name der Domain" -#: models/domain.py:44 -#, fuzzy -#| msgid "" -#| "Default quota (in MB) applied to freshly created domains with no value " -#| "specified. A value of 0 means no quota." -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" -"Standardquota (in MB) für neu erstelle Domains ohne explizite Wertangabe. " -"Der Wert 0 bedeutet „Kein Quota“" - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Auswählen, um diese Domain zu aktivieren" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "" -#: models/domain.py:56 +#: models/domain.py:48 #, fuzzy #| msgid "Check to activate this domain" msgid "Check to enable DNS checks for this domain" msgstr "Auswählen, um diese Domain zu aktivieren" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Ungültige Zeile" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "" -#: models/domain.py:320 +#: models/domain.py:337 #, fuzzy #| msgid "Invalid quota value for domain '%s'" msgid "Invalid quota value for domain '{}'" msgstr "Ungültiger Quota-Wert für Domain '%s'" -#: models/domain.py:327 +#: models/domain.py:344 #, fuzzy #| msgid "Invalid quota value for domain '%s'" msgid "Invalid default mailbox quota value for domain '{}'" msgstr "Ungültiger Quota-Wert für Domain '%s'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" @@ -872,48 +889,58 @@ msgstr "Ein Quota ist erforderlich" msgid "Domain quota exceeded" msgstr "Domain erstellt." -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +#, fuzzy +#| msgid "" +#| "Default quota (in MB) applied to freshly created domains with no value " +#| "specified. A value of 0 means no quota." +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"Standardquota (in MB) für neu erstelle Domains ohne explizite Wertangabe. " +"Der Wert 0 bedeutet „Kein Quota“" + +#: serializers.py:111 serializers.py:316 serializers.py:414 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Berechtigungen" -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "" -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "" -#: serializers.py:291 +#: serializers.py:303 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "Domain existiert nicht" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "" -#: serializers.py:400 +#: serializers.py:412 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." msgstr "Domain verändert" -#: serializers.py:449 +#: serializers.py:461 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this domain." msgstr "Der Zugriff auf diese Domain ist Ihnen nicht gestattet" -#: serializers.py:457 +#: serializers.py:469 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this mailbox." @@ -952,6 +979,18 @@ msgstr "deaktiviert" msgid "Awaiting checks" msgstr "" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "Domain modified" +msgid "No record found" +msgstr "Domain verändert" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 #, fuzzy #| msgid "Statistics" @@ -1407,17 +1446,12 @@ msgstr "" msgid "Delete %s?" msgstr "%s löschen?" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, python-format -msgid "No A record found for MX %(domain)s" +msgid "No MX record for %s" msgstr "" -#: tests/test_mx.py:147 -#, python-format -msgid "No AAAA record found for MX %(domain)s" -msgstr "" - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "" @@ -1458,11 +1492,11 @@ msgstr "" msgid "DNSBL summary for {}" msgstr "" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Sie können Ihre eigene Domain nicht löschen" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Domain gelöscht" diff --git a/modoboa/admin/locale/el_GR/LC_MESSAGES/django.po b/modoboa/admin/locale/el_GR/LC_MESSAGES/django.po index 5a20a4cf6..42f22db03 100644 --- a/modoboa/admin/locale/el_GR/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/el_GR/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" "PO-Revision-Date: 2017-10-12 08:13+0000\n" "Last-Translator: Kostas Moumouris \n" "Language-Team: Greek (Greece) (http://www.transifex.com/tonio/modoboa/" @@ -59,49 +59,97 @@ msgstr "" "είδη ορισμένες διευθύνσεις." #: app_settings.py:55 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable SPF checks" +msgstr "Ενεργοποίση ελέγχου DNS" + +#: app_settings.py:58 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid SPF record" +msgstr "Έλεγχος ότι κάθε domain έχει μια έγκυρη εγράφη MX" + +#: app_settings.py:63 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DKIM checks" +msgstr "Ενεργοποίηση ελέγχου MX" + +#: app_settings.py:66 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "Έλεγχος ότι κάθε domain έχει μια έγκυρη εγράφη MX" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DMARC checks" +msgstr "Ενεργοποίηση ελέγχου MX" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid DMARC record" +msgstr "Έλεγχος ότι κάθε domain έχει μια έγκυρη εγράφη MX" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable autoconfig checks" +msgstr "Ενεργοποίηση ελέγχου MX" + +#: app_settings.py:83 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "Έλεγχος ότι κάθε domain έχει μια έγκυρη εγράφη MX" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "Ενεργοποίηση ελέγχου DNSBL" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "Έλεγχος κάθε domain κατά κύριους DNSBL πάροχους" -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " "world." msgstr "" -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Γραμματοκιβώτια" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Χειριστείτε γραμματοκιβώτια στο σύστημα αρχείων" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -109,21 +157,21 @@ msgstr "" "Μετονομασία και διαγραφή γραμματοκιβωτίων στο σύστημα αρχείων, όταν " "μετονομάζονται ή διαγράφονται από το Medaboa " -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Ο ιδιοκτήτης των γραμματοκιβωτίων" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "" "Ο UNIX λογαριασμός που είναι ιδιοκτήτης των γραμματοκιβωτίων στο σύστημα " "αρχείων" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Προκαθορισμένο domain quota" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -131,12 +179,12 @@ msgstr "" "Προκαθορισμένο quota (σε MB) που εφαρμόζεται στα νέα domains χωρίς " "προκαθορισμένες τιμές. Μια τιμή 0 σημαίνει ότι δεν έχει quota. " -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "Προκαθορισμένο quota γραμματοκιβωτίου " -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." @@ -144,64 +192,64 @@ msgstr "" "Προκαθορισμένο quota γραμματοκιβωτίου (σε MB) που εφαρμόζεται στα νέα " "domains χωρίς προκαθορισμένες τιμές. Μια τιμή 0 σημαίνει ότι δεν έχει quota. " -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Αυτόματη αφαίρεση λογαριασμών" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "" "Όταν αφαιρείται ένα γραμματοκιβώτιο, να αφαιρείται και ο σχετικός λογαριασμός" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Αυτόματη δημιουργία domain/γραμματοκιβωτίων" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" "Δημιουργία domain και γραμματοκιβωτίου κατά την αυτόματη δημιουργία " "λογαριασμού" -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "Δημιουργία ενός ψευδώνυμου κατά τη μετονομασία ενός γραμματοκιβωτίου" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" "Δημιουργήστε ένα ψευδώνυμο χρησιμοποιώντας την παλιά διεύθυνση όταν " "μετονομάζεται ένα γραμματοκιβώτιο." -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Πρέπει να είναι θετικός ακέραιος" -#: app_settings.py:214 +#: app_settings.py:247 #, fuzzy #| msgid "Domain not found." msgid "Directory not found." msgstr "To domain δεν βρέθηκε." -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "" -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "Ορίστε τουλάχιστον μια εξουσιοδοτημένη διεύθυνση / δίκτυο" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Διαχείριση" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Domain" -#: constants.py:99 +#: constants.py:97 #, fuzzy #| msgid "New domain" msgid "Relay domain" @@ -264,7 +312,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Μόνο σε super διαχειριστές επιτρέπεται αυτή η λειτουργία. " #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "Αυτό το πεδίο απαιτείτε." @@ -435,7 +483,7 @@ msgstr "" msgid "Key selector" msgstr "" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota in MB applied to mailboxes. A value of 0 means no quota." @@ -466,7 +514,7 @@ msgstr "Ψευδώνυμα (alias) domain " msgid "A %s with this name already exists" msgstr "Το '%s' με αυτό το όνομα υπάρχει ήδη" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "Δεν υπάρχουν ΜΧ έγραφες για αυτό το domain " @@ -474,7 +522,7 @@ msgstr "Δεν υπάρχουν ΜΧ έγραφες για αυτό το domain msgid "DKIM keys storage directory not configured" msgstr "" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "Δεν μπορεί να είναι μεγαλύτερο από το domain quota." @@ -624,46 +672,40 @@ msgstr "Ταυτότητες" msgid "Forward" msgstr "Προώθηση" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "Απαιτείται γραμματοκιβώτιο" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "Δεν έχετε δικαίωμα εισαγωγής domain" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "Δεν επιτρέπεται να εισαγάγετε ψευδώνυμα στο domain." -#: lib.py:187 tests/test_mx.py:135 +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 #, fuzzy, python-format #| msgid "No MX record found for this domain." -msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. " -#: lib.py:189 tests/test_mx.py:138 +#: lib.py:196 #, fuzzy, python-format #| msgid "MX records of {}" -msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "Έγραφες MX από{}" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" -#: lib.py:205 -#, fuzzy, python-brace-format -#| msgid "No MX record found for this domain." -msgid "No {type} record found for MX {mx}" -msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. " - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid quota value for domain '{}'" msgid "Invalid IP address format for {domain}; {addr}" @@ -683,20 +725,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] DNSBL ζήτημα(τα) για το domain {}" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "Το Domain {} δεν έχει εγγραφή MX " -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "Η εγγραφή MX για το domain {0} δεν είναι έγκυρη: {1} " -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] MX ζήτημα(τα) για το domain {}" @@ -708,7 +750,7 @@ msgstr "διεύθυνση" msgid "The alias address." msgstr "Η εναλλακτική διεύθυνση." -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "ενεργοποιημένο" @@ -754,55 +796,49 @@ msgstr "όνομα" msgid "The domain name" msgstr "Το όνομα του domain" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" -"Προκαθορισμένο quota σε MB που εφαρμόζεται στα γραμματοκιβώτια. Μια τιμή 0 " -"σημαίνει ότι δεν υπάρχει quota. " - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Επιλέξτε για να ενεργοποιηθεί αυτό το domain" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "Ενεργοποίση ελέγχου DNS" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "Επιλέξτε για να ενεργοποιήσετε τους ελέγχους DNS για αυτόν το domain" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Λάθος γραμμή" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "Δεν βρέθηκε εξουσιοδοτημένη εγγραφή MX για το domain {}" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "Μη έγκυρη τιμή quota για το domain '{}'" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "" "Μη έγκυρη τιμή quota για το προεπιλεγμένο γραμματοκιβώτιο για το domain '{}'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" "Το προεπιλεγμένο quota για το γραμματοκιβώτιο δεν πρέπει να είναι μεγαλύτερο " @@ -842,44 +878,50 @@ msgstr "Ένα quota απαιτείται " msgid "Domain quota exceeded" msgstr "Υπέρβαση του domain quota" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"Προκαθορισμένο quota σε MB που εφαρμόζεται στα γραμματοκιβώτια. Μια τιμή 0 " +"σημαίνει ότι δεν υπάρχει quota. " + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "Η άδεια απορρίφθηκε." -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" "Λίστα διαχειριζόμενων domains (αφορά μόνο μεταπωλητές και διαχειριστές " "domain)" -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "Δεν επιτρέπεται για αυτόν τον ρόλο." -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "Πρέπει να είναι ίσο με την full_address του γραμματοκιβωτίου" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "Το τοπικός domain {} δεν υπάρχει" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "Λίστα παραληπτών" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "To domain δεν βρέθηκε." -#: serializers.py:449 +#: serializers.py:461 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this domain." msgstr "Δεν έχετε πρόσβαση σε αυτό το domain" -#: serializers.py:457 +#: serializers.py:469 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this mailbox." @@ -916,6 +958,18 @@ msgstr "Απενεργοποιήθηκε " msgid "Awaiting checks" msgstr "Αναμονή ελέγχων" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "No MX record found for this domain." +msgid "No record found" +msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. " + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "Γενικά στατιστικά" @@ -1310,19 +1364,13 @@ msgstr "Επεξεργασία{}" msgid "Delete %s?" msgstr "Διαγραφή %s;" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No A record found for MX %(domain)s" -msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. " +#| msgid "MX records of {}" +msgid "No MX record for %s" +msgstr "Έγραφες MX από{}" -#: tests/test_mx.py:147 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No AAAA record found for MX %(domain)s" -msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. " - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "" @@ -1361,11 +1409,11 @@ msgstr "Έγραφες MX από{}" msgid "DNSBL summary for {}" msgstr "Περίληψη DNSBL για{}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Δεν μπορείτε να σβήσετε το δικό σας domain" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Το domain διαφράφηκε" @@ -1411,6 +1459,21 @@ msgstr "Εισαγωγή ταυτοτήτων" msgid "Forward updated" msgstr "Η προώθηση ενημερώθηκε" +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. " + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. " + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. " + #~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota." #~ msgstr "" #~ "Κοινόχρηστο quota σε MB μεταξύ γραμματοκιβωτίων. Μια τιμή 0 σημαίνει ότι " diff --git a/modoboa/admin/locale/en/LC_MESSAGES/django.po b/modoboa/admin/locale/en/LC_MESSAGES/django.po index 20b9aa140..2b40edee2 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: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -52,134 +52,166 @@ msgid "" msgstr "" #: app_settings.py:55 -msgid "Enable DNSBL checks" +msgid "Enable SPF checks" msgstr "" #: app_settings.py:58 -msgid "Check every domain against major DNSBL providers" +msgid "Check if every domain has a valid SPF record" msgstr "" #: app_settings.py:63 -msgid "Custom DNS server" +msgid "Enable DKIM checks" msgstr "" #: app_settings.py:66 +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "" + +#: app_settings.py:72 +msgid "Enable DMARC checks" +msgstr "" + +#: app_settings.py:75 +msgid "Check if every domain has a valid DMARC record" +msgstr "" + +#: app_settings.py:80 +msgid "Enable autoconfig checks" +msgstr "" + +#: app_settings.py:83 +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "" + +#: app_settings.py:88 +msgid "Enable DNSBL checks" +msgstr "" + +#: app_settings.py:91 +msgid "Check every domain against major DNSBL providers" +msgstr "" + +#: app_settings.py:96 +msgid "Custom DNS server" +msgstr "" + +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " "world." msgstr "" -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" msgstr "" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." msgstr "" -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." msgstr "" -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "" -#: app_settings.py:214 +#: app_settings.py:247 msgid "Directory not found." msgstr "" -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "" -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "" -#: constants.py:99 +#: constants.py:97 msgid "Relay domain" msgstr "" @@ -236,7 +268,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "" @@ -386,7 +418,7 @@ msgstr "" msgid "Key selector" msgstr "" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 msgid "" "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " "A value of 0 means no quota." @@ -407,7 +439,7 @@ msgstr "" msgid "A %s with this name already exists" msgstr "" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "" @@ -415,7 +447,7 @@ msgstr "" msgid "DKIM keys storage directory not configured" msgstr "" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "" @@ -561,43 +593,38 @@ msgstr "" msgid "Forward" msgstr "" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "" -#: lib.py:187 tests/test_mx.py:135 +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 #, python-format -msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "" -#: lib.py:189 tests/test_mx.py:138 +#: lib.py:196 #, python-format -msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" -#: lib.py:205 -#, python-brace-format -msgid "No {type} record found for MX {mx}" -msgstr "" - -#: lib.py:214 +#: lib.py:231 #, python-brace-format msgid "Invalid IP address format for {domain}; {addr}" msgstr "" @@ -616,20 +643,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -641,7 +668,7 @@ msgstr "" msgid "The alias address." msgstr "" -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "" @@ -687,52 +714,48 @@ msgstr "" msgid "The domain name" msgstr "" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" @@ -770,40 +793,44 @@ msgstr "" msgid "Domain quota exceeded" msgstr "" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "" -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "" -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "" -#: serializers.py:449 +#: serializers.py:461 msgid "You don't have access to this domain." msgstr "" -#: serializers.py:457 +#: serializers.py:469 msgid "You don't have access to this mailbox." msgstr "" @@ -834,6 +861,16 @@ msgstr "" msgid "Awaiting checks" msgstr "" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +msgid "No record found" +msgstr "" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "" @@ -1201,17 +1238,12 @@ msgstr "" msgid "Delete %s?" msgstr "" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, python-format -msgid "No A record found for MX %(domain)s" +msgid "No MX record for %s" msgstr "" -#: tests/test_mx.py:147 -#, python-format -msgid "No AAAA record found for MX %(domain)s" -msgstr "" - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "" @@ -1250,11 +1282,11 @@ msgstr "" msgid "DNSBL summary for {}" msgstr "" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "" diff --git a/modoboa/admin/locale/es/LC_MESSAGES/django.po b/modoboa/admin/locale/es/LC_MESSAGES/django.po index 20b3ea2f1..0949420e7 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: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" "PO-Revision-Date: 2017-06-28 00:48+0000\n" "Last-Translator: Evilham \n" "Language-Team: Spanish (http://www.transifex.com/tonio/modoboa/language/" @@ -57,49 +57,97 @@ msgid "" msgstr "" #: app_settings.py:55 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable SPF checks" +msgstr "Activar comprobación de DNS" + +#: app_settings.py:58 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid SPF record" +msgstr "Compruebe que cada dominio tenga un registro MX válido" + +#: app_settings.py:63 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DKIM checks" +msgstr "Habilitar comprobación MX" + +#: app_settings.py:66 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "Compruebe que cada dominio tenga un registro MX válido" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DMARC checks" +msgstr "Habilitar comprobación MX" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid DMARC record" +msgstr "Compruebe que cada dominio tenga un registro MX válido" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable autoconfig checks" +msgstr "Habilitar comprobación MX" + +#: app_settings.py:83 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "Compruebe que cada dominio tenga un registro MX válido" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "Habilitar comprobación DNSBL" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "Compruebe cada dominio con los principales proveedores de DNSBL" -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " "world." msgstr "" -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Mailboxes" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Manejar mailboxes en el sistema de fichero" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -107,19 +155,19 @@ msgstr "" "Renombrar o eliminar mailboxes en el sistema de ficheros cuando sean " "renombrados o eliminados dentro de Modoboa" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Propietario de los mailboxes" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "Cuenta de UNIX que posee los mailboxes en el sistema de ficheros" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Cuota del dominio por defecto" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -127,12 +175,12 @@ msgstr "" "Cuota por defecto (en MB) que se aplica a la creación de nuevos dominios que " "no tuvieran un valor especificado. Un valor de 0 significa que no hay cuota." -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "Cuota de mailbox por defecto" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." @@ -140,59 +188,59 @@ msgstr "" "La cuota de mailbox por defecto (en MB) se aplica a los dominios nuevos que " "no especifican este valor. Un valor de 0 significa ningún limite." -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Elminar cuentas automáticamente" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "Cuando un mailbox es eliminado, también lo es su cuenta asociada." -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Creación automática de dominio/buzón" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "Crear un dominio y un buzón cuando se cree automáticamente una cuenta." -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Debe ser un entero positivo" -#: app_settings.py:214 +#: app_settings.py:247 #, fuzzy #| msgid "Domain not found." msgid "Directory not found." msgstr "Dominio no encontrado." -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "" -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Administración" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Dominio" -#: constants.py:99 +#: constants.py:97 #, fuzzy #| msgid "New domain" msgid "Relay domain" @@ -255,7 +303,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Sólo se permiten superadministradores para este modo" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "Este campo es obligatorio." @@ -426,7 +474,7 @@ msgstr "" msgid "Key selector" msgstr "" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota in MB applied to mailboxes. A value of 0 means no quota." @@ -455,7 +503,7 @@ msgstr "alias del dominio" msgid "A %s with this name already exists" msgstr "Ya existe un %s con ese nombre" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 #, fuzzy #| msgid "No MX record found for this domain." msgid "No authorized MX record found for this domain" @@ -465,7 +513,7 @@ msgstr "No se encontró ningún registro MX para este dominio." msgid "DKIM keys storage directory not configured" msgstr "" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "No puede superar la cuota de dominio" @@ -617,46 +665,40 @@ msgstr "Identidades" msgid "Forward" msgstr "Siguiente" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "Es obligatorio un buzón" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "No está autorizado para importar dominios" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "No está autorizado para importar alias de dominio." -#: lib.py:187 tests/test_mx.py:135 +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 #, fuzzy, python-format #| msgid "No MX record found for this domain." -msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "No se encontró ningún registro MX para este dominio." -#: lib.py:189 tests/test_mx.py:138 +#: lib.py:196 #, fuzzy, python-format #| msgid "MX records of {}" -msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "Registros MX de {}" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" -#: lib.py:205 -#, fuzzy, python-brace-format -#| msgid "No MX record found for this domain." -msgid "No {type} record found for MX {mx}" -msgstr "No se encontró ningún registro MX para este dominio." - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid quota value for domain '{}'" msgid "Invalid IP address format for {domain}; {addr}" @@ -676,20 +718,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] DNSBL problema(s) para el dominio {}" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "El dominio {} no tiene registro MX" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "El registro MX para el dominio {0} no es válido: {1}" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] MX problema(s) para el dominio {}" @@ -701,7 +743,7 @@ msgstr "dirección" msgid "The alias address." msgstr "La dirección del alias." -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "activado" @@ -747,55 +789,50 @@ msgstr "nombre" msgid "The domain name" msgstr "Nombre del dominio" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" -"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite." - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Marcar para activar este dominio" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "Activar comprobación de DNS" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "Seleccionar para activar la comprobación de DNS para este dominio" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Línea inválida" -#: models/domain.py:313 +#: models/domain.py:330 #, fuzzy #| msgid "No MX record found for this domain." msgid "No authorized MX record found for domain {}" msgstr "No se encontró ningún registro MX para este dominio." -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "Cuota inválida para dominio '{}'" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "Cuota de mailbox por defecto inválida para dominio '{}'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "La cuota de mailbox por defecto no puede superar la cuota de dominio" @@ -833,44 +870,49 @@ msgstr "Una cuota es obligatoria" msgid "Domain quota exceeded" msgstr "Cuota de dominio excedida" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite." + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "Permiso denegado." -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" "Lista de dominios administrados (sólo distribuidores y administradores de " "dominio)." -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "No estás autorizado para esta función." -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "Debe ser igual a la dirección completa del buzón" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "El dominio local {} no existe" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "Lista de destinatarios" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "Dominio no encontrado." -#: serializers.py:449 +#: serializers.py:461 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this domain." msgstr "No tienes acceso a este dominio" -#: serializers.py:457 +#: serializers.py:469 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this mailbox." @@ -907,6 +949,18 @@ msgstr "Deshabilitado" msgid "Awaiting checks" msgstr "Esperando verificación" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "No MX record found for this domain." +msgid "No record found" +msgstr "No se encontró ningún registro MX para este dominio." + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "Estadísticas globales" @@ -1303,19 +1357,13 @@ msgstr "Editar {}" msgid "Delete %s?" msgstr "¿Eliminar %s?" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No A record found for MX %(domain)s" -msgstr "No se encontró ningún registro MX para este dominio." +#| msgid "MX records of {}" +msgid "No MX record for %s" +msgstr "Registros MX de {}" -#: tests/test_mx.py:147 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No AAAA record found for MX %(domain)s" -msgstr "No se encontró ningún registro MX para este dominio." - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "" @@ -1354,11 +1402,11 @@ msgstr "Registros MX de {}" msgid "DNSBL summary for {}" msgstr "Resumen de DNSBL para {}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "No puedo eliminar su propio dominio" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Dominio eliminado" @@ -1404,6 +1452,21 @@ msgstr "Importar identidades" msgid "Forward updated" msgstr "Reenvío actualizado" +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "No se encontró ningún registro MX para este dominio." + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "No se encontró ningún registro MX para este dominio." + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "No se encontró ningún registro MX para este dominio." + #~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota." #~ msgstr "" #~ "La cuota compartida entre las mailboxes en MB. Un valor de 0 significa " diff --git a/modoboa/admin/locale/fr/LC_MESSAGES/django.po b/modoboa/admin/locale/fr/LC_MESSAGES/django.po index 2d87982c9..2e5b5ea58 100644 --- a/modoboa/admin/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/fr/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-17 13:41+0200\n" -"PO-Revision-Date: 2018-01-25 09:18+0100\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" +"PO-Revision-Date: 2018-11-20 10:36+0100\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n" "Language: fr\n" @@ -58,28 +58,60 @@ msgstr "" "adresse autorisée." #: app_settings.py:55 +msgid "Enable SPF checks" +msgstr "Activer les tests SPF" + +#: app_settings.py:58 +msgid "Check if every domain has a valid SPF record" +msgstr "Vérifie que chaque domaine a un enregistrement SPF valide" + +#: app_settings.py:63 +msgid "Enable DKIM checks" +msgstr "Activer les tests DKIM" + +#: app_settings.py:66 +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "Vérifie que chaque domaine ayant la signature DKIM activée dispose d'un enregistrement DNS valide" + +#: app_settings.py:72 +msgid "Enable DMARC checks" +msgstr "Activer les tests DMARC" + +#: app_settings.py:75 +msgid "Check if every domain has a valid DMARC record" +msgstr "Vérifie que chaque domaine a un enregistrement DMARC valide" + +#: app_settings.py:80 +msgid "Enable autoconfig checks" +msgstr "Activer les tests d'autoconfiguration" + +#: app_settings.py:83 +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "Vérifie que chaque domaine a les enregistrements nécessaires à l'autoconfiguration" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "Activer les vérifications DNSBL" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "Vérifie chaque domaine auprès des fournisseurs de DNSBL" -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "Serveur DNS personnalisé" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" "Utiliser un serveur DNS personnalisé à la place de la configuration par " "défaut du serveur" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "Répertoire de stockage des clés DKIM" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " @@ -89,23 +121,23 @@ msgstr "" "Assurez vous que ce répertoire appartient à l'utilisateur root et qu'il " "n'est pas lisible par le monde extérieur." -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "Taille par défaut d'une clé DKIM" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "Taille par défaut en octets des clés DKIM nouvellement générées." -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Boites" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Gérer les boites sur le système de fichiers" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -113,19 +145,19 @@ msgstr "" "Renommer ou supprimer les boites sur le système de fichiers quand elles sont " "renommées ou supprimées dans Modoboa" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Propriétaire des boites" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "Le compte UNIX qui possède les boites sur le système de fichiers" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Quota de domaine par défaut" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -133,12 +165,12 @@ 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é." -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "Quota par défaut pour une boîte aux lettres" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." @@ -146,64 +178,64 @@ msgstr "" "Quota par défaut pour une boîte aux lettres utilisé pour les domaines " "nouvellement créés. Une valeur à 0 signifie pas de quota." -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Suppression automatique de compte" -#: app_settings.py:131 +#: app_settings.py:164 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" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Création automatique de domaine/boite aux lettres" -#: app_settings.py:138 +#: app_settings.py:171 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." -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "Créer un alias quand une boite aux lettres est renommée" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" "Créer un alias en utilisant l'ancienne adresse quand une boite aux lettres " "est renommée." -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Doit être un entier positif" -#: app_settings.py:214 +#: app_settings.py:247 msgid "Directory not found." msgstr "Répertoire introuvable." -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "" "impossible de trouver openssl, veuillez vous assurer vous qu'il est installé." -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "Définissez au moins un réseau / une adresse autorisé" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Administration" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Domaine" -#: constants.py:99 +#: constants.py:97 msgid "Relay domain" msgstr "Domaine relais" @@ -264,7 +296,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Seuls les super administrateurs sont autorisés pour ce mode" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "Ce champ est requis." @@ -431,13 +463,13 @@ msgstr "" msgid "Key selector" msgstr "Sélecteur de clé" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 msgid "" "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " "A value of 0 means no quota." msgstr "" -"Quota partagé entre les boîtes aux lettres. Peut être exprimé en Ko, " -"Mo (défaut) ou Go. Une valeur à 0 signifie pas de quota." +"Quota partagé entre les boîtes aux lettres. Peut être exprimé en Ko, Mo " +"(défaut) ou Go. Une valeur à 0 signifie pas de quota." #: forms/domain.py:56 msgid "" @@ -456,7 +488,7 @@ msgstr "alias de domaine" msgid "A %s with this name already exists" msgstr "Un %s de ce nom existe déjà" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "Aucun enregistrement MX autorisé trouvé pour ce domaine" @@ -464,7 +496,7 @@ msgstr "Aucun enregistrement MX autorisé trouvé pour ce domaine" msgid "DKIM keys storage directory not configured" msgstr "Répertoire de stockage des clés DKIM non configuré" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "Ne peut pas être supérieur au quota du domaine" @@ -614,43 +646,38 @@ msgstr "Identités" msgid "Forward" msgstr "Transfert" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "Une boite aux lettres est requise" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "Vous n'êtes pas autorisé à importer des domaines" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "Vous n'êtes pas autorisé à importer des alias de domaine." -#: lib.py:187 tests/test_mx.py:135 +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 #, python-format -msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "Aucun enregistrement DNS trouvé pour %s." -#: lib.py:189 tests/test_mx.py:138 +#: lib.py:196 #, python-format -msgid "No MX record for %s" -msgstr "Aucun enregistrement MX trouvé pour %s" +msgid "No %(type)s record for %(name)s" +msgstr "Aucun enregistrement %(type)s trouvé pour %(name)s" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "Aucun serveur de noms fonctionnel trouvé" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "Timeout de résolution DNS, impossible de requêter %s pour l'instant" -#: lib.py:205 -#, python-brace-format -msgid "No {type} record found for MX {mx}" -msgstr "Aucun enregistrement {type} trouvé pour le MX {mx}." - -#: lib.py:214 +#: lib.py:231 #, python-brace-format msgid "Invalid IP address format for {domain}; {addr}" msgstr "Format d'adresse IP incorrect pour {domain}; {addr}" @@ -669,20 +696,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] Problème(s) DNSBL pour le domaine {}" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "Le domaine {} n'a pas d'enregistrement MX" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "Enregistrement MX invalide pour le domaine {0} : {1}" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] problème(s) de MX pour le domaine {}" @@ -694,7 +721,7 @@ msgstr "Adresse" msgid "The alias address." msgstr "L'adresse de l'alias" -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "Activé" @@ -740,57 +767,51 @@ msgstr "Nom" msgid "The domain name" msgstr "Le nom du domaine" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" -"Quota par défaut en Mo appliqué aux boîtes aux lettres. Une valeur à 0 " -"signifie pas de quota." - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Cocher pour activer ce domaine" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "Activer les tests DNS" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "Cocher pour activer les tests DNS pour ce domaine" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "Activer la signature DKIM" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" "Si vous activez cette fonctionnalité, une clé DKIM sera générée pour ce " "domain." -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "Taille de la clé" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Ligne invalide" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "Aucun enregistrement MX autorisé trouvé pour le domaine {}" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "Quota invalide pour le domaine '{}'" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "" "Quota par défaut pour une boîte aux lettres invalide pour le domaine '{}'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" "Le quota par défaut d'une boîte aux lettres ne peut pas être supérieur au " @@ -830,42 +851,48 @@ msgstr "Un quota est requis" msgid "Domain quota exceeded" msgstr "Quota du domaine dépassé" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"Quota par défaut en Mo appliqué aux boîtes aux lettres. Une valeur à 0 " +"signifie pas de quota." + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "Permission refusée." -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" "Liste des domaines administrés (revendeurs et administrateurs de domaine " "seulement)." -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "Non autorisé pour ce rôle." -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "Doit être égale au champ full_address dans mailbox" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "Le domaine local {} n'existe pas" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "Une liste de destinataire" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "Domaine introuvable." -#: serializers.py:449 +#: serializers.py:461 msgid "You don't have access to this domain." msgstr "Vous n'avez pas accès à ce domaine." -#: serializers.py:457 +#: serializers.py:469 msgid "You don't have access to this mailbox." msgstr "Vous n'avez pas accès à cette boîtes aux lettres." @@ -896,6 +923,16 @@ msgstr "Désactivés" msgid "Awaiting checks" msgstr "En attente de vérification" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +msgid "No record found" +msgstr "Aucun enregistrement trouvé" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "En attente de génération de la clé" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "Statistiques globales" @@ -1059,7 +1096,7 @@ msgstr "Afficher la clé" #: templates/admin/domain_detail.html:109 msgid "Generate new key" -msgstr "" +msgstr "Générer une nouvelle clé" #: templates/admin/domain_detail.html:111 msgid "Not generated" @@ -1286,17 +1323,12 @@ msgstr "Modifier {}" msgid "Delete %s?" msgstr "Supprimer %s ?" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, python-format -msgid "No A record found for MX %(domain)s" -msgstr "Aucun enregistrement A trouvé pour le MX %(domain)s." +msgid "No MX record for %s" +msgstr "Aucun enregistrement MX trouvé pour %s" -#: tests/test_mx.py:147 -#, python-format -msgid "No AAAA record found for MX %(domain)s" -msgstr "Aucun enregistrement AAAA trouvé pour le MX %(domain)s." - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "Format d'adresse IP incorrect pour %(domain)s; %(addr)s" @@ -1335,11 +1367,11 @@ msgstr "Enregistrements MX de {}" msgid "DNSBL summary for {}" msgstr "Résumé DNSBL pour {}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Vous ne pouvez pas supprimer votre propre domaine" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Domaine supprimé" @@ -1385,6 +1417,15 @@ msgstr "Importer des identités" msgid "Forward updated" msgstr "Transfert mis à jour" +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "Aucun enregistrement {type} trouvé pour le MX {mx}." + +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "Aucun enregistrement A trouvé pour le MX %(domain)s." + +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "Aucun enregistrement AAAA trouvé pour le MX %(domain)s." + #~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota." #~ msgstr "" #~ "Quota en Mo partagé entre les boîtes aux lettres. Une valeur à 0 signifie " diff --git a/modoboa/admin/locale/it/LC_MESSAGES/django.po b/modoboa/admin/locale/it/LC_MESSAGES/django.po index 0316b5bc5..1f99c2694 100644 --- a/modoboa/admin/locale/it/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/it/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: # Giancarlo Gaifas , 2013 # marcotrevisan , 2018 @@ -10,14 +10,15 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" "PO-Revision-Date: 2018-11-02 14:26+0000\n" "Last-Translator: marcotrevisan \n" -"Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/" +"it/)\n" +"Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: app_settings.py:24 handlers.py:265 @@ -40,9 +41,11 @@ msgstr "MX validi" #: app_settings.py:38 msgid "" -"A list of IP or network address every MX record should match. A warning will" -" be sent if a record does not respect it." -msgstr "Una lista di indirizzi IP o host a cui ciascun record MX dovrebbe appartenere. Verrà inviato un avviso se un record non la rispetta. " +"A list of IP or network address every MX record should match. A warning will " +"be sent if a record does not respect it." +msgstr "" +"Una lista di indirizzi IP o host a cui ciascun record MX dovrebbe " +"appartenere. Verrà inviato un avviso se un record non la rispetta. " #: app_settings.py:46 msgid "New domains must use authorized MX(s)" @@ -52,138 +55,200 @@ msgstr "Nuovi domini devono utilizzare MX autorizzati" msgid "" "Prevent the creation of a new domain if its MX record does not use one of " "the defined addresses." -msgstr "Impedisci la creazione di un nuovo dominio se il suo record MX non utilizza uno degli indirizzi definiti." +msgstr "" +"Impedisci la creazione di un nuovo dominio se il suo record MX non utilizza " +"uno degli indirizzi definiti." #: app_settings.py:55 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable SPF checks" +msgstr "Abilita i controlli DNS" + +#: app_settings.py:58 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid SPF record" +msgstr "Verifica che ogni dominio abbia un record MX valido" + +#: app_settings.py:63 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DKIM checks" +msgstr "Abilita i controlli MX" + +#: app_settings.py:66 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "Verifica che ogni dominio abbia un record MX valido" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DMARC checks" +msgstr "Abilita i controlli MX" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid DMARC record" +msgstr "Verifica che ogni dominio abbia un record MX valido" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable autoconfig checks" +msgstr "Abilita i controlli MX" + +#: app_settings.py:83 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "Verifica che ogni dominio abbia un record MX valido" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "Abilita i controlli DNSBL" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "Verifica ciascun dominio sui principali provider DNSBL" -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "DNS server custom" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "Usa un DNS server custom invece della configurazione a sever locale" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "Cartella di salvataggio delle chiavi DKIM" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " "world." -msgstr "Percorso assoluto della cartella dove le chiavi private DKIM verranno salvate. Assicurarsi che questa cartella sia di proprietà dell'utente root e che non sia leggibile da altri." +msgstr "" +"Percorso assoluto della cartella dove le chiavi private DKIM verranno " +"salvate. Assicurarsi che questa cartella sia di proprietà dell'utente root e " +"che non sia leggibile da altri." -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "Lunghezza predefinita delle chiavi DKIM" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "Lunghezza predefinita in numero di bit per nuove chiavi DKIM." -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Caselle di posta" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Gestione delle caselle di posta nel filsystem" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" -msgstr "Rinomina o rimuovi le caselle di posta nel filesystem quando vengono rinominate o cancellate in Modoboa " +msgstr "" +"Rinomina o rimuovi le caselle di posta nel filesystem quando vengono " +"rinominate o cancellate in Modoboa " -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Proprietario delle caselle postali" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "L'account UNIX a cui appartengono le caselle postali nel filsystem" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Quota predefinita per il domini" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." -msgstr "Quota predefinita (in MB) applicata ai nuovi domini che non la specificano. Un valore 0 implica nessuna quota." +msgstr "" +"Quota predefinita (in MB) applicata ai nuovi domini che non la specificano. " +"Un valore 0 implica nessuna quota." -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "Dimensione massima predefinita per le mailbox" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." -msgstr "Dimensione massima predefinita (in MB) applicata per nuovi domini creati senza alcun valore specificato. Un valore 0 indica nessun limite." +msgstr "" +"Dimensione massima predefinita (in MB) applicata per nuovi domini creati " +"senza alcun valore specificato. Un valore 0 indica nessun limite." -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Rimozione automatica dell'account" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" -msgstr "Quando una casella postale viene rimossa rimuovi anche l'account associato" +msgstr "" +"Quando una casella postale viene rimossa rimuovi anche l'account associato" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Creazione automatica del domini/casella di posta elettronica" -#: app_settings.py:138 -msgid "" -"Create a domain and a mailbox when an account is automatically created." -msgstr "Crea un dominio ed una casella di posta elettronica quando si crea un account utente" +#: app_settings.py:171 +msgid "Create a domain and a mailbox when an account is automatically created." +msgstr "" +"Crea un dominio ed una casella di posta elettronica quando si crea un " +"account utente" -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "Crea un alias quando una mailbox viene rinominata" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." -msgstr "Crea un alias con il vecchio indirizzo quando una mailbox viene rinominata." +msgstr "" +"Crea un alias con il vecchio indirizzo quando una mailbox viene rinominata." -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Dev'essere un intero positivo" -#: app_settings.py:214 +#: app_settings.py:247 msgid "Directory not found." msgstr "Cartella non trovata." -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "openssl non trovato, assicurarsi che sia installato." -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "Definire almeno una rete / indirizzo autorizzato" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Amministrazione" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Dominio" -#: constants.py:99 +#: constants.py:97 msgid "Relay domain" msgstr "Dominio di relay" @@ -195,7 +260,9 @@ msgstr "Nome utente" msgid "" "The user's name. Must be a valid e-mail address for simple users or " "administrators with a mailbox." -msgstr "Il nome dell'utente. Dev'essere un indirizzo e-mail per gli utenti semplici o gli amministratori che posseggono una casella" +msgstr "" +"Il nome dell'utente. Dev'essere un indirizzo e-mail per gli utenti semplici " +"o gli amministratori che posseggono una casella" #: forms/account.py:43 templates/admin/account_detail.html:29 msgid "Role" @@ -217,7 +284,9 @@ msgstr "Password casuale" msgid "" "Generate a random password. If you're updating this account and check this " "box, a new password will be generated." -msgstr "Genera una password casuale. Selezionando questa casella durante l'aggioenamento dell'account, verrà generata una nuova password." +msgstr "" +"Genera una password casuale. Selezionando questa casella durante " +"l'aggioenamento dell'account, verrà generata una nuova password." #: forms/account.py:56 msgid "Password" @@ -229,7 +298,8 @@ msgstr "Conferma" #: forms/account.py:64 msgid "Enter the same password as above, for verification." -msgstr "Inserisci la medesima password che hai inserito sopra, per la verifica." +msgstr "" +"Inserisci la medesima password che hai inserito sopra, per la verifica." #: forms/account.py:76 msgid "Enabled" @@ -240,7 +310,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Solo i super amministratori possono operare in questa modalità" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "Questo campo è obbligatorio." @@ -261,17 +331,20 @@ msgid "Create an alias using the old address" msgstr "Crea un alias con il vecchio indirizzo." #: forms/account.py:233 forms/domain.py:45 -#: templates/admin/account_detail.html:45 -#: templates/admin/domain_detail.html:49 +#: templates/admin/account_detail.html:45 templates/admin/domain_detail.html:49 msgid "Quota" msgstr "Quota" #: forms/account.py:236 msgid "" -"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a" -" custom value or use domain's default one. Leave empty to define an " -"unlimited value (not allowed for domain administrators)." -msgstr "Dimensione massima per questa mailbox, può essere espressa in KB, MB (predefinito) o GB. Definire un valore personalizzato o utilizzare quello predefinito per il dominio. Lasciare vuoto per specificare un valore non limitato (non permesso per amministratori di dominio)." +"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a " +"custom value or use domain's default one. Leave empty to define an unlimited " +"value (not allowed for domain administrators)." +msgstr "" +"Dimensione massima per questa mailbox, può essere espressa in KB, MB " +"(predefinito) o GB. Definire un valore personalizzato o utilizzare quello " +"predefinito per il dominio. Lasciare vuoto per specificare un valore non " +"limitato (non permesso per amministratori di dominio)." #: forms/account.py:246 forms/domain.py:35 #: templates/admin/domain_headers.html:4 @@ -283,7 +356,10 @@ 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 di questa mailbox. Indicare un solo indirizzo per inserimento, premere ENTER per effettuare un nuovo inserimento. Per creare un alias \"intercetta-tutto\", inserire semplicemente il nome dominio (@domain.tld)." +msgstr "" +"Alias di questa mailbox. Indicare un solo indirizzo per inserimento, premere " +"ENTER per effettuare un nuovo inserimento. Per creare un alias \"intercetta-" +"tutto\", inserire semplicemente il nome dominio (@domain.tld)." #: forms/account.py:255 msgid "Sender addresses" @@ -294,7 +370,10 @@ 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 "Indirizzo(/i) mittente aggiuntivo per questo account. L'utente potrà inviare email usando questo indirizzo/i, anche se non esiste localmente. Indicare un indirizzo per inserimento. Premere ENTER per un nuovo inserimento." +msgstr "" +"Indirizzo(/i) mittente aggiuntivo per questo account. L'utente potrà inviare " +"email usando questo indirizzo/i, anche se non esiste localmente. Indicare un " +"indirizzo per inserimento. Premere ENTER per un nuovo inserimento." #: forms/account.py:313 forms/alias.py:92 models/mailbox.py:317 msgid "Domain does not exist" @@ -357,7 +436,9 @@ msgstr "Indirizzo email" msgid "" "The alias address. To create a catchall alias, just enter the domain name " "(@domain.tld)." -msgstr "Indirizzi email alias. Per creare un alias catchall specifica il nome del dominio (@domain.tld)." +msgstr "" +"Indirizzi email alias. Per creare un alias catchall specifica il nome del " +"dominio (@domain.tld)." #: forms/alias.py:35 templates/admin/alias_detail.html:37 msgid "Recipients" @@ -367,7 +448,9 @@ msgstr "Destinatari" msgid "" "Addresses this alias will point to. Indicate only one address per input, " "press ENTER to add a new input." -msgstr "Indirizzi verso il quale questo alias punterà . Indicare un solo indirizzo per ogni ingresso , premere INVIO per aggiungere un nuovo input ." +msgstr "" +"Indirizzi verso il quale questo alias punterà . Indicare un solo indirizzo " +"per ogni ingresso , premere INVIO per aggiungere un nuovo input ." #: forms/alias.py:112 forms/alias.py:114 msgid "This field is required" @@ -385,23 +468,30 @@ msgstr "Tipo" msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." -msgstr "Alias per questo dominio. Inserire un solo nome alla volta, premere INVIO per aggiungere un nuovo elemento" +msgstr "" +"Alias per questo dominio. Inserire un solo nome alla volta, premere INVIO " +"per aggiungere un nuovo elemento" #: forms/domain.py:43 msgid "Key selector" msgstr "Selettore di chiave" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 msgid "" "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " "A value of 0 means no quota." -msgstr "Spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun limite." +msgstr "" +"Spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB " +"(predefinito) o GB. Il valore 0 indica nessun limite." #: forms/domain.py:56 msgid "" "Default quota applied to mailboxes. Can be expressed in KB, MB (default) or " "GB. A value of 0 means no quota." -msgstr "Valore predefinito per lo spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun limite." +msgstr "" +"Valore predefinito per lo spazio massimo confiviso tra le mailbox. Può " +"essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun " +"limite." #: forms/domain.py:98 handlers.py:165 msgid "domain alias" @@ -412,7 +502,7 @@ msgstr "alias del dominio" msgid "A %s with this name already exists" msgstr "Un %s con questo nome esiste già" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "Non è stato trovato alcun record MX autorizzato per questo dominio" @@ -420,9 +510,10 @@ msgstr "Non è stato trovato alcun record MX autorizzato per questo dominio" msgid "DKIM keys storage directory not configured" msgstr "Cartella di salvataggio per le chiavi DKIM non configurata." -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" -msgstr "Non può essere maggiore dello spazio massimo definito a livello di dominio" +msgstr "" +"Non può essere maggiore dello spazio massimo definito a livello di dominio" #: forms/domain.py:156 msgid "You can't define an unlimited quota." @@ -451,7 +542,9 @@ msgstr "Nome" msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." -msgstr "Il nome dell'amministratore. Non includere il nome del dominio, verrà aggiunto automaticamente." +msgstr "" +"Il nome dell'amministratore. Non includere il nome del dominio, verrà " +"aggiunto automaticamente." #: forms/domain.py:252 msgid "Generate a random password for the administrator." @@ -520,7 +613,8 @@ msgstr "Mantieni copie locali" #: forms/forward.py:26 msgid "Forward messages and store copies into your local mailbox" -msgstr "Inoltra i messaggi e memorizza le copie nella tua casella di posta locale" +msgstr "" +"Inoltra i messaggi e memorizza le copie nella tua casella di posta locale" #: forms/import_.py:15 msgid "Select a file" @@ -540,7 +634,8 @@ msgstr "Cripta le password" #: forms/import_.py:44 msgid "Check this option if passwords contained in your file are not crypted" -msgstr "Seleziona questa opzione se le password contenute nel file non sono criptate" +msgstr "" +"Seleziona questa opzione se le password contenute nel file non sono criptate" #: handlers.py:214 #, python-format @@ -566,43 +661,42 @@ msgstr "Identità" msgid "Forward" msgstr "Inoltra" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "É necessaria una casella" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "Non hai i permessi di importare domini" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "Non hai i permessi di importare gli alias dominio" -#: lib.py:187 tests/test_mx.py:135 -#, python-format -msgid "No DNS records found for %s" +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 +#, fuzzy, python-format +#| msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "Nessun record DNS trovato per %s" -#: lib.py:189 tests/test_mx.py:138 -#, python-format -msgid "No MX record for %s" +#: lib.py:196 +#, fuzzy, python-format +#| msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "Nessun record MX per %s" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "Nessun DNS server funzionante trovato" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" -msgstr "Timeout nella risoluzione DNS del nome, problema momentaneo nell'interrogare %s " +msgstr "" +"Timeout nella risoluzione DNS del nome, problema momentaneo nell'interrogare " +"%s " -#: lib.py:205 -#, python-brace-format -msgid "No {type} record found for MX {mx}" -msgstr "Nessun record {type} trovato per l'MX {mx}" - -#: lib.py:214 +#: lib.py:231 #, python-brace-format msgid "Invalid IP address format for {domain}; {addr}" msgstr "Formato di indirizzo IP non valido per {domain}; {addr}" @@ -619,22 +713,23 @@ msgstr "Lettura del file CSV utilizzando la codifica %(encoding)s" #: management/commands/subcommands/_import.py:126 #, python-format msgid "Unable to decode CSV file using %(encoding)s encoding" -msgstr "Impossibile decodificare il file CSV utilizzando la codifica %(encoding)s" +msgstr "" +"Impossibile decodificare il file CSV utilizzando la codifica %(encoding)s" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] problema(/i) DNSBL per il dominio {}" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "Il dominio {} non ha record MX" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "Il record MX per il dominio {0} non è valido: {1}" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] problema(/i) MX per il dominio {}" @@ -646,7 +741,7 @@ msgstr "indirizzo" msgid "The alias address." msgstr "Indirizzi Alias." -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "Attivato" @@ -692,54 +787,53 @@ msgstr "nome" msgid "The domain name" msgstr "Il nome del dominio" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "Spazio massimo predefinito in MB applicato alle caselle di posta. Un valore 0 indica nessun limite." - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Seleziona per attivare questo dominio" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "Abilita i controlli DNS" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "Seleziona per abilitare i controlli DNS per questo dominio" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "Abilita la firma DKIM" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." -msgstr "Se attivi questa feature, verrà generata una chiave DKIM per questo dominio." +msgstr "" +"Se attivi questa feature, verrà generata una chiave DKIM per questo dominio." -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "Lunghezza della chiave" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Riga non valida" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "Non è stato trovato alcun record MX autorizzato per il dominio {}" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "Valore di spazio massimo non valido per il dominio '{}'" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "Valore di spazio massimo predefinito non valido per il dominio '{}'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" -msgstr "Lo spazio massimo predefinito per una casella di posta non può superare quello definito a livello di dominio" +msgstr "" +"Lo spazio massimo predefinito per una casella di posta non può superare " +"quello definito a livello di dominio" #: models/domain_alias.py:39 msgid "The alias name" @@ -775,40 +869,48 @@ msgstr "È richiesta una quota" msgid "Domain quota exceeded" msgstr "Superato lo spazio massimo per il dominio" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"Spazio massimo predefinito in MB applicato alle caselle di posta. Un valore " +"0 indica nessun limite." + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "Permesso negato." -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." -msgstr "Lista dei domini amministrati (solo per rivenditori e amministratori di dominio)." +msgstr "" +"Lista dei domini amministrati (solo per rivenditori e amministratori di " +"dominio)." -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "Non consentito per questo ruolo." -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "Deve essere uguale a full_address della casella di posta" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "Il dominio locale {} non esiste" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "Una lista di destinatari" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "Dominio non trovato." -#: serializers.py:449 +#: serializers.py:461 msgid "You don't have access to this domain." msgstr "Non hai accesso a questo dominio" -#: serializers.py:457 +#: serializers.py:469 msgid "You don't have access to this mailbox." msgstr "Non hai accesso a questa casella di posta." @@ -839,6 +941,18 @@ msgstr "Disabilitato" msgid "Awaiting checks" msgstr "In attesa dei controlli" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "No DNS records found for %s" +msgid "No record found" +msgstr "Nessun record DNS trovato per %s" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "Statistiche globali" @@ -979,14 +1093,12 @@ msgstr "MB" msgid "Usage" msgstr "Utilizzo" -#: templates/admin/domain_detail.html:57 -#: templates/admin/domains_quotas.html:11 +#: templates/admin/domain_detail.html:57 templates/admin/domains_quotas.html:11 msgctxt "quota" msgid "used" msgstr "utilizzato" -#: templates/admin/domain_detail.html:58 -#: templates/admin/domains_quotas.html:12 +#: templates/admin/domain_detail.html:58 templates/admin/domains_quotas.html:12 msgid "allocated" msgstr "allocato" @@ -1096,17 +1208,31 @@ msgid "" "verify recipients

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

You can " "use a different character as separator.

" -msgstr "Fornire un file CSV le cui linee rispettino uno dei seguenti formati:
  • dominio; nome; dimensioni massime; dimensioni massime di default per casella postale; abilitato
  • alias di dominio; nome; dominio destinazione; abilitato
  • dominio di relay; nome; host destinazione; porta destinazione; servizio; abilitato; verifica destinatari

Il primo elemento di ciascuna riga è obbligatorio e deve essere uguale ad uno dei precedenti valori.

Si uò utilizzare un diverso separatore.

" +msgstr "" +"Fornire un file CSV le cui linee rispettino uno dei seguenti formati:
    " +"
  • dominio; nome; dimensioni massime; dimensioni massime di default " +"per casella postale; abilitato
  • alias di dominio; nome; " +"dominio destinazione; abilitato
  • dominio di relay; nome; " +"host destinazione; porta destinazione; servizio; abilitato; verifica " +"destinatari

Il primo elemento di ciascuna riga è " +"obbligatorio e deve essere uguale ad uno dei precedenti valori.

Si uò " +"utilizzare un diverso separatore.

" #: templates/admin/import_identities_form.html:6 msgid "" "Provide a CSV file where lines respect one of the following formats:
    " -"
  • account; loginname; password; first name; last name; enabled; group;" -" address; quota; [, domain, ...]
  • alias; address; enabled; " +"
  • account; loginname; password; first name; last name; enabled; group; " +"address; quota; [, domain, ...]
  • alias; address; enabled; " "recipient; recipient; ...

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

You can" -" use a different character as separator.

" -msgstr "Fornire un file CSV le cui linee rispettino uno dei seguenti formati:
  • account; nomeutente; password; nome; cognome; abilitato; gruppo; indirizzo; dimensioni massime; [, dominio, ...]
  • alias; indirizzo; abilitato; destinatario; destinatario; ...

Il primo elemento di ciascuna linea è obbligatorio e deve essere uguale ad uno dei precedenti valori.

Si può utilizzare un diverso separatore.

" +"is mandatory and must be equal to one of the previous values.

You can " +"use a different character as separator.

" +msgstr "" +"Fornire un file CSV le cui linee rispettino uno dei seguenti formati: " +"
  • account; nomeutente; password; nome; cognome; abilitato; gruppo; " +"indirizzo; dimensioni massime; [, dominio, ...]
  • alias; " +"indirizzo; abilitato; destinatario; destinatario; ...

Il " +"primo elemento di ciascuna linea è obbligatorio e deve essere uguale ad uno " +"dei precedenti valori.

Si può utilizzare un diverso separatore.

" #: templates/admin/importform.html:6 msgid "Help" @@ -1134,7 +1260,9 @@ msgstr "Aggiornato" #: templates/admin/mx_domain_detail.html:23 msgid "This IP does not match any of the valid MXs defined in parameters" -msgstr "Questo indirizzo IP non coincide con nessuno degli MX validi definiti nei parametri." +msgstr "" +"Questo indirizzo IP non coincide con nessuno degli MX validi definiti nei " +"parametri." #: templates/admin/mx_domain_detail.html:36 msgid "No MX record found for this domain." @@ -1145,19 +1273,26 @@ msgstr "Non è stato trovato alcun record MX per questo dominio" msgid "" "Modoboa detected that domain %(domain)s is listed by the following DNSBL " "providers:" -msgstr "Modoboa ha rilevato che il dominio %(domain)sè presente nelle liste dei seguenti provider DNSBL:" +msgstr "" +"Modoboa ha rilevato che il dominio %(domain)sè presente nelle liste dei " +"seguenti provider DNSBL:" #: 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 reputazione del dominio verrà influenzata negativamente ed è probabile che le email provenienti da esso vengano considerate spam. Dovresti contattare questi provider e chiedere loro di togliere dalla lista gli indirizzi IP identificati." +msgstr "" +"La reputazione del dominio verrà influenzata negativamente ed è probabile " +"che le email provenienti da esso vengano considerate spam. Dovresti " +"contattare questi provider e chiedere loro di togliere dalla lista gli " +"indirizzi IP identificati." #: templates/admin/notifications/domain_invalid_mx.html:3 #, python-format msgid "Modoboa detected that domain %(domain)s has no valid MX record:" -msgstr "Modoboa ha rilevato che il dominio %(domain)snon ha un record MX valido:" +msgstr "" +"Modoboa ha rilevato che il dominio %(domain)snon ha un record MX valido:" #: templates/admin/searchform.html:6 msgid "Search" @@ -1208,17 +1343,12 @@ msgstr "Modifica {}" msgid "Delete %s?" msgstr "Eliminare %s?" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, python-format -msgid "No A record found for MX %(domain)s" -msgstr "Nessun record A trovato per il record MX%(domain)s" +msgid "No MX record for %s" +msgstr "Nessun record MX per %s" -#: tests/test_mx.py:147 -#, python-format -msgid "No AAAA record found for MX %(domain)s" -msgstr "Nessun record AAAA trovato per il record MX %(domain)s" - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "Formato non valido per l'indirizzo IP %(domain)s;%(addr)s" @@ -1257,11 +1387,11 @@ msgstr "Record MX di {}" msgid "DNSBL summary for {}" msgstr "Sommario DNSBL per {}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Non puoi cancellare il tuo dominio" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Dominio cancellato" @@ -1306,3 +1436,12 @@ msgstr "Identità di importazione" #: views/user.py:40 msgid "Forward updated" msgstr "Inoltro aggiornato" + +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "Nessun record {type} trovato per l'MX {mx}" + +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "Nessun record A trovato per il record MX%(domain)s" + +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "Nessun record AAAA trovato per il record MX %(domain)s" diff --git a/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po index 6b7bad750..41f553ed9 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: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\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/" @@ -54,49 +54,93 @@ msgid "" msgstr "" #: app_settings.py:55 -msgid "Enable DNSBL checks" +#, fuzzy +#| msgid "Enable DNSBL checks" +msgid "Enable SPF checks" msgstr "DNSBL チェックを有効にする" #: app_settings.py:58 -msgid "Check every domain against major DNSBL providers" +#, fuzzy +#| msgid "Check every domain against major DNSBL providers" +msgid "Check if every domain has a valid SPF record" msgstr "すべてのドメインを 主な DNSBL プロバイダーでチェックする" #: app_settings.py:63 +#, fuzzy +#| msgid "Enable DNSBL checks" +msgid "Enable DKIM checks" +msgstr "DNSBL チェックを有効にする" + +#: app_settings.py:66 +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable DNSBL checks" +msgid "Enable DMARC checks" +msgstr "DNSBL チェックを有効にする" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check every domain against major DNSBL providers" +msgid "Check if every domain has a valid DMARC record" +msgstr "すべてのドメインを 主な DNSBL プロバイダーでチェックする" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable DNSBL checks" +msgid "Enable autoconfig checks" +msgstr "DNSBL チェックを有効にする" + +#: app_settings.py:83 +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "" + +#: app_settings.py:88 +msgid "Enable DNSBL checks" +msgstr "DNSBL チェックを有効にする" + +#: app_settings.py:91 +msgid "Check every domain against major DNSBL providers" +msgstr "すべてのドメインを 主な DNSBL プロバイダーでチェックする" + +#: app_settings.py:96 msgid "Custom DNS server" msgstr "" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " "world." msgstr "" -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "メールボックス" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "ファイルシステムのメールボックスを操作する" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -104,19 +148,19 @@ msgstr "" "Modoboa で、メールボックスの名前の変更もしくは、削除したとき、ファイルシステ" "ム上のメールボックスも、名前の変更もしくは削除する。" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "メールボックス所有者" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "ファイルシステム上のメールボックスを所有するUNIXアカウント" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "デフォルトドメインクォータ" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -125,14 +169,14 @@ msgstr "" "用されます。\n" "値が0の場合は、クォータ制限はありません。" -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 #, fuzzy #| msgid "Default domain quota" msgid "Default mailbox quota" msgstr "デフォルトドメインクォータ" -#: app_settings.py:122 +#: app_settings.py:155 #, fuzzy #| msgid "" #| "Default quota (in MB) applied to freshly created domains with no value " @@ -145,60 +189,60 @@ msgstr "" "用されます。\n" "値が0の場合は、クォータ制限はありません。" -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "アカウントの自動削除" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "メールボックスが削除されたとき、関連するアカウントも削除します" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "ドメインとメールボックスを自動作成" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" "アカウントが自動的に作成されたとき、ドメインとメールボックを作成します。" -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "正の整数でなければいけません" -#: app_settings.py:214 +#: app_settings.py:247 #, fuzzy #| msgid "Domain not found." msgid "Directory not found." msgstr "ドメインが見つかりません" -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "" -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "管理" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "ドメイン" -#: constants.py:99 +#: constants.py:97 #, fuzzy #| msgid "New domain" msgid "Relay domain" @@ -262,7 +306,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "スーパー管理者だけが、このモードのために許可されています。" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required." @@ -444,7 +488,7 @@ msgstr "" msgid "Key selector" msgstr "" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota (in MB) applied to freshly created domains with no value " @@ -479,7 +523,7 @@ msgstr "ドメインエイリアス" msgid "A %s with this name already exists" msgstr " %s という名前は、すでに存在しています" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 #, fuzzy #| msgid "No information available for this domain." msgid "No authorized MX record found for this domain" @@ -489,7 +533,7 @@ msgstr "このドメインに関する情報がありません。" msgid "DKIM keys storage directory not configured" msgstr "" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "" @@ -643,46 +687,40 @@ msgstr "ID" msgid "Forward" msgstr "転送先" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "メールボックスは必須です" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "ドメインのインポートは許可されていません" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "ドメインエイリアスのインポートは許可されていません" -#: lib.py:187 tests/test_mx.py:135 +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 #, fuzzy, python-format #| msgid "No information available for this domain." -msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "このドメインに関する情報がありません。" -#: lib.py:189 tests/test_mx.py:138 +#: lib.py:196 #, fuzzy, python-format #| msgid "No information available for this domain." -msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "このドメインに関する情報がありません。" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" -#: lib.py:205 -#, fuzzy, python-brace-format -#| msgid "No information available for this domain." -msgid "No {type} record found for MX {mx}" -msgstr "このドメインに関する情報がありません。" - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid quota value for domain '%s'" msgid "Invalid IP address format for {domain}; {addr}" @@ -702,20 +740,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] ドメイン {} の DNSBL結果" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -727,7 +765,7 @@ msgstr "アドレス" msgid "The alias address." msgstr "エイリアスアドレス" -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "有効" @@ -773,69 +811,58 @@ msgstr "名前" msgid "The domain name" msgstr "ドメイン名" -#: models/domain.py:44 -#, fuzzy -#| msgid "" -#| "Default quota (in MB) applied to freshly created domains with no value " -#| "specified. A value of 0 means no quota." -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" -"デフォルトのクォータ (MB) が、値を指定しないで、新しく作成されたドメインに適" -"用されます。\n" -"値が0の場合は、クォータ制限はありません。" - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "このドメインをアクティブするために確認してください" -#: models/domain.py:55 +#: models/domain.py:47 #, fuzzy #| msgid "Enable DNSBL checks" msgid "Enable DNS checks" msgstr "DNSBL チェックを有効にする" -#: models/domain.py:56 +#: models/domain.py:48 #, fuzzy #| msgid "Check to activate this domain" msgid "Check to enable DNS checks for this domain" msgstr "このドメインをアクティブするために確認してください" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "不正な行" -#: models/domain.py:313 +#: models/domain.py:330 #, fuzzy #| msgid "No information available for this domain." msgid "No authorized MX record found for domain {}" msgstr "このドメインに関する情報がありません。" -#: models/domain.py:320 +#: models/domain.py:337 #, fuzzy #| msgid "Invalid quota value for domain '%s'" msgid "Invalid quota value for domain '{}'" msgstr "不正なドメイン %s のクォータ値" -#: models/domain.py:327 +#: models/domain.py:344 #, fuzzy #| msgid "Invalid quota value for domain '%s'" msgid "Invalid default mailbox quota value for domain '{}'" msgstr "不正なドメイン %s のクォータ値" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" @@ -875,42 +902,53 @@ msgstr "クォータは必須です" msgid "Domain quota exceeded" msgstr "ドメインが作成されました" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +#, fuzzy +#| msgid "" +#| "Default quota (in MB) applied to freshly created domains with no value " +#| "specified. A value of 0 means no quota." +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"デフォルトのクォータ (MB) が、値を指定しないで、新しく作成されたドメインに適" +"用されます。\n" +"値が0の場合は、クォータ制限はありません。" + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "アクセス拒否" -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "管理しているドメインのリスト (リセーラーとドメイン管理者のみ)" -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "このロールには許可されていません" -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "メールボックス full_address に等しくなければなりません" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "ローカルドメイン {} は、存在しません" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "ドメインが見つかりません" -#: serializers.py:449 +#: serializers.py:461 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this domain." msgstr "このドメインにアクセスする権限がありません" -#: serializers.py:457 +#: serializers.py:469 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this mailbox." @@ -949,6 +987,18 @@ msgstr "無効化" msgid "Awaiting checks" msgstr "" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "No information available for this domain." +msgid "No record found" +msgstr "このドメインに関する情報がありません。" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 #, fuzzy #| msgid "Statistics" @@ -1373,19 +1423,13 @@ msgstr "{} を編集" msgid "Delete %s?" msgstr "%s を削除しますか?" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, fuzzy, python-format #| msgid "No information available for this domain." -msgid "No A record found for MX %(domain)s" +msgid "No MX record for %s" msgstr "このドメインに関する情報がありません。" -#: tests/test_mx.py:147 -#, fuzzy, python-format -#| msgid "No information available for this domain." -msgid "No AAAA record found for MX %(domain)s" -msgstr "このドメインに関する情報がありません。" - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "" @@ -1423,11 +1467,11 @@ msgstr "" msgid "DNSBL summary for {}" msgstr "{} のDNSBL 要約" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "あなた自身のドメインは削除できません" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "ドメインを削除しました" @@ -1471,6 +1515,21 @@ msgstr "ID をインポート" msgid "Forward updated" msgstr "転送先が更新されました" +#, fuzzy +#~| msgid "No information available for this domain." +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "このドメインに関する情報がありません。" + +#, fuzzy +#~| msgid "No information available for this domain." +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "このドメインに関する情報がありません。" + +#, fuzzy +#~| msgid "No information available for this domain." +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "このドメインに関する情報がありません。" + #, fuzzy #~| msgid "" #~| "Default quota (in MB) applied to freshly created domains with no value " diff --git a/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po index c748dfc9d..ce4b2d0b7 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: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\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/" @@ -55,49 +55,97 @@ msgid "" msgstr "" #: app_settings.py:55 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable SPF checks" +msgstr "Activeer DNS checks" + +#: app_settings.py:58 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid SPF record" +msgstr "Controlleer of ieder domein een valide MX record heeft" + +#: app_settings.py:63 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable DKIM checks" +msgstr "Activeer DNS checks" + +#: app_settings.py:66 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "Controlleer of ieder domein een valide MX record heeft" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable DMARC checks" +msgstr "Activeer DNS checks" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid DMARC record" +msgstr "Controlleer of ieder domein een valide MX record heeft" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable autoconfig checks" +msgstr "Activeer DNS checks" + +#: app_settings.py:83 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "Controlleer of ieder domein een valide MX record heeft" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "Zet DNSBL controle aan" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "Controlleer ieder domein bij de grote DNSBL providers" -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " "world." msgstr "" -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Mailboxen" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Pas mailboxen op het bestandssysteem aan" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -105,20 +153,20 @@ msgstr "" "Hernoem of verwijder mailboxen op het bestandssysteem wanner ze hernoemd of " "verwijderd worden in Modoboa." -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Eigenaar van de mailboxen" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "" "De UNIX account die de rechten heeft tot de mailboxen op het bestandssysteem" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Standaard domein quota" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -126,14 +174,14 @@ msgstr "" "Standaard quota (in MB) om op nieuw aangemaakte domeinen zonder waarde toe " "te passen. Een waarde van 0 betekend geen quota." -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 #, fuzzy #| msgid "Default domain quota" msgid "Default mailbox quota" msgstr "Standaard domein quota" -#: app_settings.py:122 +#: app_settings.py:155 #, fuzzy #| msgid "" #| "Default quota (in MB) applied to freshly created domains with no value " @@ -145,62 +193,62 @@ msgstr "" "Standaard quota (in MB) om op nieuw aangemaakte domeinen zonder waarde toe " "te passen. Een waarde van 0 betekend geen quota." -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Automatish een account verwijderen" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "" "Als een mailbox word verwijderd, verwijder dan ook de bijbehorende account" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Domein en mailbox automatisch aanmaken" -#: app_settings.py:138 +#: app_settings.py:171 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." -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "Maak een alias aan wanneer een mailbox word hernoemd" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" "Maak een alias aan met het oude adres wanneer een mailbox word hernoemd" -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Dit moet een positive integer zijn." -#: app_settings.py:214 +#: app_settings.py:247 #, fuzzy #| msgid "Domain modified" msgid "Directory not found." msgstr "Domein gewijzigd" -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "" -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Administratie" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Domein" -#: constants.py:99 +#: constants.py:97 #, fuzzy #| msgid "New domain" msgid "Relay domain" @@ -263,7 +311,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Alleen super administrators mogen dit" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required." @@ -459,7 +507,7 @@ msgstr "" msgid "Key selector" msgstr "" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota (in MB) applied to freshly created domains with no value " @@ -492,7 +540,7 @@ msgstr "domein alias" msgid "A %s with this name already exists" msgstr "Een %s met deze naam bestaat al" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "" @@ -500,7 +548,7 @@ msgstr "" msgid "DKIM keys storage directory not configured" msgstr "" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "" @@ -654,48 +702,42 @@ msgstr "Identiteiten" msgid "Forward" msgstr "Doorsturen" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "Een mailbox is benodigd" -#: lib.py:131 +#: lib.py:132 #, fuzzy #| msgid "You can't delete your own domain" msgid "You are not allowed to import domains" msgstr "U kunt uw eigen domein niet verwijderen" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "U bent niet gemachtigd om domein aliassen te importeren." -#: lib.py:187 tests/test_mx.py:135 +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 #, fuzzy, python-format #| msgid "No MX record found for this domain." -msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "Geen mx record gevonden voor dit domein" -#: lib.py:189 tests/test_mx.py:138 +#: lib.py:196 #, fuzzy, python-format #| msgid "No MX record found for this domain." -msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "Geen mx record gevonden voor dit domein" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" -#: lib.py:205 -#, fuzzy, python-brace-format -#| msgid "No MX record found for this domain." -msgid "No {type} record found for MX {mx}" -msgstr "Geen mx record gevonden voor dit domein" - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid quota value for domain '%s'" msgid "Invalid IP address format for {domain}; {addr}" @@ -715,20 +757,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] DNSBL problemen voor domein {}" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "Domein {} heeft geen MX record(s)" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "MX record voor domein {0} is ongeldig: {1}" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] MX probleem met domein {}" @@ -742,7 +784,7 @@ msgstr "adres" msgid "The alias address." msgstr "De alias naam" -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "actief" @@ -792,64 +834,54 @@ msgstr "naam" msgid "The domain name" msgstr "De domeinnaam" -#: models/domain.py:44 -#, fuzzy -#| msgid "" -#| "Default quota (in MB) applied to freshly created domains with no value " -#| "specified. A value of 0 means no quota." -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" -"Standaard quota (in MB) om op nieuw aangemaakte domeinen zonder waarde toe " -"te passen. Een waarde van 0 betekend geen quota." - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Aanvinken om dit domein te activeren" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "Activeer DNS checks" -#: models/domain.py:56 +#: models/domain.py:48 #, fuzzy #| msgid "Check to activate this domain" msgid "Check to enable DNS checks for this domain" msgstr "Aanvinken om dit domein te activeren" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Verkeerde regel" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "" -#: models/domain.py:320 +#: models/domain.py:337 #, fuzzy #| msgid "Invalid quota value for domain '%s'" msgid "Invalid quota value for domain '{}'" msgstr "Verkeerde quota waarde voor domein '%s'" -#: models/domain.py:327 +#: models/domain.py:344 #, fuzzy #| msgid "Invalid quota value for domain '%s'" msgid "Invalid default mailbox quota value for domain '{}'" msgstr "Verkeerde quota waarde voor domein '%s'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" @@ -889,48 +921,58 @@ msgstr "Een quota is vereist" msgid "Domain quota exceeded" msgstr "Domein aangemaakt" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +#, fuzzy +#| msgid "" +#| "Default quota (in MB) applied to freshly created domains with no value " +#| "specified. A value of 0 means no quota." +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"Standaard quota (in MB) om op nieuw aangemaakte domeinen zonder waarde toe " +"te passen. Een waarde van 0 betekend geen quota." + +#: serializers.py:111 serializers.py:316 serializers.py:414 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Toegang geweigerd" -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "Niet toegestaan met deze rol" -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "Moet gelijk zijn aan het volledige e-mail adres" -#: serializers.py:291 +#: serializers.py:303 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "Domein bestaat niet" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "Een lijst van ontvangers" -#: serializers.py:400 +#: serializers.py:412 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." msgstr "Domein gewijzigd" -#: serializers.py:449 +#: serializers.py:461 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this domain." msgstr "U heeft geen toegang tot dit domein" -#: serializers.py:457 +#: serializers.py:469 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this mailbox." @@ -969,6 +1011,18 @@ msgstr "uitgeschakeld" msgid "Awaiting checks" msgstr "Controles afwachten" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "No MX record found for this domain." +msgid "No record found" +msgstr "Geen mx record gevonden voor dit domein" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 #, fuzzy #| msgid "Statistics" @@ -1430,19 +1484,13 @@ msgstr "" msgid "Delete %s?" msgstr "Verwijder %s?" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, fuzzy, python-format #| msgid "No MX record found for this domain." -msgid "No A record found for MX %(domain)s" +msgid "No MX record for %s" msgstr "Geen mx record gevonden voor dit domein" -#: tests/test_mx.py:147 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No AAAA record found for MX %(domain)s" -msgstr "Geen mx record gevonden voor dit domein" - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "" @@ -1483,11 +1531,11 @@ msgstr "" msgid "DNSBL summary for {}" msgstr "DNSBL samenvatting voor {}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "U kunt uw eigen domein niet verwijderen" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Domeinen verwijderd" @@ -1533,6 +1581,21 @@ msgstr "Identiteiten importeren" msgid "Forward updated" msgstr "Doorstuuradres aangepast" +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "Geen mx record gevonden voor dit domein" + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "Geen mx record gevonden voor dit domein" + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "Geen mx record gevonden voor dit domein" + #, fuzzy #~| msgid "" #~| "Default quota (in MB) applied to freshly created domains with no value " diff --git a/modoboa/admin/locale/pl_PL/LC_MESSAGES/django.po b/modoboa/admin/locale/pl_PL/LC_MESSAGES/django.po index cdb781d6f..d0f9583aa 100644 --- a/modoboa/admin/locale/pl_PL/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/pl_PL/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" "PO-Revision-Date: 2017-12-07 08:37+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: Polish (Poland) (http://www.transifex.com/tonio/modoboa/" @@ -63,49 +63,97 @@ msgstr "" "zdefiniowanych adresów." #: app_settings.py:55 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable SPF checks" +msgstr "Aktywuj sprawdzanie rekordów DNS" + +#: app_settings.py:58 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid SPF record" +msgstr "Sprawdź czy dla domeny zdefiniowano poprawny rekord MX" + +#: app_settings.py:63 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DKIM checks" +msgstr "Włącz sprawdzanie rekordów MX" + +#: app_settings.py:66 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "Sprawdź czy dla domeny zdefiniowano poprawny rekord MX" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DMARC checks" +msgstr "Włącz sprawdzanie rekordów MX" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid DMARC record" +msgstr "Sprawdź czy dla domeny zdefiniowano poprawny rekord MX" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable autoconfig checks" +msgstr "Włącz sprawdzanie rekordów MX" + +#: app_settings.py:83 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "Sprawdź czy dla domeny zdefiniowano poprawny rekord MX" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "Włącz sprawdzanie DNSBL" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "Sprawdź każdą domenę po kątem głównych providerów DNSBL" -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " "world." msgstr "" -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Skrzynki pocztowe" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Przechowuj skrzynka na filesystemie" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -113,19 +161,19 @@ msgstr "" "Zmieniaj lub usuwaj skrzynki na filesystemie jeśli zostały zmodyfikowane lub " "usuniętę przez Modoboa" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Właściciel skrzynek" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "Konto UNIX właściciela skrzynek na filesystemie" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Domyślne ograniczenie dla domeny" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -133,12 +181,12 @@ msgstr "" "Domyślne ograniczenie (w MB) dla nowych domen, gdy nie zostało podane. (0 - " "brak ograniczenia)" -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "Domyślna przestrzeń dla konta pocztowego" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." @@ -146,59 +194,59 @@ msgstr "" "Domyślna pojemność skrzynki (w MB) dla nowo tworzonych domen bez podanej " "wartości. 0 oznacza brak limitu." -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Automatyczne usuwanie konta" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "Gdy usuwana jest skrzynka usuń powizane z nią konto" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Automatyczne tworzenie domeny/skrzynki" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "Utwórz domenę i skrzynkę gdy tworzone jest konto" -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "Utwórz alias podczas zmiany nazwy skrzynki" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "Utwórz alias używając starego adresu podczas zmiany nazwy skrzynki." -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Musi być liczbą całkowitą dodatnią" -#: app_settings.py:214 +#: app_settings.py:247 #, fuzzy #| msgid "Domain not found." msgid "Directory not found." msgstr "Domena nie znaleziona." -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "" -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "Zdefiniuj przynajmniej jedną autoryzowaną sieć / adres" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Administracja" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Domena" -#: constants.py:99 +#: constants.py:97 msgid "Relay domain" msgstr "" @@ -259,7 +307,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Tylko super administratorzy mogą korzystać z tej opcji" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "To pole jest wymagane" @@ -428,7 +476,7 @@ msgstr "" msgid "Key selector" msgstr "" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota in MB applied to mailboxes. A value of 0 means no quota." @@ -459,7 +507,7 @@ msgstr "alias domeny" msgid "A %s with this name already exists" msgstr "Nazwa %s już istnieje" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "Nie znaleziono autoryzowanych dla tej domeny rekordów MX " @@ -467,7 +515,7 @@ msgstr "Nie znaleziono autoryzowanych dla tej domeny rekordów MX " msgid "DKIM keys storage directory not configured" msgstr "" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "Nie może być wyższa niż limit domeny" @@ -615,46 +663,40 @@ msgstr "Tożsamości" msgid "Forward" msgstr "Przekaż" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "Skrzynka jest obowiązkowa" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "Nie masz uprawnień do importowania domen" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "Nie masz uprawnień do importowania aliasów." -#: lib.py:187 tests/test_mx.py:135 +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 #, fuzzy, python-format #| msgid "No MX record found for this domain." -msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "Nie znaleziono rekordu MX dla tej domeny" -#: lib.py:189 tests/test_mx.py:138 +#: lib.py:196 #, fuzzy, python-format #| msgid "MX records of {}" -msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "Rekordy MX dla {}" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" -#: lib.py:205 -#, fuzzy, python-brace-format -#| msgid "No MX record found for this domain." -msgid "No {type} record found for MX {mx}" -msgstr "Nie znaleziono rekordu MX dla tej domeny" - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid quota value for domain '{}'" msgid "Invalid IP address format for {domain}; {addr}" @@ -674,20 +716,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] DNSBL problem(y) dla domeny {}" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "Domena {} nie ma zdefiniowanego rekordu MX" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "Rekord MX dla domeny {0} jest niepoprawny: {1}" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] Wykryto problem(y) z MX dla domeny {}" @@ -699,7 +741,7 @@ msgstr "adres" msgid "The alias address." msgstr "Adres aliasu." -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "włączone" @@ -745,54 +787,48 @@ msgstr "nazwa" msgid "The domain name" msgstr "Nazwa domeny" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" -"Domyślne ograniczenie (w MB) dla nowych skrzynek. Wartość 0 oznacza brak " -"ograniczenia." - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Zaznacz, aby aktywować domenę" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "Aktywuj sprawdzanie rekordów DNS" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "Zaznacz aby aktywować sprawdzanie DNS dla tej domeny" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Niepoprawna linia" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "Nie znaleziono autoryzowanego rekordu MX dla domeny {}" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "Niepoprawna wartość przydziału (quoty) dla domeny {}" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "Niepoprawna wartość domyślna przydziału (quoty) dla domeny '{}'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" "Domyślna wartość przydziału (quota) nie może być wyższa niż przydział domeny" @@ -831,43 +867,49 @@ msgstr "Limit jest wymagany" msgid "Domain quota exceeded" msgstr "Przekroczono limit przydziału" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"Domyślne ograniczenie (w MB) dla nowych skrzynek. Wartość 0 oznacza brak " +"ograniczenia." + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "Odmowa dostępu" -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" "Lista administratorów domen (tylko resellerów i administratorów domen)." -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "Niedozwolone dla tej roli." -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "Musi być równe z full_address skrzynki." -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "Lokalna domena {} nie istnieje" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "Lista odbiorców" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "Domena nie znaleziona." -#: serializers.py:449 +#: serializers.py:461 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this domain." msgstr "Nie masz uprawnień dla tej domeny" -#: serializers.py:457 +#: serializers.py:469 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this mailbox." @@ -904,6 +946,18 @@ msgstr "Wyłączony" msgid "Awaiting checks" msgstr "Czeka na sprawdzenie" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "No MX record found for this domain." +msgid "No record found" +msgstr "Nie znaleziono rekordu MX dla tej domeny" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "Statystyki globalne" @@ -1298,19 +1352,13 @@ msgstr "Edytuj {}" msgid "Delete %s?" msgstr "Usunąć %s?" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No A record found for MX %(domain)s" -msgstr "Nie znaleziono rekordu MX dla tej domeny" +#| msgid "MX records of {}" +msgid "No MX record for %s" +msgstr "Rekordy MX dla {}" -#: tests/test_mx.py:147 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No AAAA record found for MX %(domain)s" -msgstr "Nie znaleziono rekordu MX dla tej domeny" - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "" @@ -1351,11 +1399,11 @@ msgstr "Rekordy MX dla {}" msgid "DNSBL summary for {}" msgstr "DNSBL podsumowanie dla {}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Nie możesz usunąć swoje własnej domeny" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Domena usunięta" @@ -1405,6 +1453,21 @@ msgstr "Importuj tożsamości" msgid "Forward updated" msgstr "Reguła przekazywania zmodyfikowana" +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "Nie znaleziono rekordu MX dla tej domeny" + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "Nie znaleziono rekordu MX dla tej domeny" + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "Nie znaleziono rekordu MX dla tej domeny" + #~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota." #~ msgstr "" #~ "Przydział w MB dzielony między skrzynki. Wartość 0 oznacza brak limitu." diff --git a/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po index a9850cd27..182ed14a4 100644 --- a/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" "PO-Revision-Date: 2018-09-25 03:25+0000\n" "Last-Translator: Rafael Barretto \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/" @@ -65,26 +65,74 @@ msgstr "" "endereços definidos." #: app_settings.py:55 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable SPF checks" +msgstr "Habilitar verificação DNS" + +#: app_settings.py:58 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid SPF record" +msgstr "Checar se todo domínio tem um registro MX válido" + +#: app_settings.py:63 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DKIM checks" +msgstr "Habilitar checagens MX" + +#: app_settings.py:66 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "Checar se todo domínio tem um registro MX válido" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DMARC checks" +msgstr "Habilitar checagens MX" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid DMARC record" +msgstr "Checar se todo domínio tem um registro MX válido" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable autoconfig checks" +msgstr "Habilitar checagens MX" + +#: app_settings.py:83 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "Checar se todo domínio tem um registro MX válido" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "Habilitar checagens DNSBL" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "Checar cada domínio em relação aos principais provedores DNSBL." -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "Diretório de armazenamento de chaves DKIM" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " @@ -94,23 +142,23 @@ msgstr "" "armazenadas. Certifique-se de que este diretório pertença ao usuário root e " "não seja legível pelo mundo externo." -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "Comprimento padrão da chave DKIM" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "Comprimento padrão em bits para chaves DKIM recém-geradas." -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Caixas de correios" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Tratar caixas de mensagens no sistema de arquivos." -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -118,19 +166,19 @@ msgstr "" "Renomeia ou remove caixas de mensagens do sistema de arquivos quando elas " "são renomeadas ou removidas dentro do Modoboa" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Proprietário de caixas de mensagens" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "A conta UNIX que possui caixas de mensagens no sistema de arquivos" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Cota padrão do domínio" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -138,12 +186,12 @@ msgstr "" "Cota padrão (em MB) aplicada para novos domínios sem nenhum valor " "especificado. Um valor de 0 indica que não existe cota." -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "Cota padrão da caixa de correio" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." @@ -151,62 +199,62 @@ msgstr "" "Cota padrão para caixas de correio (em MB) aplicadas a domínios recém " "criados sem nenhum valor especificado. Um valor de 0 significa sem cota." -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Remoção automática da conta" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "" "Quando uma caixa de correio é removida, também remove a conta associada" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Criação automática de domínio/caixa de correio" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" "Criar um domínio e uma caixa de correio quando uma conta é automaticamente " "criada." -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "Criar um alias quando uma caixa de correio é renomeada" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" "Crie um alias usando o endereço antigo quando uma caixa de correio for " "renomeada." -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Deve ser um inteiro positivo" -#: app_settings.py:214 +#: app_settings.py:247 msgid "Directory not found." msgstr "Diretório não encontrado." -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "openssl não encontrado, por favor, verifique se ele está instalado." -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "Defina pelo menos uma rede ou endereço autorizado" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Administração" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Domínio" -#: constants.py:99 +#: constants.py:97 msgid "Relay domain" msgstr "Domínio de relay" @@ -267,7 +315,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Apenas super administradores estão liberados para este modo" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "Este campo é obrigatório." @@ -438,7 +486,7 @@ msgstr "" msgid "Key selector" msgstr "" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota in MB applied to mailboxes. A value of 0 means no quota." @@ -469,7 +517,7 @@ msgstr "alias de domínio" msgid "A %s with this name already exists" msgstr "Já existe um %s com este nome" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "" @@ -477,7 +525,7 @@ msgstr "" msgid "DKIM keys storage directory not configured" msgstr "" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "Não pode ser maior do que a cota de domínio" @@ -626,44 +674,40 @@ msgstr "Identidades" msgid "Forward" msgstr "Encaminhar" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "Um caixa de mensagens é obrigatória" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "Você não tem permissão para importar domínios" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "Você não tem permissão para importar aliases de domínio." -#: lib.py:187 tests/test_mx.py:135 -#, python-format -msgid "No DNS records found for %s" -msgstr "" +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 +#, fuzzy, python-format +#| msgid "No MX record found for this domain." +msgid "No DNS record found for %s" +msgstr "Nenhum registro MX foi encontrado para este domínio." -#: lib.py:189 tests/test_mx.py:138 -#, python-format -msgid "No MX record for %s" -msgstr "" +#: lib.py:196 +#, fuzzy, python-format +#| msgid "No MX record found for this domain." +msgid "No %(type)s record for %(name)s" +msgstr "Nenhum registro MX foi encontrado para este domínio." -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" -#: lib.py:205 -#, fuzzy, python-brace-format -#| msgid "No MX record found for this domain." -msgid "No {type} record found for MX {mx}" -msgstr "Nenhum registro MX foi encontrado para este domínio." - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid quota value for domain '{}'" msgid "Invalid IP address format for {domain}; {addr}" @@ -683,20 +727,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] Problema(s) de DNSBL para o domínio {}" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "O domínio {} não possui registro MX" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "O registro MX para o domínio {0} é inválido: {1}" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] Problema(s) de MX para o domínio {}" @@ -708,7 +752,7 @@ msgstr "endereço" msgid "The alias address." msgstr "O endereço alias." -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "ativado" @@ -754,54 +798,48 @@ msgstr "nome" msgid "The domain name" msgstr "Nome do domínio" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" -"Cota padrão em MB aplicada a caixas de correio. Um valor de 0 significa sem " -"cota." - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Marque para ativar esse domínio" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "Habilitar verificação DNS" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "Marque para habilitar verificações DNS para este domínio" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Linha inválida" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "Valor de cota inválida para o domínio '{}'" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "Valor padrão de cota inválido para caixas de correio do domínio '{}'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" "Valor padrão de cota para caixas de correio não pode ser maior que a cota do " @@ -841,42 +879,48 @@ msgstr "Uma cota é requerida" msgid "Domain quota exceeded" msgstr "Cota do domínio excedida" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"Cota padrão em MB aplicada a caixas de correio. Um valor de 0 significa sem " +"cota." + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "Permissão negada." -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" "Lista dos domínios administrados (somente revendedores e administradores de " "domínio)." -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "Não permitido para este perfil." -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "Deve ser igual ao endereço completo da conta" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "Domínio local {} não existe" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "Domínio não encontrado." -#: serializers.py:449 +#: serializers.py:461 msgid "You don't have access to this domain." msgstr "" -#: serializers.py:457 +#: serializers.py:469 msgid "You don't have access to this mailbox." msgstr "" @@ -907,6 +951,18 @@ msgstr "Desabilitado" msgid "Awaiting checks" msgstr "Aguardando checagens" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "Directory not found." +msgid "No record found" +msgstr "Diretório não encontrado." + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "Estatísticas globais" @@ -1294,19 +1350,12 @@ msgstr "Editar {}" msgid "Delete %s?" msgstr "Remover %s?" -#: tests/test_mx.py:144 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No A record found for MX %(domain)s" -msgstr "Nenhum registro MX foi encontrado para este domínio." +#: tests/test_mx.py:139 +#, python-format +msgid "No MX record for %s" +msgstr "" -#: tests/test_mx.py:147 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No AAAA record found for MX %(domain)s" -msgstr "Nenhum registro MX foi encontrado para este domínio." - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "" @@ -1345,11 +1394,11 @@ msgstr "Registro MX para {}" msgid "DNSBL summary for {}" msgstr "Sumário DNSBL para {}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Você não pode deletar seu próprio domínio" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Domínio deletado" @@ -1395,6 +1444,16 @@ msgstr "Importar identidades" msgid "Forward updated" msgstr "Encaminhamento atualizado" +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "Nenhum registro MX foi encontrado para este domínio." + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "Nenhum registro MX foi encontrado para este domínio." + #~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota." #~ msgstr "" #~ "Cota em MB compartilhada entre caixas de correio. Um valor de 0 significa " diff --git a/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po index 66af1f6c9..db5c7af17 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: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\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/" @@ -59,49 +59,81 @@ msgid "" msgstr "" #: app_settings.py:55 -msgid "Enable DNSBL checks" +msgid "Enable SPF checks" msgstr "" #: app_settings.py:58 -msgid "Check every domain against major DNSBL providers" +msgid "Check if every domain has a valid SPF record" msgstr "" #: app_settings.py:63 -msgid "Custom DNS server" +msgid "Enable DKIM checks" msgstr "" #: app_settings.py:66 +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "" + +#: app_settings.py:72 +msgid "Enable DMARC checks" +msgstr "" + +#: app_settings.py:75 +msgid "Check if every domain has a valid DMARC record" +msgstr "" + +#: app_settings.py:80 +msgid "Enable autoconfig checks" +msgstr "" + +#: app_settings.py:83 +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "" + +#: app_settings.py:88 +msgid "Enable DNSBL checks" +msgstr "" + +#: app_settings.py:91 +msgid "Check every domain against major DNSBL providers" +msgstr "" + +#: app_settings.py:96 +msgid "Custom DNS server" +msgstr "" + +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " "world." msgstr "" -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Caixas de Correio" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Lidar com caixas de correio no sistema de ficheiros" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -109,19 +141,19 @@ msgstr "" "Renomear ou remover as caixas de correio no sistema de ficheiros quando " "estas são renomeadas no Modoboa" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Dono das caixas de correio" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "A conta UNIX que detém as caixas de correio no sistema de ficheiros" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Quota pré-definida para o domínio" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -129,14 +161,14 @@ msgstr "" "Quota (em MB) a aplicar a domínios recentemente criados sem valor " "especificado. Um valor de 0 implica sem quota." -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 #, fuzzy #| msgid "Default domain quota" msgid "Default mailbox quota" msgstr "Quota pré-definida para o domínio" -#: app_settings.py:122 +#: app_settings.py:155 #, fuzzy #| msgid "" #| "Default quota (in MB) applied to freshly created domains with no value " @@ -148,62 +180,62 @@ msgstr "" "Quota (em MB) a aplicar a domínios recentemente criados sem valor " "especificado. Um valor de 0 implica sem quota." -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Remoção automática de conta" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "" "Ao remover uma caixa de correio estará também a remover a conta associada" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Criação automatica de domino/caixa de correio" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" "Criar um dominio e uma caixa de correio quando uma conta é criada " "automátiamente." -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Tem de ser um inteiro, positivo" -#: app_settings.py:214 +#: app_settings.py:247 #, fuzzy #| msgid "Domain modified" msgid "Directory not found." msgstr "Domínio alterado" -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "" -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Administração" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Domínio" -#: constants.py:99 +#: constants.py:97 #, fuzzy #| msgid "New domain" msgid "Relay domain" @@ -264,7 +296,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 #, fuzzy #| msgid "A mailbox is required" msgid "This field is required." @@ -460,7 +492,7 @@ msgstr "" msgid "Key selector" msgstr "" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota (in MB) applied to freshly created domains with no value " @@ -493,7 +525,7 @@ msgstr "'Alias' de domínio" msgid "A %s with this name already exists" msgstr "Já existe um(a) %s com este nome. " -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "" @@ -501,7 +533,7 @@ msgstr "" msgid "DKIM keys storage directory not configured" msgstr "" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "" @@ -656,45 +688,40 @@ msgstr "Identidades" msgid "Forward" msgstr "Reencaminhar" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "É necessária uma caixa de correio" -#: lib.py:131 +#: lib.py:132 #, fuzzy #| msgid "You can't delete your own domain" msgid "You are not allowed to import domains" msgstr "Não é possível eliminar o seu próprio domínio" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "" -#: lib.py:187 tests/test_mx.py:135 +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 #, python-format -msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "" -#: lib.py:189 tests/test_mx.py:138 +#: lib.py:196 #, python-format -msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" -#: lib.py:205 -#, python-brace-format -msgid "No {type} record found for MX {mx}" -msgstr "" - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid quota value for domain '%s'" msgid "Invalid IP address format for {domain}; {addr}" @@ -714,20 +741,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -741,7 +768,7 @@ msgstr "endereços" msgid "The alias address." msgstr "O nome do 'alias'" -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "ativo" @@ -791,64 +818,54 @@ msgstr "nome" msgid "The domain name" msgstr "O nome do domínio" -#: models/domain.py:44 -#, fuzzy -#| msgid "" -#| "Default quota (in MB) applied to freshly created domains with no value " -#| "specified. A value of 0 means no quota." -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" -"Quota (em MB) a aplicar a domínios recentemente criados sem valor " -"especificado. Um valor de 0 implica sem quota." - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Marcar para ativar este domínio" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "" -#: models/domain.py:56 +#: models/domain.py:48 #, fuzzy #| msgid "Check to activate this domain" msgid "Check to enable DNS checks for this domain" msgstr "Marcar para ativar este domínio" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Linha inválida" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "" -#: models/domain.py:320 +#: models/domain.py:337 #, fuzzy #| msgid "Invalid quota value for domain '%s'" msgid "Invalid quota value for domain '{}'" msgstr "Valor de quota inválido para o dominio '%s'" -#: models/domain.py:327 +#: models/domain.py:344 #, fuzzy #| msgid "Invalid quota value for domain '%s'" msgid "Invalid default mailbox quota value for domain '{}'" msgstr "Valor de quota inválido para o dominio '%s'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" @@ -888,48 +905,58 @@ msgstr "É necessário uma quota" msgid "Domain quota exceeded" msgstr "Domínio criado" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +#, fuzzy +#| msgid "" +#| "Default quota (in MB) applied to freshly created domains with no value " +#| "specified. A value of 0 means no quota." +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"Quota (em MB) a aplicar a domínios recentemente criados sem valor " +"especificado. Um valor de 0 implica sem quota." + +#: serializers.py:111 serializers.py:316 serializers.py:414 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Permissões" -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "" -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "" -#: serializers.py:291 +#: serializers.py:303 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "O domínio não existe" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "" -#: serializers.py:400 +#: serializers.py:412 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." msgstr "Domínio alterado" -#: serializers.py:449 +#: serializers.py:461 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this domain." msgstr "Não tem acesso a este domínio" -#: serializers.py:457 +#: serializers.py:469 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this mailbox." @@ -968,6 +995,18 @@ msgstr "inativo" msgid "Awaiting checks" msgstr "" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "Domain modified" +msgid "No record found" +msgstr "Domínio alterado" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 #, fuzzy #| msgid "Statistics" @@ -1377,17 +1416,12 @@ msgstr "" msgid "Delete %s?" msgstr "Eliminar %s?" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, python-format -msgid "No A record found for MX %(domain)s" +msgid "No MX record for %s" msgstr "" -#: tests/test_mx.py:147 -#, python-format -msgid "No AAAA record found for MX %(domain)s" -msgstr "" - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "" @@ -1428,11 +1462,11 @@ msgstr "" msgid "DNSBL summary for {}" msgstr "" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Não é possível eliminar o seu próprio domínio" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Domínio criado" diff --git a/modoboa/admin/locale/ro_RO/LC_MESSAGES/django.po b/modoboa/admin/locale/ro_RO/LC_MESSAGES/django.po index a53a4a68c..e078f31e0 100644 --- a/modoboa/admin/locale/ro_RO/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/ro_RO/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" "PO-Revision-Date: 2018-07-03 13:17+0000\n" "Last-Translator: Andrei-Ilie Olteanu \n" "Language-Team: Romanian (Romania) (http://www.transifex.com/tonio/modoboa/" @@ -60,26 +60,74 @@ msgstr "" "dintre adresele definite." #: app_settings.py:55 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable SPF checks" +msgstr "Activează verificările DNS" + +#: app_settings.py:58 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid SPF record" +msgstr "Verifică ca fiecare domeniu are asociat un MX valid" + +#: app_settings.py:63 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DKIM checks" +msgstr "Activează verificările MX" + +#: app_settings.py:66 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "Verifică ca fiecare domeniu are asociat un MX valid" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DMARC checks" +msgstr "Activează verificările MX" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid DMARC record" +msgstr "Verifică ca fiecare domeniu are asociat un MX valid" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable autoconfig checks" +msgstr "Activează verificările MX" + +#: app_settings.py:83 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "Verifică ca fiecare domeniu are asociat un MX valid" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "Activează verificările DNSBL" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "Verificați fiecare domeniu folosind furnizorii DNSBL majori" -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "Folderul de stocare pentru cheile DKIM" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " @@ -89,23 +137,23 @@ msgstr "" "Asigurați-vă că acest director aparține utilizatorului root și nu poate fi " "citit de orice user." -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "Mărimea implicită în caractere a chei DKIM" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "Mărimea implicită în biți pentru o cheie DKIM nou generată" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Cutii poștale" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Gestionați cutiile poștale în sistemul de fișiere" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -113,20 +161,20 @@ msgstr "" "Redenumește sau eliminează căsuțele poștale din sistemul de fișiere atunci " "când se redenumesc sau se elimină în Modoboa" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Propietarul cutiilor postale" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "" "Contul UNIX care are in propietate casuțele poștale în sistemul de fișiere" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Cota-parte implicită a domeniului" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -134,12 +182,12 @@ msgstr "" "Cota implicită (în MB) aplicată domeniilor nou create, care nu au nicio " "valoare specificată. O valoare de 0 înseamnă că nu există o cotă." -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "Cota implicită pentru cutia poștală" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." @@ -148,60 +196,60 @@ msgstr "" "care nu au nicio valoare specificată. O valoare de 0 înseamnă că nu există o " "cotă." -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Ștergere automată a contului" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "Când se șterge o cutie poștală, șterge, de asemenea și contul asociat" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Crearea automată a domeniului / cutiei poștale" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" "Creați un domeniu și o căsuță poștală atunci când un cont este creat automat." -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "Creați un alias când o cutie poștală este redenumită" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" "Creați un alias utilizând vechea adresă atunci când o cutie poștală este " "redenumită." -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Trebuie să fie un număr întreg pozitiv" -#: app_settings.py:214 +#: app_settings.py:247 msgid "Directory not found." msgstr "Directorul nu a fost găsit." -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "openssl nu a fost găsit, asigurați-vă că este instalat." -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "Definiți cel puțin o adresă de rețea autorizată" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Administrare" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Domeniu" -#: constants.py:99 +#: constants.py:97 msgid "Relay domain" msgstr "Domeniu de relay" @@ -262,7 +310,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Numai superadministratorii sunt permiși la acest mod" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "Acest câmp este necesar." @@ -434,7 +482,7 @@ msgstr "" msgid "Key selector" msgstr "Selector cheie" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota in MB applied to mailboxes. A value of 0 means no quota." @@ -465,7 +513,7 @@ msgstr "alias domeniu" msgid "A %s with this name already exists" msgstr "Itemul%s cu acest nume există" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "Nu s-au gasit înregistrări MX autorizate pentru acest domeniu" @@ -473,7 +521,7 @@ msgstr "Nu s-au gasit înregistrări MX autorizate pentru acest domeniu" msgid "DKIM keys storage directory not configured" msgstr "Folderul de stocare a cheilor DKIM nu este configurat" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "Nu poate fi mai mare decat cota domeniului" @@ -624,46 +672,42 @@ msgstr "Identități" msgid "Forward" msgstr "Redirecționează" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "O căsuță poștală este necesară" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "Nu ești autorizat să imporți domenii" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "Nu ești autorizat să imporți aliasuri de domenii" -#: lib.py:187 tests/test_mx.py:135 -#, python-format -msgid "No DNS records found for %s" +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 +#, fuzzy, python-format +#| msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "Nu s-au găsit înregistrări DNS pentru %s" -#: lib.py:189 tests/test_mx.py:138 -#, python-format -msgid "No MX record for %s" +#: lib.py:196 +#, fuzzy, python-format +#| msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "Nu există înregidtrări MX pentru %s" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "Nu s-au găsit NS-uri funcționale" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" "Timeout întâmpinat la rezolvarea cererii DNS, imposibilă de interogat %s în " "acest moment" -#: lib.py:205 -#, fuzzy, python-brace-format -#| msgid "No DNS records found for %s" -msgid "No {type} record found for MX {mx}" -msgstr "Nu s-au găsit înregistrări DNS pentru %s" - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid IP address format for %(domain)s; %(addr)s" msgid "Invalid IP address format for {domain}; {addr}" @@ -683,20 +727,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] Problemă(e) DNSBL pentru domeniul {} " -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "Domeniul {} nu are înregistrări MX" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "Înregistrarea MX pentru domeniul {0} este invalidă: {1}" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] Problemă(e) MX pentru domeniul {}" @@ -708,7 +752,7 @@ msgstr "adresă" msgid "The alias address." msgstr "Adresă alias." -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "activat" @@ -754,56 +798,50 @@ msgstr "nume" msgid "The domain name" msgstr "Numele domeniului" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" -"Cota implicită exprimată în MB aplivată la cutiile poștale. O valuare 0 " -"înseamnă fără cotă." - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Bifează pentru a activa domeniul" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "Activează verificările DNS" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "Bifează pentru a activa verificările DNS pentru acest domeniu" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "Activează semnarea DKIM" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" "Dacă activezi această facilitate, o chieie DKIM se va genera pt acest " "domeniu." -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "Mărime cheie" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Linie invalidă" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "Nu s-au gasit înregistrări MX autorizate pentru acest domeniu {}" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "Valuare de cotă invalidă pentru domeniul '{}'" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "Valuare implicită de cotă invalidă pentru domeniul '{}'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" "Valuarea de cotă implicită a unei cutii poștale nu poate fi mai mare decât " @@ -843,41 +881,47 @@ msgstr "O cotă este necesară" msgid "Domain quota exceeded" msgstr "Cota pentru domeniu a fost depașită" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" +"Cota implicită exprimată în MB aplivată la cutiile poștale. O valuare 0 " +"înseamnă fără cotă." + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "Permisiune refuzată." -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" "Lista domenilor administrate (doar reselleri și administratori de domeniu)" -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "Ne permis pentru acest rol." -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "Trebuie să fie egal cu mailbox full_address" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "Domeniu local {} nu există" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "O listă de destinatari" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "Domeniu negăsit" -#: serializers.py:449 +#: serializers.py:461 msgid "You don't have access to this domain." msgstr "Nu ai acces la acest domeniu." -#: serializers.py:457 +#: serializers.py:469 msgid "You don't have access to this mailbox." msgstr "Nu ai acces la această cutie postală" @@ -908,6 +952,18 @@ msgstr "Dezactivat" msgid "Awaiting checks" msgstr "Se așteaptă verificările" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "No DNS records found for %s" +msgid "No record found" +msgstr "Nu s-au găsit înregistrări DNS pentru %s" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "Statistici globale" @@ -1296,19 +1352,12 @@ msgstr "Editează {}" msgid "Delete %s?" msgstr "Șterge %s?" -#: tests/test_mx.py:144 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No A record found for MX %(domain)s" -msgstr "Nu există înregistrări MX pentru acest domeniu." +#: tests/test_mx.py:139 +#, python-format +msgid "No MX record for %s" +msgstr "Nu există înregidtrări MX pentru %s" -#: tests/test_mx.py:147 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No AAAA record found for MX %(domain)s" -msgstr "Nu există înregistrări MX pentru acest domeniu." - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "Format invalid de IP pentru %(domain)s; %(addr)s " @@ -1348,11 +1397,11 @@ msgstr "Înregistrări MX ale {}" msgid "DNSBL summary for {}" msgstr "Sumar DNSBL pentru {}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Nu poți să îți ștergi propriul domeniu" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Domeniu șters" @@ -1400,6 +1449,21 @@ msgstr "Importă identități" msgid "Forward updated" msgstr "Redirecționare actualizată" +#, fuzzy +#~| msgid "No DNS records found for %s" +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "Nu s-au găsit înregistrări DNS pentru %s" + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "Nu există înregistrări MX pentru acest domeniu." + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "Nu există înregistrări MX pentru acest domeniu." + #~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota." #~ msgstr "" #~ "Cota în MB impărțită între cutiile poștale. O valuare 0 înseamnă fără " diff --git a/modoboa/admin/locale/ru/LC_MESSAGES/django.po b/modoboa/admin/locale/ru/LC_MESSAGES/django.po index d340da7e1..129a6ef31 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: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\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/" @@ -54,49 +54,81 @@ msgid "" msgstr "" #: app_settings.py:55 -msgid "Enable DNSBL checks" +msgid "Enable SPF checks" msgstr "" #: app_settings.py:58 -msgid "Check every domain against major DNSBL providers" +msgid "Check if every domain has a valid SPF record" msgstr "" #: app_settings.py:63 -msgid "Custom DNS server" +msgid "Enable DKIM checks" msgstr "" #: app_settings.py:66 +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "" + +#: app_settings.py:72 +msgid "Enable DMARC checks" +msgstr "" + +#: app_settings.py:75 +msgid "Check if every domain has a valid DMARC record" +msgstr "" + +#: app_settings.py:80 +msgid "Enable autoconfig checks" +msgstr "" + +#: app_settings.py:83 +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "" + +#: app_settings.py:88 +msgid "Enable DNSBL checks" +msgstr "" + +#: app_settings.py:91 +msgid "Check every domain against major DNSBL providers" +msgstr "" + +#: app_settings.py:96 +msgid "Custom DNS server" +msgstr "" + +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " "world." msgstr "" -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Почтовые ящики" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Обрабатывать почтовые ящики на диске" -#: app_settings.py:96 +#: app_settings.py:129 #, fuzzy msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " @@ -105,89 +137,89 @@ msgstr "" "Удалять или переименовывать почтовые ящики на диске, если они удалены или " "переименованы в Modoboa" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Почтовые ящики закончились" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "UNIX аккаунт владельца почтового ящика на диске" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." msgstr "" -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." msgstr "" -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Автоматическое удаление аккаунта" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "При удалении почтового ящика, так же удалять и аккаунт владельца" -#: app_settings.py:135 +#: app_settings.py:168 #, fuzzy msgid "Automatic domain/mailbox creation" msgstr "Домен создан" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "" -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "" -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "" -#: app_settings.py:214 +#: app_settings.py:247 #, fuzzy #| msgid "Domain modified" msgid "Directory not found." msgstr "Домен изменен" -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "" -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "" -#: constants.py:99 +#: constants.py:97 #, fuzzy #| msgid "New domain" msgid "Relay domain" @@ -248,7 +280,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 #, fuzzy #| msgid "A quota is required" msgid "This field is required." @@ -444,7 +476,7 @@ msgstr "" msgid "Key selector" msgstr "" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 msgid "" "Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. " "A value of 0 means no quota." @@ -465,7 +497,7 @@ msgstr "" msgid "A %s with this name already exists" msgstr "" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "" @@ -473,7 +505,7 @@ msgstr "" msgid "DKIM keys storage directory not configured" msgstr "" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "" @@ -629,45 +661,40 @@ msgstr "Пользователи" msgid "Forward" msgstr "Перенаправленые" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "" -#: lib.py:131 +#: lib.py:132 #, fuzzy #| msgid "You can't delete your own domain" msgid "You are not allowed to import domains" msgstr "Вы не можете удалить собственный домен" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "" -#: lib.py:187 tests/test_mx.py:135 +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 #, python-format -msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "" -#: lib.py:189 tests/test_mx.py:138 +#: lib.py:196 #, python-format -msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "" -#: lib.py:205 -#, python-brace-format -msgid "No {type} record found for MX {mx}" -msgstr "" - -#: lib.py:214 +#: lib.py:231 #, python-brace-format msgid "Invalid IP address format for {domain}; {addr}" msgstr "" @@ -686,20 +713,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "" @@ -713,7 +740,7 @@ msgstr "адрес" msgid "The alias address." msgstr "Имя синонима" -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "Разрешен" @@ -763,54 +790,50 @@ msgstr "имя" msgid "The domain name" msgstr "Имя домена" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "" - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Отметить для активации этого домена" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "" -#: models/domain.py:56 +#: models/domain.py:48 #, fuzzy #| msgid "Check to activate this domain" msgid "Check to enable DNS checks for this domain" msgstr "Отметить для активации этого домена" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Ошибочная строка" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "" @@ -850,48 +873,52 @@ msgstr "Требуется квота" msgid "Domain quota exceeded" msgstr "Домен создан" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "" + +#: serializers.py:111 serializers.py:316 serializers.py:414 #, fuzzy #| msgid "Permissions" msgid "Permission denied." msgstr "Права" -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "" -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "" -#: serializers.py:291 +#: serializers.py:303 #, fuzzy #| msgid "Domain does not exist" msgid "Local domain {} does not exist" msgstr "Домен не существует" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "" -#: serializers.py:400 +#: serializers.py:412 #, fuzzy #| msgid "Domain modified" msgid "Domain not found." msgstr "Домен изменен" -#: serializers.py:449 +#: serializers.py:461 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this domain." msgstr "Вы не имеете права доступа к этому домену" -#: serializers.py:457 +#: serializers.py:469 #, fuzzy #| msgid "You don't have access to this domain" msgid "You don't have access to this mailbox." @@ -929,6 +956,18 @@ msgstr "Разрешен" msgid "Awaiting checks" msgstr "" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "Domain modified" +msgid "No record found" +msgstr "Домен изменен" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 #, fuzzy #| msgid "Statistics" @@ -1338,17 +1377,12 @@ msgstr "" msgid "Delete %s?" msgstr "Удалить %s?" -#: tests/test_mx.py:144 +#: tests/test_mx.py:139 #, python-format -msgid "No A record found for MX %(domain)s" +msgid "No MX record for %s" msgstr "" -#: tests/test_mx.py:147 -#, python-format -msgid "No AAAA record found for MX %(domain)s" -msgstr "" - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "" @@ -1390,11 +1424,11 @@ msgstr "" msgid "DNSBL summary for {}" msgstr "" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Вы не можете удалить собственный домен" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Домен удален" diff --git a/modoboa/admin/locale/sv/LC_MESSAGES/django.po b/modoboa/admin/locale/sv/LC_MESSAGES/django.po index b45d2b983..41048cb06 100644 --- a/modoboa/admin/locale/sv/LC_MESSAGES/django.po +++ b/modoboa/admin/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: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" "PO-Revision-Date: 2018-08-14 08:35+0000\n" "Last-Translator: Olle Gustafsson \n" "Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/" @@ -60,26 +60,74 @@ msgstr "" "fördefinerat." #: app_settings.py:55 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable SPF checks" +msgstr "Aktivera DNS kontroller" + +#: app_settings.py:58 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid SPF record" +msgstr "Kontrollera att varje domän har ett giltigt MX record" + +#: app_settings.py:63 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DKIM checks" +msgstr "Aktivera MX kontroll" + +#: app_settings.py:66 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "Kontrollera att varje domän har ett giltigt MX record" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DMARC checks" +msgstr "Aktivera MX kontroll" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid DMARC record" +msgstr "Kontrollera att varje domän har ett giltigt MX record" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable autoconfig checks" +msgstr "Aktivera MX kontroll" + +#: app_settings.py:83 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "Kontrollera att varje domän har ett giltigt MX record" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "Aktivera DNSBL kontroller" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "Kontrollera varje domän mot större DNSBL leverantörer" -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "DKIM nycklar lagrings katalog" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " @@ -89,23 +137,23 @@ msgstr "" "till att den här katalogen ägs av root-användaren och inte kan läsas av " "utomstående." -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "Standard DKIM nyckellängd" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "Standardlängd i bitar för genererade DKIM nycklar." -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "Brevlådor" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "Hantera brevlådor på filsystem" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" @@ -113,19 +161,19 @@ msgstr "" "Byt namn på eller ta bort brevlådor på filsystemet när de kommer byta namn " "eller tas bort inom Modoboa" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "Brevlådans ägare" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "Den UNIX-konto som äger brevlådor på filsystemet" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "Standard domän kvota" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." @@ -133,12 +181,12 @@ msgstr "" "Standard kvota (i MB) applicerad på nyskapade domäner som inte har något " "värde specificerat. Ett värde på 0 betyder ingen kvota." -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "Standard brevlåde kvota" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." @@ -146,57 +194,57 @@ msgstr "" "Standard brevlåde kvota (i MB) applicerad på nyligen skapade domäner där " "inget värde angetts. 0 betyder ingen kvota." -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "Automatisk konto borttagning" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "När en brevlåda raderas, radera också tillhörande konto" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "Automatisk skapande av domän/brevlåda" -#: app_settings.py:138 +#: app_settings.py:171 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." -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "Skapa ett alias när en brevlåda döps om" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "Skapa ett alias med den gamla adressen när en brevlåda bytt namn." -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "Måste vara ett positivt heltal" -#: app_settings.py:214 +#: app_settings.py:247 msgid "Directory not found." msgstr "Katalog kunde ej hittas." -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "openssl hittades inte, kontroller att det är installerat." -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "Ange åtminstonde en auktoriserad nätverk / adress" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "Administration" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "Domän" -#: constants.py:99 +#: constants.py:97 msgid "Relay domain" msgstr "Relay domän" @@ -257,7 +305,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "Endast superadmininstratörer tillåts åtkomst till det här läget" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "Detta fält krävs." @@ -426,7 +474,7 @@ msgstr "" msgid "Key selector" msgstr "Nyckelväljare" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota in MB applied to mailboxes. A value of 0 means no quota." @@ -453,7 +501,7 @@ msgstr "domän alias" msgid "A %s with this name already exists" msgstr "En %s med detta namn finns redan" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "Inga auktoriserade MX inlägg finns för denna domänen" @@ -461,7 +509,7 @@ msgstr "Inga auktoriserade MX inlägg finns för denna domänen" msgid "DKIM keys storage directory not configured" msgstr "DKIM nycklar lagringskatalog ej konfigurerad" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "Får inte vara större än domän kvot" @@ -609,44 +657,40 @@ msgstr "Konton" msgid "Forward" msgstr "Vidarebefordra" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "En brevlåda krävs" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "Du tillåts inte att importera domäner" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "Du tillåts inte att importera domän alias." -#: lib.py:187 tests/test_mx.py:135 -#, python-format -msgid "No DNS records found for %s" +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 +#, fuzzy, python-format +#| msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "Inga DNS-poster hittades för %s" -#: lib.py:189 tests/test_mx.py:138 -#, python-format -msgid "No MX record for %s" +#: lib.py:196 +#, fuzzy, python-format +#| msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "Ingen MX-post för %s" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "Inga fungerande namnservrar hittades" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "DNS-upplösning timeout, kan inte fråga %s för tillfället" -#: lib.py:205 -#, fuzzy, python-brace-format -#| msgid "No DNS records found for %s" -msgid "No {type} record found for MX {mx}" -msgstr "Inga DNS-poster hittades för %s" - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid IP address format for %(domain)s; %(addr)s" msgid "Invalid IP address format for {domain}; {addr}" @@ -666,20 +710,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] DNSBL fråga(or) för domän {}" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "Domän {} saknar MX record" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "MX record för domän {0} är ogiltig: {1}" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] MX problem för domän {}" @@ -691,7 +735,7 @@ msgstr "adress" msgid "The alias address." msgstr "Alias adressen." -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "aktiverad" @@ -737,54 +781,50 @@ msgstr "namn" msgid "The domain name" msgstr "Domännamnet" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "Standardkvota i MB applicerad på nya brevlådor. 0 betyder ingen kvota." - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "Markera för att aktivera denna domän" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "Aktivera DNS kontroller" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "Markera för att aktivera DNS kontroller för den här domänen" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "Aktivera DKIM-signering" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "" "Om du aktiverar den här funktionen genereras en DKIM-nyckel för den här " "domänen." -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "Nyckellängd" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "Ogiltig rad" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "Inga auktoriserade MX inlägg finns för domänen {}" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "Ogiltig kvota värd för domän '{}'" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "Ogiltig standard brevlådekvota för domän '{}'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "Standard brevlådekvota kan inte vara större än domänkvotan" @@ -822,42 +862,46 @@ msgstr "En kvota krävs" msgid "Domain quota exceeded" msgstr "Domänkvota överskriden" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "Standardkvota i MB applicerad på nya brevlådor. 0 betyder ingen kvota." + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "Åtskomst nekad." -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "" "Lista över administrerade domäner (endast återförsäljare och " "domänadministratörer)." -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "Inte tillåtet för denna roll." -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "Måste vara lika med brevlådans full_address" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "Lokal domän {} finns inte" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "En lista på mottagare" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "Domän kunde ej hittas." -#: serializers.py:449 +#: serializers.py:461 msgid "You don't have access to this domain." msgstr "Du har inte åtkomst till denna domän." -#: serializers.py:457 +#: serializers.py:469 msgid "You don't have access to this mailbox." msgstr "Du har inte åtkomst till denna brevlåda." @@ -888,6 +932,18 @@ msgstr "Inaktiverad" msgid "Awaiting checks" msgstr "Väntar kontroll" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "No DNS records found for %s" +msgid "No record found" +msgstr "Inga DNS-poster hittades för %s" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "Global statistik" @@ -1273,19 +1329,12 @@ msgstr "Redigera {}" msgid "Delete %s?" msgstr "Radera %s?" -#: tests/test_mx.py:144 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No A record found for MX %(domain)s" -msgstr "Inget MX record funnet för denna domän." +#: tests/test_mx.py:139 +#, python-format +msgid "No MX record for %s" +msgstr "Ingen MX-post för %s" -#: tests/test_mx.py:147 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No AAAA record found for MX %(domain)s" -msgstr "Inget MX record funnet för denna domän." - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "Ogiltigt IP-adress format för %(domain)s; %(addr)s" @@ -1324,11 +1373,11 @@ msgstr "MX record för {}" msgid "DNSBL summary for {}" msgstr "DNSBL summering för {}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "Du kan inte radera din egen domän" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "Domän raderad" @@ -1374,6 +1423,21 @@ msgstr "Importera konton" msgid "Forward updated" msgstr "Vidarebefordring uppdaterad" +#, fuzzy +#~| msgid "No DNS records found for %s" +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "Inga DNS-poster hittades för %s" + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "Inget MX record funnet för denna domän." + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "Inget MX record funnet för denna domän." + #~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota." #~ msgstr "Kvota i MB delade mellan brevlådor. 0 betyder ingen kvota." diff --git a/modoboa/admin/locale/zh_TW/LC_MESSAGES/django.po b/modoboa/admin/locale/zh_TW/LC_MESSAGES/django.po index fb9dc298b..38b8775a1 100644 --- a/modoboa/admin/locale/zh_TW/LC_MESSAGES/django.po +++ b/modoboa/admin/locale/zh_TW/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-17 13:41+0200\n" +"POT-Creation-Date: 2018-11-20 10:32+0100\n" "PO-Revision-Date: 2018-07-09 04:17+0000\n" "Last-Translator: akong \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/tonio/modoboa/" @@ -57,26 +57,74 @@ msgid "" msgstr "假如 MX 紀錄未使用定義的位址請避免建立新的網域。" #: app_settings.py:55 +#, fuzzy +#| msgid "Enable DNS checks" +msgid "Enable SPF checks" +msgstr "啟用 DNS 檢查" + +#: app_settings.py:58 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid SPF record" +msgstr "檢查每個網域都有正確的 MX 紀錄" + +#: app_settings.py:63 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DKIM checks" +msgstr "啟用 MX 檢查" + +#: app_settings.py:66 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain with DKIM signin enabled has a valid DNS record" +msgstr "檢查每個網域都有正確的 MX 紀錄" + +#: app_settings.py:72 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable DMARC checks" +msgstr "啟用 MX 檢查" + +#: app_settings.py:75 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid DMARC record" +msgstr "檢查每個網域都有正確的 MX 紀錄" + +#: app_settings.py:80 +#, fuzzy +#| msgid "Enable MX checks" +msgid "Enable autoconfig checks" +msgstr "啟用 MX 檢查" + +#: app_settings.py:83 +#, fuzzy +#| msgid "Check that every domain has a valid MX record" +msgid "Check if every domain has a valid records for autoconfiguration" +msgstr "檢查每個網域都有正確的 MX 紀錄" + +#: app_settings.py:88 msgid "Enable DNSBL checks" msgstr "啟用 DNSBL 檢查" -#: app_settings.py:58 +#: app_settings.py:91 msgid "Check every domain against major DNSBL providers" msgstr "針對每個 DNSBL 供應商來檢查每個網域" -#: app_settings.py:63 +#: app_settings.py:96 msgid "Custom DNS server" msgstr "" -#: app_settings.py:66 +#: app_settings.py:99 msgid "Use a custom DNS server instead of local server configuration" msgstr "" -#: app_settings.py:71 +#: app_settings.py:104 msgid "DKIM keys storage directory" msgstr "DKIM 金鑰儲存目錄" -#: app_settings.py:74 +#: app_settings.py:107 msgid "" "Absolute path of the directory where DKIM private keys will be stored. Make " "sure this directory belongs to root user and is not readable by the outside " @@ -85,109 +133,109 @@ msgstr "" "絕對路徑的目錄將會給 DKIM 私鑰儲存。確認這個目錄屬於 root 使用者並且外面的世" "界無法讀取。" -#: app_settings.py:82 +#: app_settings.py:115 msgid "Default DKIM key length" msgstr "預設 DKIM 金鑰長度" -#: app_settings.py:86 +#: app_settings.py:119 msgid "Default length in bits for newly generated DKIM keys." msgstr "預設長度是給新產生的 DKIM 金鑰用。" -#: app_settings.py:90 templates/admin/domain_detail.html:41 +#: app_settings.py:123 templates/admin/domain_detail.html:41 msgid "Mailboxes" msgstr "信箱" -#: app_settings.py:93 +#: app_settings.py:126 msgid "Handle mailboxes on filesystem" msgstr "在檔案系統上處理信箱" -#: app_settings.py:96 +#: app_settings.py:129 msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" msgstr "當他要在 Modoboa 上取得更名或移除就會在檔案系統上更名或移除信箱" -#: app_settings.py:102 +#: app_settings.py:135 msgid "Mailboxes owner" msgstr "信箱擁有者" -#: app_settings.py:105 +#: app_settings.py:138 msgid "The UNIX account who owns mailboxes on the filesystem" msgstr "UNIX 帳號是檔案系統上擁有的信箱" -#: app_settings.py:110 +#: app_settings.py:143 msgid "Default domain quota" msgstr "預設網域配額" -#: app_settings.py:113 +#: app_settings.py:146 msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. A value of 0 means no quota." msgstr "預設配額(以MB為單位)應用於未指定值的創立網域。值為0表示沒有配額。" -#: app_settings.py:119 forms/domain.py:53 models/domain.py:41 +#: app_settings.py:152 forms/domain.py:53 models/domain.py:37 #: templates/admin/domain_detail.html:64 msgid "Default mailbox quota" msgstr "預設信箱配額" -#: app_settings.py:122 +#: app_settings.py:155 msgid "" "Default mailbox quota (in MB) applied to freshly created domains with no " "value specified. A value of 0 means no quota." msgstr "" "預設信箱配額(以MB為單位)應用於未指定值的建立網域。值為0表示沒有配額。" -#: app_settings.py:128 +#: app_settings.py:161 msgid "Automatic account removal" msgstr "自動刪除帳號" -#: app_settings.py:131 +#: app_settings.py:164 msgid "When a mailbox is removed, also remove the associated account" msgstr "當信箱移除時,也會移除關聯的帳號" -#: app_settings.py:135 +#: app_settings.py:168 msgid "Automatic domain/mailbox creation" msgstr "自動建立網域/信箱" -#: app_settings.py:138 +#: app_settings.py:171 msgid "Create a domain and a mailbox when an account is automatically created." msgstr "當帳號自動建立後會建立網域和一個信箱。" -#: app_settings.py:144 +#: app_settings.py:177 msgid "Create an alias when a mailbox is renamed" msgstr "當信箱更名時會建立別名" -#: app_settings.py:147 +#: app_settings.py:180 msgid "Create an alias using the old address when a mailbox is renamed." msgstr "當信箱更名時建立別名並使用在舊的位址。" -#: app_settings.py:196 app_settings.py:204 forms/account.py:339 +#: app_settings.py:229 app_settings.py:237 forms/account.py:339 msgid "Must be a positive integer" msgstr "必須是正整數" -#: app_settings.py:214 +#: app_settings.py:247 msgid "Directory not found." msgstr "目錄不存在" -#: app_settings.py:220 +#: app_settings.py:253 msgid "openssl not found, please make sure it is installed." msgstr "openssl 找不到,請確認已安裝。" -#: app_settings.py:234 +#: app_settings.py:267 msgid "Define at least one authorized network / address" msgstr "定義至少一個已驗證網路/位址" -#: app_settings.py:244 +#: app_settings.py:277 msgid "Administration" msgstr "管理員" -#: constants.py:98 forms/alias.py:47 +#: constants.py:96 forms/alias.py:47 #: templates/admin/_per_domain_statistics_widget.html:7 #: templates/admin/domains_quota_headers.html:2 msgid "Domain" msgstr "網域" -#: constants.py:99 +#: constants.py:97 msgid "Relay domain" msgstr "網域轉送" @@ -244,7 +292,7 @@ msgid "Only super administrators are allowed for this mode" msgstr "只有超級管理員在這個模式下是允許的" #: forms/account.py:182 forms/account.py:184 forms/domain.py:166 -#: forms/domain.py:295 forms/domain.py:298 serializers.py:279 +#: forms/domain.py:295 forms/domain.py:298 serializers.py:291 msgid "This field is required." msgstr "這個欄位是必填的" @@ -406,7 +454,7 @@ msgstr "這個網域的別名(es)。一行只能輸入一個電子郵件,按 E msgid "Key selector" msgstr "Key selector" -#: forms/domain.py:48 models/domain.py:36 +#: forms/domain.py:48 serializers.py:34 #, fuzzy #| msgid "" #| "Default quota in MB applied to mailboxes. A value of 0 means no quota." @@ -433,7 +481,7 @@ msgstr "網域別名" msgid "A %s with this name already exists" msgstr "此 %s 及這個名稱已存在" -#: forms/domain.py:109 serializers.py:56 +#: forms/domain.py:109 serializers.py:68 msgid "No authorized MX record found for this domain" msgstr "沒有找到這個網域已驗證過的 MX 紀錄" @@ -441,7 +489,7 @@ msgstr "沒有找到這個網域已驗證過的 MX 紀錄" msgid "DKIM keys storage directory not configured" msgstr "未設置 DKIM 金鑰儲存目錄" -#: forms/domain.py:151 serializers.py:74 +#: forms/domain.py:151 serializers.py:86 msgid "Cannot be greater than domain quota" msgstr "不可以超過網域配額" @@ -587,44 +635,40 @@ msgstr "使用者" msgid "Forward" msgstr "轉發" -#: lib.py:41 +#: lib.py:42 msgid "A mailbox is required" msgstr "信箱是必要的" -#: lib.py:131 +#: lib.py:132 msgid "You are not allowed to import domains" msgstr "您未允許匯入網域" -#: lib.py:142 +#: lib.py:143 msgid "You are not allowed to import domain aliases." msgstr "您未允許匯入網域別名。" -#: lib.py:187 tests/test_mx.py:135 -#, python-format -msgid "No DNS records found for %s" +#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148 +#, fuzzy, python-format +#| msgid "No DNS records found for %s" +msgid "No DNS record found for %s" msgstr "沒有找到 %s 的 DNS 紀錄" -#: lib.py:189 tests/test_mx.py:138 -#, python-format -msgid "No MX record for %s" +#: lib.py:196 +#, fuzzy, python-format +#| msgid "No MX record for %s" +msgid "No %(type)s record for %(name)s" msgstr "沒有 %s 的 MX 紀錄" -#: lib.py:191 tests/test_mx.py:139 +#: lib.py:200 tests/test_mx.py:140 msgid "No working name servers found" msgstr "沒有找到執行中的名稱伺服器" -#: lib.py:194 tests/test_mx.py:141 +#: lib.py:203 tests/test_mx.py:142 #, python-format msgid "DNS resolution timeout, unable to query %s at the moment" msgstr "DNS 解析逾時,無法查詢 %s 在這個時間點" -#: lib.py:205 -#, fuzzy, python-brace-format -#| msgid "No DNS records found for %s" -msgid "No {type} record found for MX {mx}" -msgstr "沒有找到 %s 的 DNS 紀錄" - -#: lib.py:214 +#: lib.py:231 #, fuzzy, python-brace-format #| msgid "Invalid IP address format for %(domain)s; %(addr)s" msgid "Invalid IP address format for {domain}; {addr}" @@ -644,20 +688,20 @@ msgstr "" msgid "Unable to decode CSV file using %(encoding)s encoding" msgstr "" -#: management/commands/subcommands/_mx.py:135 +#: management/commands/subcommands/_mx.py:136 msgid "[modoboa] DNSBL issue(s) for domain {}" msgstr "[modoboa] 此網域的 DNSBL 問題(s) {}" -#: management/commands/subcommands/_mx.py:155 +#: management/commands/subcommands/_mx.py:156 msgid "Domain {} has no MX record" msgstr "網域 {} 沒有 MX 紀錄" -#: management/commands/subcommands/_mx.py:166 +#: management/commands/subcommands/_mx.py:167 #, python-brace-format msgid "MX record for domain {0} is invalid: {1}" msgstr "此網域的 MX 紀錄 {0} 是無效的: {1}" -#: management/commands/subcommands/_mx.py:183 +#: management/commands/subcommands/_mx.py:184 msgid "[modoboa] MX issue(s) for domain {}" msgstr "[modoboa] 此網域的 MX 問題(s) {}" @@ -669,7 +713,7 @@ msgstr "地址" msgid "The alias address." msgstr "別名位址。" -#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46 +#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46 msgid "enabled" msgstr "已啟用" @@ -715,52 +759,48 @@ msgstr "名稱" msgid "The domain name" msgstr "網域名稱" -#: models/domain.py:44 -msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." -msgstr "預設套用在信箱幾 MB 的配額。值為0表示沒配額。" - -#: models/domain.py:50 +#: models/domain.py:42 msgid "Check to activate this domain" msgstr "點擊啟用這個網域" -#: models/domain.py:55 +#: models/domain.py:47 msgid "Enable DNS checks" msgstr "啟用 DNS 檢查" -#: models/domain.py:56 +#: models/domain.py:48 msgid "Check to enable DNS checks for this domain" msgstr "點擊啟用這個網域的 DNS 檢查" -#: models/domain.py:63 +#: models/domain.py:55 msgid "Enable DKIM signing" msgstr "啟用 DKIM 簽署" -#: models/domain.py:65 +#: models/domain.py:57 msgid "" "If you activate this feature, a DKIM key will be generated for this domain." msgstr "假如您啟用這個功能,DKIM 金鑰將會產生給這個網域。" -#: models/domain.py:71 +#: models/domain.py:63 msgid "Key length" msgstr "金鑰長度" -#: models/domain.py:303 models/domain_alias.py:74 +#: models/domain.py:320 models/domain_alias.py:74 msgid "Invalid line" msgstr "無效的行" -#: models/domain.py:313 +#: models/domain.py:330 msgid "No authorized MX record found for domain {}" msgstr "沒有找到這個網域已驗證過的 MX 紀錄 {}" -#: models/domain.py:320 +#: models/domain.py:337 msgid "Invalid quota value for domain '{}'" msgstr "此網域有無效的配額值 '{}'" -#: models/domain.py:327 +#: models/domain.py:344 msgid "Invalid default mailbox quota value for domain '{}'" msgstr "此網域有無效的預設信箱配額值 '{}'" -#: models/domain.py:332 +#: models/domain.py:349 msgid "Default mailbox quota cannot be greater than domain quota" msgstr "預設的信箱配額不可以超過網域配額" @@ -798,40 +838,44 @@ msgstr "配額是必要的" msgid "Domain quota exceeded" msgstr "網域配額已超過" -#: serializers.py:99 serializers.py:304 serializers.py:402 +#: serializers.py:41 +msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota." +msgstr "預設套用在信箱幾 MB 的配額。值為0表示沒配額。" + +#: serializers.py:111 serializers.py:316 serializers.py:414 msgid "Permission denied." msgstr "權限不足" -#: serializers.py:150 +#: serializers.py:162 msgid "" "List of administered domains (resellers and domain administrators only)." msgstr "管理員網域列表 (只有經銷商和網域管理員)。" -#: serializers.py:254 +#: serializers.py:266 msgid "Not allowed for this role." msgstr "不允許這個身份" -#: serializers.py:266 +#: serializers.py:278 msgid "Must be equal to mailbox full_address" msgstr "必須跟信箱完整位址一樣" -#: serializers.py:291 +#: serializers.py:303 msgid "Local domain {} does not exist" msgstr "本機網域 {} 不存在" -#: serializers.py:389 +#: serializers.py:401 msgid "A list of recipient" msgstr "收件人列表" -#: serializers.py:400 +#: serializers.py:412 msgid "Domain not found." msgstr "網域不存在。" -#: serializers.py:449 +#: serializers.py:461 msgid "You don't have access to this domain." msgstr "您不能存取這個網域。" -#: serializers.py:457 +#: serializers.py:469 msgid "You don't have access to this mailbox." msgstr "您不能存取這個信箱。" @@ -862,6 +906,18 @@ msgstr "已停用" msgid "Awaiting checks" msgstr "等待檢查" +#: templates/admin/_domain_dnschecks_status.html:16 +#: templates/admin/_domain_dnschecks_status.html:32 +#: templates/admin/_domain_dnschecks_status.html:40 +#, fuzzy +#| msgid "No DNS records found for %s" +msgid "No record found" +msgstr "沒有找到 %s 的 DNS 紀錄" + +#: templates/admin/_domain_dnschecks_status.html:24 +msgid "Waiting for key to be generated" +msgstr "" + #: templates/admin/_global_statistics_widget.html:4 msgid "Global statistics" msgstr "全域狀態" @@ -1240,19 +1296,12 @@ msgstr "編輯 {}" msgid "Delete %s?" msgstr "刪除 %s?" -#: tests/test_mx.py:144 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No A record found for MX %(domain)s" -msgstr "沒有找到這個網域的 MX 紀錄。" +#: tests/test_mx.py:139 +#, python-format +msgid "No MX record for %s" +msgstr "沒有 %s 的 MX 紀錄" -#: tests/test_mx.py:147 -#, fuzzy, python-format -#| msgid "No MX record found for this domain." -msgid "No AAAA record found for MX %(domain)s" -msgstr "沒有找到這個網域的 MX 紀錄。" - -#: tests/test_mx.py:150 tests/test_mx.py:153 +#: tests/test_mx.py:151 tests/test_mx.py:154 #, python-format msgid "Invalid IP address format for %(domain)s; %(addr)s" msgstr "無效的 IP 位址格式 %(domain)s; %(addr)s" @@ -1290,11 +1339,11 @@ msgstr "MX 紀錄 {}" msgid "DNSBL summary for {}" msgstr "DNSBL 摘要 {}" -#: views/domain.py:199 +#: views/domain.py:206 msgid "You can't delete your own domain" msgstr "您不可以刪除您擁有的網域" -#: views/domain.py:202 +#: views/domain.py:209 msgid "Domain deleted" msgid_plural "Domains deleted" msgstr[0] "網域移除" @@ -1338,6 +1387,21 @@ msgstr "匯入使用者" msgid "Forward updated" msgstr "轉寄已更新" +#, fuzzy +#~| msgid "No DNS records found for %s" +#~ msgid "No {type} record found for MX {mx}" +#~ msgstr "沒有找到 %s 的 DNS 紀錄" + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No A record found for MX %(domain)s" +#~ msgstr "沒有找到這個網域的 MX 紀錄。" + +#, fuzzy +#~| msgid "No MX record found for this domain." +#~ msgid "No AAAA record found for MX %(domain)s" +#~ msgstr "沒有找到這個網域的 MX 紀錄。" + #~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota." #~ msgstr "信箱之間共用幾 MB 的配額。值為0表示沒配額。" diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index 8f0db645e..b88bd30a1 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -19,6 +19,7 @@ from django.utils.functional import cached_property from django.utils.translation import ugettext as _ from modoboa.admin import constants, models +from modoboa.dnstools import models as dns_models from modoboa.parameters import tools as param_tools @@ -193,6 +194,25 @@ class CheckMXRecords(BaseCommand): if param_tools.get_global_parameter("enable_mx_checks"): self.check_valid_mx(domain, mx_list, **options) + if param_tools.get_global_parameter("enable_spf_checks"): + dns_models.DNSRecord.objects.get_or_create_for_domain( + domain, "spf", ttl) + condition = ( + param_tools.get_global_parameter("enable_dkim_checks") and + domain.dkim_public_key + ) + if condition: + dns_models.DNSRecord.objects.get_or_create_for_domain( + domain, "dkim", ttl) + if param_tools.get_global_parameter("enable_dmarc_checks"): + dns_models.DNSRecord.objects.get_or_create_for_domain( + domain, "dmarc", ttl) + if param_tools.get_global_parameter("enable_autoconfig_checks"): + dns_models.DNSRecord.objects.get_or_create_for_domain( + domain, "autoconfig", ttl) + dns_models.DNSRecord.objects.get_or_create_for_domain( + domain, "autodiscover", ttl) + condition = ( not param_tools.get_global_parameter("enable_dnsbl_checks") or options["no_dnsbl"] is True) diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index 76958ec5c..230a97b81 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -161,6 +161,31 @@ class Domain(AdminObject): else: return "success" + @cached_property + def spf_record(self): + """Return SPF record.""" + return self.dnsrecord_set.filter(type="spf").first() + + @cached_property + def dkim_record(self): + """Return DKIM record.""" + return self.dnsrecord_set.filter(type="dkim").first() + + @cached_property + def dmarc_record(self): + """Return DMARC record.""" + return self.dnsrecord_set.filter(type="dmarc").first() + + @cached_property + def autoconfig_record(self): + """Return autoconfig record.""" + return self.dnsrecord_set.filter(type="autoconfig").first() + + @cached_property + def autodiscover_record(self): + """Return autodiscover record.""" + return self.dnsrecord_set.filter(type="autodiscover").first() + @cached_property def allocated_quota(self): """Return current quota allocation.""" @@ -257,7 +282,7 @@ class Domain(AdminObject): } if self.old_dkim_key_length != self.dkim_key_length: self.dkim_public_key = "" - self.dkim_private_key_path = "" + self.dkim_private_key_path = "" super(Domain, self).save(*args, **kwargs) def delete(self, fromuser, keepdir=False): diff --git a/modoboa/admin/templates/admin/_domain_dnschecks_status.html b/modoboa/admin/templates/admin/_domain_dnschecks_status.html index 1e123a4ae..4fc6fdfec 100644 --- a/modoboa/admin/templates/admin/_domain_dnschecks_status.html +++ b/modoboa/admin/templates/admin/_domain_dnschecks_status.html @@ -11,4 +11,37 @@ {% if enable_dnsbl_checks %} DNSBL {% endif %} + {% if enable_spf_checks %} + {% if not domain.spf_record %} + SPF + {% else %} + + SPF + {% endif %} + {% endif %} + {% if enable_dkim_checks and domain.enable_dkim %} + {% if not domain.dkim_public_key %} + DKIM + {% else %} + + DKIM + {% endif %} + {% endif %} + {% if enable_dmarc_checks %} + {% if not domain.dmarc_record %} + DMARC + {% else %} + + DMARC + {% endif %} + {% endif %} + {% if enable_autoconfig_checks %} + {% if not domain.autoconfig_record and not domain.autodiscover_record %} + autoconfig + {% elif not domain.autoconfig_record or not domain.autodiscover_record %} + autoconfig + {% else %} + autoconfig + {% endif %} + {% endif %} {% endif %} diff --git a/modoboa/admin/tests/test_domain.py b/modoboa/admin/tests/test_domain.py index 81c673dcd..0f54ba663 100644 --- a/modoboa/admin/tests/test_domain.py +++ b/modoboa/admin/tests/test_domain.py @@ -453,4 +453,3 @@ class DKIMTestCase(ModoTestCase): os.unlink(key_path) call_command("modo", "manage_dkim_keys") self.assertTrue(os.path.exists(key_path)) - \ No newline at end of file diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index 1823be334..183ae8382 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -110,7 +110,7 @@ class MXTestCase(ModoTestCase): @mock.patch("socket.getaddrinfo") @mock.patch.object(dns.resolver.Resolver, "query") - def test_get_mx_list_dsn_server(self, mock_query, mock_getaddrinfo): + def test_get_mx_list_dns_server(self, mock_query, mock_getaddrinfo): """Test to get mx list from specific DNS server.""" mock_query.side_effect = utils.mock_dns_query_result mock_getaddrinfo.side_effect = utils.mock_ip_query_result @@ -133,7 +133,7 @@ class MXTestCase(ModoTestCase): get_domain_mx_list("bad-response.example.com") log.check( ("modoboa.admin", "ERROR", - _("No DNS records found for %s") + _("No DNS record found for %s") % "does-not-exist.example.com"), ("modoboa.admin", "ERROR", _("No MX record for %s") % "no-mx.example.com"), @@ -142,11 +142,11 @@ class MXTestCase(ModoTestCase): _("DNS resolution timeout, unable to query %s at the moment") % "timeout.example.com"), ("modoboa.admin", "ERROR", - _("No A record found for MX %(domain)s") - % {"domain": "no-lookup.example.com"}), + _("No DNS record found for %s") + % "does-not-exist.example.com"), ("modoboa.admin", "ERROR", - _("No AAAA record found for MX %(domain)s") - % {"domain": "no-lookup.example.com"}), + _("No DNS record found for %s") + % "does-not-exist.example.com"), ("modoboa.admin", "WARNING", _("Invalid IP address format for %(domain)s; %(addr)s") % {"domain": "bad-response.example.com", "addr": "000.0.0.0"}), @@ -225,3 +225,35 @@ class DNSBLTestCase(ModoTestCase): response = self.client.get( reverse("admin:dnsbl_domain_detail", args=[self.domain.pk])) self.assertEqual(response.status_code, 200) + + +class DNSChecksTestCase(ModoTestCase): + """A test case for DNS checks.""" + + @classmethod + def setUpTestData(cls): # NOQA:N802 + """Create some data.""" + super(DNSChecksTestCase, cls).setUpTestData() + cls.domain = factories.DomainFactory(name="dns-checks.com") + + @mock.patch("gevent.socket.gethostbyname") + @mock.patch("socket.getaddrinfo") + @mock.patch.object(dns.resolver.Resolver, "query") + def test_management_command( + self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): + """Check that command works fine.""" + mock_query.side_effect = utils.mock_dns_query_result + mock_getaddrinfo.side_effect = utils.mock_ip_query_result + mock_g_gethostbyname.return_value = "1.2.3.4" + + self.domain.enable_dkim = True + self.domain.dkim_public_key = "XXXXX" + self.domain.save(update_fields=["enable_dkim", "dkim_public_key"]) + + management.call_command("modo", "check_mx", "--no-dnsbl", "--ttl=0") + + self.assertIsNot(self.domain.spf_record, None) + self.assertIsNot(self.domain.dkim_record, None) + self.assertIsNot(self.domain.dmarc_record, None) + self.assertIsNot(self.domain.autoconfig_record, None) + self.assertIsNot(self.domain.autodiscover_record, None) diff --git a/modoboa/admin/tests/utils.py b/modoboa/admin/tests/utils.py index 6a586a3c1..f0662d5ec 100644 --- a/modoboa/admin/tests/utils.py +++ b/modoboa/admin/tests/utils.py @@ -7,7 +7,9 @@ from __future__ import unicode_literals import socket from dns.name import Name +from dns.rdtypes.IN.A import A from dns.rdtypes.ANY.MX import MX +from dns.rdtypes.ANY.TXT import TXT from dns.resolver import NXDOMAIN, NoAnswer, NoNameservers, Timeout @@ -23,8 +25,12 @@ class RRsetInvalid(object): self.address = "000.0.0.0" +_A_RECORD = A("IN", "A", "1.2.3.4") _MX_RECORD_1 = MX("IN", "MX", 10, Name("mx.example.com".split("."))) _MX_RECORD_2 = MX("IN", "MX", 10, Name("mx2.example.com".split("."))) +_SPF_RECORD = TXT("IN", "TXT", ["v=spf1 mx -all"]) +_DMARC_RECORD = TXT("IN", "TXT", ["v=DMARC1 p=reject"]) +_DKIM_RECORD = TXT("IN", "TXT", ["v=DKIM1 p=XXXXX"]) _BAD_MX_RECORD = MX("IN", "MX", 10, Name("bad-response.example.com".split("."))) _DNE_MX_RECORD = MX("IN", "MX", 10, Name( "does-not-exist.example.com".split("."))) @@ -46,6 +52,7 @@ _POSSIBLE_DNS_RESULTS = { "bad-response.example.com": [_BAD_MX_RECORD], "no-lookup.example.com": [_DNE_MX_RECORD], "no-answer.example.com": [_DNE_MX_RECORD], + "dns-checks.com": [_MX_RECORD_2], } _POSSIBLE_DNS_RESULTS_NO_MX = { @@ -54,6 +61,11 @@ _POSSIBLE_DNS_RESULTS_NO_MX = { "no-lookup.example.com": NXDOMAIN(), "no-answer.example.com": NoAnswer(), "bad-response.example.com": [RRsetInvalid()], + "dns-checks.com": [_SPF_RECORD, ], + "modoboa._domainkey.dns-checks.com": [_DKIM_RECORD], + "_dmarc.dns-checks.com": [_DMARC_RECORD, ], + "autoconfig.dns-checks.com": [_A_RECORD], + "autodiscover.dns-checks.com": [_A_RECORD], } _POSSIBLE_IP_RESULTS = { "test3.com": [_IPV4_RECORD_2], diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index 824901cbd..41642d297 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -69,23 +69,25 @@ def _domains(request): } page = get_listing_page(domainlist, request.GET.get("page", 1)) parameters = request.localconfig.parameters + dns_checks = { + "enable_mx_checks": parameters.get_value("enable_mx_checks"), + "enable_spf_checks": parameters.get_value("enable_spf_checks"), + "enable_dkim_checks": parameters.get_value("enable_dkim_checks"), + "enable_dmarc_checks": parameters.get_value("enable_dmarc_checks"), + "enable_autoconfig_checks": ( + parameters.get_value("enable_autoconfig_checks")), + "enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks") + } context["headers"] = render_to_string( - "admin/domain_headers.html", { - "enable_mx_checks": parameters.get_value("enable_mx_checks"), - "enable_dnsbl_checks": ( - parameters.get_value("enable_dnsbl_checks")) - }, request + "admin/domain_headers.html", dns_checks, request ) if page is None: context["length"] = 0 else: + tpl_context = {"domains": page.object_list} + tpl_context.update(dns_checks) context["rows"] = render_to_string( - "admin/domains_table.html", { - "domains": page.object_list, - "enable_mx_checks": parameters.get_value("enable_mx_checks"), - "enable_dnsbl_checks": ( - parameters.get_value("enable_dnsbl_checks")) - }, request + "admin/domains_table.html", tpl_context, request ) context["pages"] = [page.number] return render_to_json_response(context) @@ -104,6 +106,11 @@ def domains(request, tplname="admin/domains.html"): return render(request, tplname, { "selection": "domains", "enable_mx_checks": parameters.get_value("enable_mx_checks"), + "enable_spf_checks": parameters.get_value("enable_spf_checks"), + "enable_dkim_checks": parameters.get_value("enable_dkim_checks"), + "enable_dmarc_checks": parameters.get_value("enable_dmarc_checks"), + "enable_autoconfig_checks": ( + parameters.get_value("enable_autoconfig_checks")), "enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks") }) @@ -226,6 +233,11 @@ class DomainDetailView( context.update({ "templates": {"left": [], "right": []}, "enable_mx_checks": parameters.get_value("enable_mx_checks"), + "enable_spf_checks": parameters.get_value("enable_spf_checks"), + "enable_dkim_checks": parameters.get_value("enable_dkim_checks"), + "enable_dmarc_checks": parameters.get_value("enable_dmarc_checks"), + "enable_autoconfig_checks": ( + parameters.get_value("enable_autoconfig_checks")), "enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks"), }) for _receiver, widgets in result: diff --git a/modoboa/core/commands/templates/settings.py.tpl b/modoboa/core/commands/templates/settings.py.tpl index 3f7ec5cf8..0b16ce2ea 100644 --- a/modoboa/core/commands/templates/settings.py.tpl +++ b/modoboa/core/commands/templates/settings.py.tpl @@ -2,8 +2,6 @@ """ Django settings for {{ name }} project. -Generated by 'django-admin startproject' using Django 1.11.8. - For more information on this file, see https://docs.djangoproject.com/en/1.11/topics/settings/ @@ -82,6 +80,7 @@ MODOBOA_APPS = ( 'modoboa.relaydomains', 'modoboa.limits', 'modoboa.parameters', + 'modoboa.dnstools', # Modoboa extensions here. {% for extension in extensions %} '{{ extension }}', {% endfor %} diff --git a/modoboa/core/tests/test_views.py b/modoboa/core/tests/test_views.py index fb5e3e840..07c9606c3 100644 --- a/modoboa/core/tests/test_views.py +++ b/modoboa/core/tests/test_views.py @@ -69,7 +69,11 @@ SETTINGS_SAMPLE = { "admin-create_alias_on_mbox_rename": False, "admin-dkim_keys_storage_dir": "", "admin-dkim_default_key_length": 1024, - "admin-custom_dns_server": "193.43.55.67" + "admin-custom_dns_server": "193.43.55.67", + "admin-enable_spf_checks": True, + "admin-enable_dkim_checks": True, + "admin-enable_dmarc_checks": True, + "admin-enable_autoconfig_checks": True, } diff --git a/modoboa/dnstools/__init__.py b/modoboa/dnstools/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modoboa/dnstools/apps.py b/modoboa/dnstools/apps.py new file mode 100644 index 000000000..d13d72ef1 --- /dev/null +++ b/modoboa/dnstools/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class DnstoolsConfig(AppConfig): + name = 'dnstools' diff --git a/modoboa/dnstools/constants.py b/modoboa/dnstools/constants.py new file mode 100644 index 000000000..c579193ee --- /dev/null +++ b/modoboa/dnstools/constants.py @@ -0,0 +1,29 @@ +"""App related constants.""" + +import re + + +DNS_RECORD_TYPES = [ + ("spf", "SPF"), + ("dkim", "DKIM"), + ("dmarc", "DMARC"), + ("autoconfig", "Autoconfig"), + ("autodiscover", "Autodiscover"), +] + +SPF_MECHANISMS = ["ip4", "ip6", "a", "mx", "ptr", "exists", "include"] + +DMARC_URI_REGEX = re.compile(r"^mailto:(.+)(!\w+)?") + +DMARC_TAGS = { + "adkim": {"values": ["r", "s"]}, + "aspf": {"values": ["r", "s"]}, + "fo": {"values": ["0", "1", "d", "s"]}, + "p": {"values": ["none", "quarantine", "reject"]}, + "pct": {"type": "int", "min_value": 0, "max_value": 100}, + "rf": {"type": "list", "values": ["afrf"]}, + "ri": {"type": "int"}, + "rua": {"type": "list", "regex": DMARC_URI_REGEX}, + "ruf": {"type": "list", "regex": DMARC_URI_REGEX}, + "sp": {"values": ["none", "quarantine", "reject"]} +} diff --git a/modoboa/dnstools/factories.py b/modoboa/dnstools/factories.py new file mode 100644 index 000000000..4a0b86641 --- /dev/null +++ b/modoboa/dnstools/factories.py @@ -0,0 +1,18 @@ +"""App related factories.""" + +from __future__ import unicode_literals + +import factory + +from modoboa.admin import factories as admin_factories + +from . import models + + +class DNSRecordFactory(factory.django.DjangoModelFactory): + """Factory for dns records.""" + + class Meta: + model = models.DNSRecord + + domain = factory.SubFactory(admin_factories.DomainFactory) diff --git a/modoboa/dnstools/lib.py b/modoboa/dnstools/lib.py new file mode 100644 index 000000000..6a7e70b07 --- /dev/null +++ b/modoboa/dnstools/lib.py @@ -0,0 +1,264 @@ +"""dnstools library.""" + +from __future__ import unicode_literals + +import ipaddress + +from django.utils.translation import ugettext as _ + +from modoboa.admin import lib as admin_lib + +from . import constants + + +def get_spf_record(domain): + """Return SPF record for domain (if any).""" + records = admin_lib.get_dns_records(domain, "TXT") + if records is None: + return None + for record in records: + value = str(record).strip('"') + if value.startswith("v=spf1"): + return value + return None + + +def get_dkim_record(domain, selector): + """Return DKIM records form domain (if any).""" + name = "{}._domainkey.{}".format(selector, domain) + records = admin_lib.get_dns_records(name, "TXT") + if records is None: + return None + for record in records: + value = str(record).strip('"') + if value.startswith("v=DKIM1"): + return value + return None + + +def get_dmarc_record(domain): + """Return DMARC record for domain (if any).""" + name = "_dmarc.{}".format(domain) + records = admin_lib.get_dns_records(name, "TXT") + if records is None: + return None + for record in records: + value = str(record).strip('"') + if value.startswith("v=DMARC1"): + return value + return None + + +def _get_simple_record(name): + """We just want to know if name is declared.""" + for rdtype in ["A", "CNAME", "AAAA"]: + records = admin_lib.get_dns_records(name, rdtype) + if records is not None: + break + else: + return None + for record in records: + value = str(record).strip('"') + break + return value + + +def get_autoconfig_record(domain): + """Return autoconfig record for domain (if any).""" + return _get_simple_record("autoconfig.{}".format(domain)) + + +def get_autodiscover_record(domain): + """Return autodiscover record for domain (if any).""" + return _get_simple_record("autodiscover.{}".format(domain)) + + +class DNSSyntaxError(Exception): + """Custom exception for DNS errors.""" + + pass + + +def check_spf_ip4(value): + """Check syntax of ip4 mechanism.""" + parts = value.split(":") + if len(parts) != 2: + raise DNSSyntaxError(_("Wrong ip4 mechanism syntax")) + try: + ipaddress.ip_network(parts[1], False) + except ValueError: + raise DNSSyntaxError(_("Wrong IPv4 address format")) + + +def check_spf_ip6(value): + """Check syntax of ip6 mechanism.""" + if not value.startswith("ip6:"): + raise DNSSyntaxError(_("Wrong ip6 mechanism syntax")) + value = value.replace("ip6:", "") + try: + ipaddress.ip_network(value, False) + except ValueError: + raise DNSSyntaxError(_("Wrong IPv6 address format")) + + +def _check_domain_and_mask(value, mechanism): + """Check for valid domain / mask.""" + domain = None + mask = None + if ":" in value: + mechanism, domain = value.split(":") + if "/" in domain: + domain, mask = domain.split("/") + elif "/" in value: + mechanism, mask = value.split("/") + else: + raise DNSSyntaxError( + _("Invalid syntax for {} mechanism").format(mechanism)) + if mask and (not mask.isdigit() or int(mask) > 32): + raise DNSSyntaxError(_("Invalid mask found {}").format(mask)) + + +def check_spf_a(value): + """Check syntax of a mechanism.""" + if value == "a": + return + _check_domain_and_mask(value, "a") + + +def check_spf_mx(value): + """Check syntax of mx mechanism.""" + if value == "mx": + return + _check_domain_and_mask(value, "mx") + + +def _check_simple(value, mechanism): + """Simple check.""" + if value == mechanism: + return + parts = value.split(":") + if len(parts) != 2: + raise DNSSyntaxError( + _("Invalid syntax for {} mechanism").format(mechanism)) + + +def check_spf_ptr(value): + """Check syntax of ptr mechanism.""" + _check_simple(value, "ptr") + + +def check_spf_exists(value): + """Check syntax of ptr mechanism.""" + _check_simple(value, "exists") + + +def check_spf_include(value): + """Check syntax of include mechanism.""" + _check_simple(value, "include") + + +def check_spf_syntax(record): + """Check if record has a valid SPF syntax.""" + if not record.startswith("v=spf1"): + raise DNSSyntaxError(_("Not an SPF record")) + parts = record.split(" ")[1:] + modifiers = [] + mechanisms = [] + for part in parts: + qualifier = None + if part[0] in ["+", "-", "~", "?"]: + qualifier = part[0] + part = part[1:] + if part == "all": + continue + for mechanism in constants.SPF_MECHANISMS: + if part.startswith(mechanism): + globals()["check_spf_{}".format(mechanism)](part) + mechanisms.append(mechanism) + break + else: + # Look for modifier + modifier = part.split("=") + if len(modifier) != 2: + raise DNSSyntaxError(_("Unknown mechanism {}").format(part)) + if modifier[0] not in ["redirect", "exp"]: + raise DNSSyntaxError(_("Unknown modifier {}").format( + modifier[0])) + if modifier[0] in modifiers: + raise DNSSyntaxError(_("Duplicate modifier {} found").format( + modifier[0])) + modifiers.append(modifier[0]) + if not len(mechanisms) and not len(modifiers): + raise DNSSyntaxError(_("No mechanism found")) + return None + + +def check_dkim_syntax(record): + """Check if record has a valid DKIM syntax.""" + if not record.startswith("v=DKIM1"): + raise DNSSyntaxError(_("Not a valid DKIM record")) + key = None + for tag in record.split(";")[1:]: + tag = tag.strip(" ") + parts = tag.split("=") + if len(parts) != 2: + raise DNSSyntaxError(_("Invalid tag {}").format(tag)) + name = parts[0].strip(" ") + if name == "p": + key = "".join(part.strip('"') for part in parts[1].split(" ")) + if key is None: + raise DNSSyntaxError(_("No key found in record")) + return key + + +def check_dmarc_tag_string_value(tag, value): + """Check if value is valid for tag.""" + tdef = constants.DMARC_TAGS[tag] + error = _("Wrong value {} for tag {}").format(value, tag) + if "values" in tdef and value not in tdef["values"]: + raise DNSSyntaxError(error) + elif "regex" in tdef and tdef["regex"].match(value) is None: + raise DNSSyntaxError(error) + + +def check_dmarc_tag(tag, value): + """Check if tag is valid.""" + tdef = constants.DMARC_TAGS[tag] + ttype = tdef.get("type", "string") + if ttype == "list": + for svalue in value.split(","): + check_dmarc_tag_string_value(tag, svalue) + elif ttype == "int": + error = _("Wrong value {} for tag {}:").format(value, tag) + try: + value = int(value) + except ValueError: + raise DNSSyntaxError(error + _(" not an integer")) + if "min_value" in tdef and value < tdef["min_value"]: + raise DNSSyntaxError( + error + _(" less than {}").format(tdef["min_value"])) + if "max_value" in tdef and value > tdef["max_value"]: + raise DNSSyntaxError( + error + _(" greater than {}").format(tdef["max_value"])) + else: + check_dmarc_tag_string_value(tag, value) + + +def check_dmarc_syntax(record): + """Check if record has a valid DMARC syntax.""" + if not record.startswith("v=DMARC1"): + raise DNSSyntaxError(_("Not a valid DMARC record")) + tags = {} + for tag in record.split(";")[1:]: + tag = tag.strip(" ") + parts = tag.split("=") + if len(parts) != 2: + raise DNSSyntaxError(_("Invalid tag {}").format(tag)) + name = parts[0].strip(" ") + if name not in constants.DMARC_TAGS: + raise DNSSyntaxError(_("Unknown tag {}").format(name)) + value = parts[1].strip(" ") + check_dmarc_tag(name, value) + tags[name] = value + if "p" not in tags: + raise DNSSyntaxError(_("Missing required p tag")) diff --git a/modoboa/dnstools/locale/en/LC_MESSAGES/django.po b/modoboa/dnstools/locale/en/LC_MESSAGES/django.po new file mode 100644 index 000000000..35a9dfc02 --- /dev/null +++ b/modoboa/dnstools/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,142 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-11-20 10:22+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib.py:86 +msgid "Wrong ip4 mechanism syntax" +msgstr "" + +#: lib.py:90 +msgid "Wrong IPv4 address format" +msgstr "" + +#: lib.py:96 +msgid "Wrong ip6 mechanism syntax" +msgstr "" + +#: lib.py:101 +msgid "Wrong IPv6 address format" +msgstr "" + +#: lib.py:116 lib.py:142 +msgid "Invalid syntax for {} mechanism" +msgstr "" + +#: lib.py:118 +msgid "Invalid mask found {}" +msgstr "" + +#: lib.py:163 +msgid "Not an SPF record" +msgstr "" + +#: lib.py:183 +msgid "Unknown mechanism {}" +msgstr "" + +#: lib.py:185 +msgid "Unknown modifier {}" +msgstr "" + +#: lib.py:188 +msgid "Duplicate modifier {} found" +msgstr "" + +#: lib.py:192 +msgid "No mechanism found" +msgstr "" + +#: lib.py:199 +msgid "Not a valid DKIM record" +msgstr "" + +#: lib.py:205 lib.py:256 +msgid "Invalid tag {}" +msgstr "" + +#: lib.py:210 +msgid "No key found in record" +msgstr "" + +#: lib.py:217 +msgid "Wrong value {} for tag {}" +msgstr "" + +#: lib.py:232 +msgid "Wrong value {} for tag {}:" +msgstr "" + +#: lib.py:236 +msgid " not an integer" +msgstr "" + +#: lib.py:239 +msgid " less than {}" +msgstr "" + +#: lib.py:242 +msgid " greater than {}" +msgstr "" + +#: lib.py:250 +msgid "Not a valid DMARC record" +msgstr "" + +#: lib.py:259 +msgid "Unknown tag {}" +msgstr "" + +#: lib.py:264 +msgid "Missing required p tag" +msgstr "" + +#: models.py:79 +msgid "Public key mismatchs" +msgstr "" + +#: templates/dnstools/autoconfig_records_status.html:8 +msgid "autoconfig record (Mozilla) found: " +msgstr "" + +#: templates/dnstools/autoconfig_records_status.html:12 +msgid "autoconfig record (Mozilla) not found." +msgstr "" + +#: templates/dnstools/autoconfig_records_status.html:17 +msgid "autodiscover record (Microsoft) found: " +msgstr "" + +#: templates/dnstools/autoconfig_records_status.html:21 +msgid "autodiscover record (Microsoft) not found." +msgstr "" + +#: templates/dnstools/dns_record_detail.html:8 +msgid "A DNS record has been found and is valid." +msgstr "" + +#: templates/dnstools/dns_record_detail.html:12 +msgid "A DNS record has been found but its syntax is not valid:" +msgstr "" + +#: views.py:36 +msgid "{} record of {}" +msgstr "" + +#: views.py:64 +msgid "Auto configuration records for {}" +msgstr "" diff --git a/modoboa/dnstools/locale/fr/LC_MESSAGES/django.po b/modoboa/dnstools/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 000000000..9bda3a7fe --- /dev/null +++ b/modoboa/dnstools/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,142 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-11-20 10:22+0100\n" +"PO-Revision-Date: 2018-11-20 10:31+0100\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: lib.py:86 +msgid "Wrong ip4 mechanism syntax" +msgstr "Mauvaise syntaxe de mécanisme ip4" + +#: lib.py:90 +msgid "Wrong IPv4 address format" +msgstr "Mauvais format d'adresse IPv4" + +#: lib.py:96 +msgid "Wrong ip6 mechanism syntax" +msgstr "Mauvaise syntaxe de mécanisme ip6" + +#: lib.py:101 +msgid "Wrong IPv6 address format" +msgstr "Mauvais format d'adresse IPv6" + +#: lib.py:116 lib.py:142 +msgid "Invalid syntax for {} mechanism" +msgstr "Mauvaise syntaxe de mécanisme {}" + +#: lib.py:118 +msgid "Invalid mask found {}" +msgstr "Masque incorrect trouvé {}" + +#: lib.py:163 +msgid "Not an SPF record" +msgstr "Ce n'est pas un enregistrement SPF" + +#: lib.py:183 +msgid "Unknown mechanism {}" +msgstr "Mécanisme inconnu {}" + +#: lib.py:185 +msgid "Unknown modifier {}" +msgstr "Modificateur inconnu {}" + +#: lib.py:188 +msgid "Duplicate modifier {} found" +msgstr "Modificateur dupliqué {} trouvé" + +#: lib.py:192 +msgid "No mechanism found" +msgstr "Aucun mécanisme trouvé" + +#: lib.py:199 +msgid "Not a valid DKIM record" +msgstr "Ce n'est pas un enregistrement DKIM" + +#: lib.py:205 lib.py:256 +msgid "Invalid tag {}" +msgstr "Tag incorrect {}" + +#: lib.py:210 +msgid "No key found in record" +msgstr "Pas de clé trouvée dans l'enregistrement" + +#: lib.py:217 +msgid "Wrong value {} for tag {}" +msgstr "Mauvaise valeur {} pour le tag {}" + +#: lib.py:232 +msgid "Wrong value {} for tag {}:" +msgstr "Mauvaise valuer {} pour le tag {} :" + +#: lib.py:236 +msgid " not an integer" +msgstr " ce n'est pas un entier" + +#: lib.py:239 +msgid " less than {}" +msgstr " inférieur à {}" + +#: lib.py:242 +msgid " greater than {}" +msgstr " supérieur à {}" + +#: lib.py:250 +msgid "Not a valid DMARC record" +msgstr "Ce n'est pas un enregistrement DMARC" + +#: lib.py:259 +msgid "Unknown tag {}" +msgstr "Tag inconnu {}" + +#: lib.py:264 +msgid "Missing required p tag" +msgstr "Tag obligatoire p introuvable" + +#: models.py:79 +msgid "Public key mismatchs" +msgstr "La clé publique ne correspond pas" + +#: templates/dnstools/autoconfig_records_status.html:8 +msgid "autoconfig record (Mozilla) found: " +msgstr "Enregistrement autoconfig (Mozilla) trouvé :" + +#: templates/dnstools/autoconfig_records_status.html:12 +msgid "autoconfig record (Mozilla) not found." +msgstr "Enregistrement autoconfig (Mozilla) introuvable." + +#: templates/dnstools/autoconfig_records_status.html:17 +msgid "autodiscover record (Microsoft) found: " +msgstr "Enregistrement autodiscover (Microsoft) trouvé :" + +#: templates/dnstools/autoconfig_records_status.html:21 +msgid "autodiscover record (Microsoft) not found." +msgstr "Enregistrement autodiscover (Microsoft) introuvable." + +#: templates/dnstools/dns_record_detail.html:8 +msgid "A DNS record has been found and is valid." +msgstr "Un enregistrement DNS a été trouvé et est correct." + +#: templates/dnstools/dns_record_detail.html:12 +msgid "A DNS record has been found but its syntax is not valid:" +msgstr "Un enregistrement DNS a été trouvé mais sa syntaxe est incorrecte :" + +#: views.py:36 +msgid "{} record of {}" +msgstr "Enregistrement {} de {}" + +#: views.py:64 +msgid "Auto configuration records for {}" +msgstr "Enregistrements d'autoconfiguration pour {}" diff --git a/modoboa/dnstools/migrations/0001_initial.py b/modoboa/dnstools/migrations/0001_initial.py new file mode 100644 index 000000000..6fd8e9891 --- /dev/null +++ b/modoboa/dnstools/migrations/0001_initial.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2018-11-19 10:07 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('admin', '0014_auto_20181017_1628'), + ] + + operations = [ + migrations.CreateModel( + name='DNSRecord', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('type', models.CharField(choices=[('spf', 'SPF'), ('dkim', 'DKIM'), ('dmarc', 'DMARC'), ('autoconfig', 'Autoconfig'), ('autodiscover', 'Autodiscover')], max_length=15)), + ('value', models.TextField(blank=True)), + ('is_valid', models.BooleanField(default=False)), + ('error', models.CharField(blank=True, max_length=50, null=True)), + ('updated', models.DateTimeField(default=django.utils.timezone.now)), + ('domain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='admin.Domain')), + ], + ), + ] diff --git a/modoboa/dnstools/migrations/__init__.py b/modoboa/dnstools/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modoboa/dnstools/models.py b/modoboa/dnstools/models.py new file mode 100644 index 000000000..9c2ad4c79 --- /dev/null +++ b/modoboa/dnstools/models.py @@ -0,0 +1,85 @@ +"""App related models.""" + +from __future__ import unicode_literals + +import datetime + +from django.db import models +from django.utils import timezone +from django.utils.encoding import python_2_unicode_compatible +from django.utils.translation import ugettext as _ + +from . import constants +from . import lib + + +class DNSRecordManager(models.Manager): + """Custom manager for DNSRecord.""" + + def get_or_create_for_domain(self, domain, rtype, ttl=7200): + """Get or create DNS record for given domain. + + DNS queries are not performed while `ttl` (in seconds) is still valid. + """ + now = timezone.now() + record = self.get_queryset().filter( + domain=domain, type=rtype, updated__gt=now).first() + if record: + return record + + self.get_queryset().filter(domain=domain, type=rtype).delete() + record = DNSRecord(domain=domain, type=rtype) + record.get_dns_record() + if not record.value: + return + record.check_syntax(ttl) + record.save() + return record + + +@python_2_unicode_compatible +class DNSRecord(models.Model): + """A model to store DNS records for Domain.""" + + domain = models.ForeignKey("admin.Domain", on_delete=models.CASCADE) + type = models.CharField( + max_length=15, choices=constants.DNS_RECORD_TYPES) + value = models.TextField(blank=True) + is_valid = models.BooleanField(default=False) + error = models.CharField(max_length=50, null=True, blank=True) + updated = models.DateTimeField(default=timezone.now) + + objects = DNSRecordManager() + + def __str__(self): + return "{} ({}): {}".format(self.domain, self.type, self.value) + + def get_dns_record(self): + """Retrieve corresponding DNS record.""" + if self.type == "dkim": + self.value = lib.get_dkim_record( + self.domain.name, self.domain.dkim_key_selector) + else: + func = getattr(lib, "get_{}_record".format(self.type)) + self.value = func(self.domain.name) + + def check_syntax(self, ttl=7200): + """Check record syntax.""" + try: + func = getattr(lib, "check_{}_syntax".format(self.type)) + result = func(self.value) + except lib.DNSSyntaxError as err: + self.error = str(err) + self.updated = timezone.now() + return + except AttributeError: + pass + + if self.type == "dkim" and result != self.dkim_public_key: + self.error = _("Public key mismatchs") + self.updated = timezone.now() + return + + self.error = "" + self.is_valid = True + self.updated = timezone.now() + datetime.timedelta(seconds=ttl) diff --git a/modoboa/dnstools/templates/dnstools/autoconfig_records_status.html b/modoboa/dnstools/templates/dnstools/autoconfig_records_status.html new file mode 100644 index 000000000..d8fe9959d --- /dev/null +++ b/modoboa/dnstools/templates/dnstools/autoconfig_records_status.html @@ -0,0 +1,24 @@ +{% extends "common/generic_modal.html" %} + +{% load i18n %} + +{% block modalbody %} + {% if object.autoconfig_record %} +
+ {% trans "autoconfig record (Mozilla) found: "%} {{ object.autoconfig_record.value }}. +
+ {% else %} +
+ {% trans "autoconfig record (Mozilla) not found." %} +
+ {% endif %} + {% if object.autodiscover_record %} +
+ {% trans "autodiscover record (Microsoft) found: " %} {{ object.autodiscover_record.value }}. +
+ {% else %} +
+ {% trans "autodiscover record (Microsoft) not found." %} +
+ {% endif %} +{% endblock %} diff --git a/modoboa/dnstools/templates/dnstools/dns_record_detail.html b/modoboa/dnstools/templates/dnstools/dns_record_detail.html new file mode 100644 index 000000000..dccd8066b --- /dev/null +++ b/modoboa/dnstools/templates/dnstools/dns_record_detail.html @@ -0,0 +1,16 @@ +{% extends "common/generic_modal.html" %} + +{% load i18n %} + +{% block modalbody %} + {% if object.is_valid %} +
+ {% trans "A DNS record has been found and is valid." %} +
+ {% else %} +
+ {% trans "A DNS record has been found but its syntax is not valid:" %} + {{ object.error }} +
+ {% endif %} +{% endblock %} diff --git a/modoboa/dnstools/tests.py b/modoboa/dnstools/tests.py new file mode 100644 index 000000000..b0f7613c7 --- /dev/null +++ b/modoboa/dnstools/tests.py @@ -0,0 +1,150 @@ +"""App related tests.""" + +from django.urls import reverse +from django.test import SimpleTestCase + +from modoboa.lib.tests import ModoTestCase + +from . import factories +from . import lib + + +BAD_SPF_RECORDS = [ + ("a mx ~all", "Not an SPF record"), + ("v=spf1 toto ~all", "Unknown mechanism toto"), + ("v=spf1 ip4 -all", "Wrong ip4 mechanism syntax"), + ("v=spf1 +ip4:1.1.1. +all", "Wrong IPv4 address format"), + ("v=spf1 ip6 ~all", "Wrong ip6 mechanism syntax"), + ("v=spf1 +ip6:x:: +all", "Wrong IPv6 address format"), + ("v=spf1 a|domain.com ~all", "Invalid syntax for a mechanism"), + ("v=spf1 a:domain.com/TOTO", "Invalid mask found TOTO"), + ("v=spf1 a/1000", "Invalid mask found 1000"), + ("v=spf1 mx:domain.com/TOTO", "Invalid mask found TOTO"), + ("v=spf1 mx/1000", "Invalid mask found 1000"), + ("v=spf1 ptr|test.com", "Invalid syntax for ptr mechanism"), + ("v=spf1 forward=test.com ~all", "Unknown modifier forward"), + ("v=spf1 redirect=test.com redirect=test.com ~all", + "Duplicate modifier redirect found"), + ("v=spf1", "No mechanism found"), +] + +GOOD_SPF_RECORDS = [ + "v=spf1 mx", + "v=spf1 a ~all", + "v=spf1 ip4:1.2.3.4 -all", + "v=spf1 ip4:1.2.3.4/16 -all", + "v=spf1 ip6:fe80::9eb6:d0ff:fe8e:2807 -all", + "v=spf1 ip6:fe80::9eb6:d0ff:fe8e:2807/64 -all", + "v=spf1 a -all", + "v=spf1 a:example.com -all", + "v=spf1 a:mailers.example.com -all", + "v=spf1 a/24 a:offsite.example.com/24 -all", + "v=spf1 mx mx:deferrals.domain.com -all", + "v=spf1 mx/24 mx:offsite.domain.com/24 -all", + "v=spf1 ptr -all", + "v=spf1 ptr:otherdomain.com -all", + "v=spf1 exists:example.com -all", + "v=spf1 include:example.com -all", + "v=spf1 ?include:example.com -all", + "v=spf1 redirect=example.com", + "v=spf1 exp=example.com", +] + +BAD_DMARC_RECORDS = [ + ("", "Not a valid DMARC record"), + ("v=DMARC1; test", "Invalid tag test"), + ("v=DMARC1; test=toto", "Unknown tag test"), + ("v=DMARC1; adkim=g", "Wrong value g for tag adkim"), + ("v=DMARC1; rua=mail:toto@test.com", + "Wrong value mail:toto@test.com for tag rua"), + ("v=DMARC1; rf=afrf,toto", "Wrong value toto for tag rf"), + ("v=DMARC1; ri=XXX", "Wrong value XXX for tag ri: not an integer"), + ("v=DMARC1; pct=-1", "Wrong value -1 for tag pct: less than 0"), + ("v=DMARC1; pct=1000", "Wrong value 1000 for tag pct: greater than 100"), + ("v=DMARC1; pct=100", "Missing required p tag"), +] + +GOOD_DMARC_RECORDS = [ + "v=DMARC1; p=reject; pct=100", + "v=DMARC1; p=quarantine; sp=none; adkim=s; aspf=s; " + "rua=mailto:dmarc-aggrep@ngyn.org; ruf=mailto:toto@test.com!24m; " + "rf=afrf; pct=100; ri=86400" +] + +BAD_DKIM_RECORDS = [ + ("", "Not a valid DKIM record"), + ("v=DKIM1; toto;p=XXX", "Invalid tag toto"), + ("v=DKIM1;k=rsa", "No key found in record"), +] + + +class TestCase(SimpleTestCase): + """Test test library.""" + + def test_check_spf_syntax(self): + for record in BAD_SPF_RECORDS: + with self.assertRaises(lib.DNSSyntaxError) as ctx: + lib.check_spf_syntax(record[0]) + self.assertEqual(str(ctx.exception), record[1]) + for record in GOOD_SPF_RECORDS: + lib.check_spf_syntax(record) + + def test_check_dmarc_syntax(self): + for record in BAD_DMARC_RECORDS: + with self.assertRaises(lib.DNSSyntaxError) as ctx: + lib.check_dmarc_syntax(record[0]) + self.assertEqual(str(ctx.exception), record[1]) + for record in GOOD_DMARC_RECORDS: + lib.check_dmarc_syntax(record) + + def test_check_dkim_syntax(self): + for record in BAD_DKIM_RECORDS: + with self.assertRaises(lib.DNSSyntaxError) as ctx: + lib.check_dkim_syntax(record[0]) + self.assertEqual(str(ctx.exception), record[1]) + key = lib.check_dkim_syntax("v=DKIM1;p=XXX123") + self.assertEqual(key, "XXX123") + + +class ViewsTestCase(ModoTestCase): + """A test case for views.""" + + @classmethod + def setUpTestData(cls): + """Create some records.""" + super(ViewsTestCase, cls).setUpTestData() + cls.spf_rec = factories.DNSRecordFactory( + type="spf", value="v=SPF1 mx -all", is_valid=True, + domain__name="test.com" + ) + cls.dmarc_rec = factories.DNSRecordFactory( + type="dmarc", value="XXX", is_valid=False, + error="Not a DMARC record", + domain__name="test.com" + ) + cls.dkim_rec = factories.DNSRecordFactory( + type="dkim", value="12345", is_valid=False, + error="Public key mismatchs", + domain__name="test.com" + ) + cls.ac_rec = factories.DNSRecordFactory( + type="autoconfig", value="1.2.3.4", is_valid=True, + domain__name="test.com" + ) + + def test_record_detail_view(self): + url = reverse("dnstools:dns_record_detail", args=[self.spf_rec.pk]) + response = self.client.get(url) + self.assertContains( + response, "A DNS record has been found and is valid") + url = reverse("dnstools:dns_record_detail", args=[self.dmarc_rec.pk]) + response = self.client.get(url) + self.assertContains(response, "Not a DMARC record") + + def test_autoconfig_record_status_view(self): + url = reverse( + "dnstools:autoconfig_records_status", args=[self.ac_rec.domain.pk]) + response = self.client.get(url) + self.assertContains(response, "autoconfig record (Mozilla) found") + self.assertContains( + response, "autodiscover record (Microsoft) not found") diff --git a/modoboa/dnstools/urls.py b/modoboa/dnstools/urls.py new file mode 100644 index 000000000..b7c1f8496 --- /dev/null +++ b/modoboa/dnstools/urls.py @@ -0,0 +1,14 @@ +"""App related urls.""" + +from django.conf.urls import url + +from . import views + + +urlpatterns = [ + url(r'^dnsrecords/(?P\d+)/$', views.DNSRecordDetailView.as_view(), + name="dns_record_detail"), + url(r'^dnsrecords/autoconfig/(?P\d+)/$', + views.AutoConfigRecordsStatusView.as_view(), + name="autoconfig_records_status"), +] diff --git a/modoboa/dnstools/views.py b/modoboa/dnstools/views.py new file mode 100644 index 000000000..b6ea4c9c0 --- /dev/null +++ b/modoboa/dnstools/views.py @@ -0,0 +1,67 @@ +"""App related views.""" + +from django.utils.translation import ugettext as _ +from django.views import generic + +from django.contrib.auth import mixins as auth_mixins + +from modoboa.admin import models as admin_models + +from . import models + + +class DomainAccessRequiredMixin(auth_mixins.AccessMixin): + """Check if user can access domain.""" + + def dispatch(self, request, *args, **kwargs): + if not request.user.can_access(self.get_object()): + return self.handle_no_permission() + return super(DomainAccessRequiredMixin, self).dispatch( + request, *args, **kwargs) + + +class DNSRecordDetailView( + auth_mixins.LoginRequiredMixin, + DomainAccessRequiredMixin, + generic.DetailView): + """View to display MX records.""" + + model = models.DNSRecord + template_name = "dnstools/dns_record_detail.html" + + def get_context_data(self, **kwargs): + """Add extra variables.""" + context = super(DNSRecordDetailView, self).get_context_data(**kwargs) + context.update({ + "title": _("{} record of {}").format( + self.object.type.upper(), self.object.domain) + }) + return context + + +class AutoConfigRecordsStatusView( + auth_mixins.LoginRequiredMixin, + auth_mixins.PermissionRequiredMixin, + generic.DetailView): + """Autoconfig records status view.""" + + model = admin_models.Domain + permission_required = "admin.view_domain" + template_name = "dnstools/autoconfig_records_status.html" + + def get_queryset(self): + """Add some prefetching.""" + return ( + admin_models.Domain.objects.get_for_admin(self.request.user) + .prefetch_related("dnsrecord_set") + ) + + def get_context_data(self, **kwargs): + """Add extra data to context.""" + context = super(AutoConfigRecordsStatusView, self).get_context_data( + **kwargs) + context.update({ + "title": _("Auto configuration records for {}").format( + self.object.name) + }) + return context diff --git a/modoboa/urls.py b/modoboa/urls.py index 650816886..e8fe24b79 100644 --- a/modoboa/urls.py +++ b/modoboa/urls.py @@ -29,6 +29,7 @@ urlpatterns = [ url("", include("modoboa.core.urls", namespace="core")), url("^user/forward/", forward, name="user_forward"), url("admin/", include("modoboa.admin.urls", namespace="admin")), + url("dnstools/", include("modoboa.dnstools.urls", namespace="dnstools")), # No namespace url(r'^accounts/password_reset/$', core_views.password_reset, name="password_reset"), diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index 364b38f22..3c20ea65a 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -69,6 +69,7 @@ MODOBOA_APPS = ( "modoboa.relaydomains", "modoboa.limits", "modoboa.parameters", + "modoboa.dnstools", # Modoboa extensions here. )