From ac00c8e1959098cb1cc960c7ace8426881d5b82f Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Tue, 21 Oct 2014 21:40:52 +0200 Subject: [PATCH 01/27] Initial work about SA training from quarantine content. see #622 --- modoboa/extensions/amavis/app_settings.py | 42 +++++++++- .../extensions/amavis/general_callbacks.py | 27 ++++-- modoboa/extensions/amavis/lib.py | 84 +++++++++++++++---- .../amavis/static/amavis/js/quarantine.js | 54 ++++++++++-- .../templates/amavis/main_action_bar.html | 9 ++ .../amavis/templatetags/amavis_tags.py | 20 ++++- modoboa/extensions/amavis/urls.py | 4 +- modoboa/extensions/amavis/views.py | 69 ++++++++++++++- modoboa/lib/sysutils.py | 16 ++-- modoboa/static/js/global.js | 4 +- 10 files changed, 288 insertions(+), 41 deletions(-) diff --git a/modoboa/extensions/amavis/app_settings.py b/modoboa/extensions/amavis/app_settings.py index 9d933476c..de5c43b77 100644 --- a/modoboa/extensions/amavis/app_settings.py +++ b/modoboa/extensions/amavis/app_settings.py @@ -17,7 +17,7 @@ class ParametersForm(AdminParametersForm): ) sep1 = SeparatorField(label=_("Messages releasing")) - + released_msgs_cleanup = YesNoField( label=_("Remove released messages"), initial="no", @@ -49,7 +49,7 @@ class ParametersForm(AdminParametersForm): initial="/var/amavis/amavisd.sock", help_text=_("Path to the PDP server socket (if unix mode)") ) - + check_requests_interval = forms.IntegerField( label=_("Check requests interval"), initial=30, @@ -74,10 +74,46 @@ class ParametersForm(AdminParametersForm): help_text=_("The e-mail address used to send notitications") ) + lsep = SeparatorField(label=_("Learning from messages")) + + amavis_is_local = YesNoField( + label=_("Is amavis local?"), + initial="yes", + help_text=_("Tell if amavis is running on the same server than modoboa") + ) + + default_user = forms.CharField( + label=_("Default user"), + initial="amavis", + help_text=_( + "Name of the user used to store default bayesian filter data" + ) + ) + + per_user_bayesian_filter = YesNoField( + label=_("Enable per-user bayesian filters?"), + initial="no", + help_text=_("Allow users to personally train spamassassin") + ) + + spamd_address = forms.CharField( + label=_("Spamd address"), + initial="127.0.0.1", + help_text=_("The IP address where spamd can be reached") + ) + + spamd_port = forms.IntegerField( + label=_("Spamd port"), + initial=783, + help_text=_("The TCP port spamd is listening on") + ) + visibility_rules = { "am_pdp_host": "am_pdp_mode=inet", "am_pdp_port": "am_pdp_mode=inet", - "am_pdp_socket": "am_pdp_mode=unix" + "am_pdp_socket": "am_pdp_mode=unix", + "spamd_address": "amavis_is_local=no", + "spamd_port": "amavis_is_local=no", } diff --git a/modoboa/extensions/amavis/general_callbacks.py b/modoboa/extensions/amavis/general_callbacks.py index ce2f76e91..1ef740e64 100644 --- a/modoboa/extensions/amavis/general_callbacks.py +++ b/modoboa/extensions/amavis/general_callbacks.py @@ -23,22 +23,27 @@ def menu(target, user): @events.observe("DomainCreated") def on_domain_created(user, domain): - create_user_and_policy(domain.name) + create_user_and_policy("@{0}".format(domain.name)) @events.observe("DomainModified") def on_domain_modified(domain): - update_user_and_policy(domain.oldname, domain.name) + update_user_and_policy( + "@{0}".format(domain.oldname), + "@{0}".format(domain.name) + ) @events.observe("DomainDeleted") def on_domain_deleted(domain): - delete_user_and_policy(domain.name) + delete_user_and_policy("@{0}".format(domain.name)) @events.observe("DomainAliasCreated") def on_domain_alias_created(user, domainalias): - create_user_and_use_policy(domainalias.name, domainalias.target.name) + create_user_and_use_policy( + "@{0}".format(domainalias.name), domainalias.target.name + ) @events.observe("DomainAliasDeleted") @@ -46,7 +51,19 @@ def on_domain_alias_deleted(domainaliases): if isinstance(domainaliases, DomainAlias): domainaliases = [domainaliases] for domainalias in domainaliases: - delete_user(domainalias.name) + delete_user("@{0}".format(domainalias.name)) + + +@events.observe("MailboxCreated") +def on_mailbox_created(user, mailbox): + """Create amavis records for the new mailbox.""" + create_user_and_policy(mailbox.full_address) + + +@events.observe("MailboxDeleted") +def on_mailbox_deleted(mailbox): + """Delete amavis records related to this mailbox.""" + delete_user_and_policy(mailbox.full_address) @events.observe("GetStaticContent") diff --git a/modoboa/extensions/amavis/lib.py b/modoboa/extensions/amavis/lib.py index 20f02a6c3..118687f4f 100644 --- a/modoboa/extensions/amavis/lib.py +++ b/modoboa/extensions/amavis/lib.py @@ -1,13 +1,17 @@ # coding: utf-8 -import socket -import re -import struct -import string + from functools import wraps -from django.core.urlresolvers import reverse +import re +import socket +import string +import struct + from django.utils.translation import ugettext as _ +from django.core.urlresolvers import reverse + from modoboa.lib import parameters from modoboa.lib.exceptions import InternalError +from modoboa.lib.sysutils import exec_cmd from modoboa.lib.webutils import NavigationParameters from modoboa.extensions.amavis.models import Users, Policy @@ -80,6 +84,58 @@ recipient=%s return False +class SpamassassinClient(object): + + """A stupid spamassassin client.""" + + def __init__(self, username=None): + """Constructor.""" + self._amavis_is_local = parameters.get_admin("AMAVIS_IS_LOCAL") + if username is None: + self._username = parameters.get_admin("DEFAULT_USER") + else: + self._username = username + self.error = None + if self._amavis_is_local == "yes": + self._learn_cmd = "sa-learn --{0} --no-sync -u {1}" + self._learn_cmd_kwargs = {} + # self._learn_cmd_kwargs = { + # "sudo_user": parameters.get_admin("AMAVIS_SYSTEM_USER") + # } + self._expected_exit_codes = [0] + else: + self._learn_cmd = "spamc -d {0} -p {1}".format( + parameters.get_admin("SPAMD_ADDRESS"), + parameters.get_admin("SPAMD_PORT") + ) + self._learn_cmd += " -L {0} -u {1}" + self._learn_cmd_kwargs = {} + self._expected_exit_codes = [5, 6] + + def _learn(self, msg, mtype): + """Internal method to call the learning command.""" + cmd = self._learn_cmd.format(mtype, self._username) + code, output = exec_cmd(cmd, pinput=msg, **self._learn_cmd_kwargs) + if code in self._expected_exit_codes: + return True + self.error = output + return False + + def learn_spam(self, msg): + """Learn new spam.""" + return self._learn(msg, "spam") + + def learn_ham(self, msg): + """Learn new ham.""" + return self._learn(msg, "ham") + + def done(self): + """Call this method at the end of the processing.""" + if self._amavis_is_local: + exec_cmd("sa-learn -u {0} --sync".format(self._username), + **self._learn_cmd_kwargs) + + class QuarantineNavigationParameters(NavigationParameters): """ Specific NavigationParameters subclass for the quarantine. @@ -114,7 +170,7 @@ class QuarantineNavigationParameters(NavigationParameters): return url -def create_user_and_policy(name): +def create_user_and_policy(name, priority=7): """Create records. Create two records (a user and a policy) using :keyword:`name` as @@ -124,12 +180,11 @@ def create_user_and_policy(name): """ policy = Policy.objects.create(policy_name=name[:32]) Users.objects.create( - email="@%s" % name, fullname=name, - priority=7, policy=policy + email=name, fullname=name, priority=priority, policy=policy ) -def create_user_and_use_policy(name, policy_name): +def create_user_and_use_policy(name, policy_name, priority=7): """Create a *users* record and use an existing policy. :param str name: user record name @@ -137,8 +192,7 @@ def create_user_and_use_policy(name, policy_name): """ policy = Policy.objects.get(policy_name=policy_name[:32]) Users.objects.create( - email="@%s" % name, fullname=name, - priority=7, policy=policy + email=name, fullname=name, priority=priority, policy=policy ) @@ -150,8 +204,8 @@ def update_user_and_policy(oldname, newname): """ if oldname == newname: return - u = Users.objects.get(email="@%s" % oldname) - u.email = "@%s" % newname + u = Users.objects.get(email=oldname) + u.email = newname u.fullname = newname u.policy.policy_name = newname[:32] u.policy.save() @@ -164,7 +218,7 @@ def delete_user_and_policy(name): :param str name: identifier """ try: - u = Users.objects.get(email="@%s" % name) + u = Users.objects.get(email=name) except Users.DoesNotExist: return u.policy.delete() @@ -177,6 +231,6 @@ def delete_user(name): :param str name: user record name """ try: - Users.objects.get(email="@%s" % name).delete() + Users.objects.get(email=name).delete() except Users.DoesNotExist: pass diff --git a/modoboa/extensions/amavis/static/amavis/js/quarantine.js b/modoboa/extensions/amavis/static/amavis/js/quarantine.js index cb8c88db2..905016fc9 100644 --- a/modoboa/extensions/amavis/static/amavis/js/quarantine.js +++ b/modoboa/extensions/amavis/static/amavis/js/quarantine.js @@ -62,10 +62,18 @@ Quarantine.prototype = { $.proxy(this.release_selection, this)); $(document).on("click", "a[name=delete-multi]", $.proxy(this.delete_selection, this)); + $(document).on("click", "a[name=mark-as-spam-multi]", + $.proxy(this.mark_selection_as_spam, this)); + $(document).on("click", "a[name=mark-as-ham-multi]", + $.proxy(this.mark_selection_as_ham, this)); $(document).on("click", "a[name=viewrequests]", $.proxy(this.view_requests, this)); $(document).on("click", "a[name=release]", $.proxy(this.release, this)); $(document).on("click", "a[name=delete]", $.proxy(this.delete, this)); + $(document).on("click", "a[name=mark-as-spam]", + $.proxy(this.mark_as_spam, this)); + $(document).on("click", "a[name=mark-as-ham]", + $.proxy(this.mark_as_ham, this)); $(document).on("click", "a[name=headers]", $.proxy(this.headers, this)); $(document).on("click", "td[name=type] span", $.proxy(this.filter_by_type, this)); $(document).on("click", "#filters button", $.proxy(this.filter_by_type, this)); @@ -191,6 +199,26 @@ Quarantine.prototype = { this._send_selection(e, "delete", gettext("Delete this selection?")); }, + /** + * Mark the current selection as spam. + * + * @param {Object} e - event object + */ + mark_selection_as_spam: function(e) { + this._send_selection( + e, "mark_as_spam", gettext("Mark this selection as spam?")); + }, + + /** + * Mark the current selection as ham. + * + * @param {Object} e - event object + */ + mark_selection_as_ham: function(e) { + this._send_selection( + e, "mark_as_ham", gettext("Mark this selection as non-spam?")); + }, + _send_action: function(e, message) { var $link = get_target(e, "a"); @@ -206,7 +234,7 @@ Quarantine.prototype = { }).done($.proxy(this.action_cb, this)); }, - release: function(e) { + release : function(e) { this._send_action(e, gettext("Release this message?")); }, @@ -214,6 +242,24 @@ Quarantine.prototype = { this._send_action(e, gettext("Delete this message?")); }, + /** + * Mark the current message as spam. + * + * @param {Object} e - event object + */ + mark_as_spam: function(e) { + this._send_action(e, gettext("Mark as spam?")); + }, + + /** + * Mark the current message as ham. + * + * @param {Object} e - event object + */ + mark_as_ham: function(e) { + this._send_action(e, gettext("Mark as non-spam?")); + }, + show_rawheaders: function($mailcontent) { $mailcontent.find("#rawheaders").removeClass("hidden"); $mailcontent.find("#emailheaders").addClass("hidden"); @@ -261,15 +307,13 @@ Quarantine.prototype = { }, activate_buttons: function($tr) { - $("a[name=release-multi]").removeClass('disabled'); - $("a[name=delete-multi]").removeClass('disabled'); + $("a[name*=-multi]").removeClass('disabled'); $("#selectall").prop('checked', true); }, deactivate_buttons: function($tr) { if (!this.htmltable || !this.htmltable.current_selection().length) { - $("a[name=release-multi]").addClass('disabled'); - $("a[name=delete-multi]").addClass('disabled'); + $("a[name*=-multi]").addClass('disabled'); $("#selectall").prop('checked', false); } }, diff --git a/modoboa/extensions/amavis/templates/amavis/main_action_bar.html b/modoboa/extensions/amavis/templates/amavis/main_action_bar.html index 709460220..3b3684f03 100644 --- a/modoboa/extensions/amavis/templates/amavis/main_action_bar.html +++ b/modoboa/extensions/amavis/templates/amavis/main_action_bar.html @@ -23,6 +23,15 @@ {% trans "Delete" %} +
+ + +
{% include "common/email_searchbar.html" with extraopts=extraopts %}
diff --git a/modoboa/extensions/amavis/templatetags/amavis_tags.py b/modoboa/extensions/amavis/templatetags/amavis_tags.py index d5b0ec620..187cbe997 100644 --- a/modoboa/extensions/amavis/templatetags/amavis_tags.py +++ b/modoboa/extensions/amavis/templatetags/amavis_tags.py @@ -2,8 +2,6 @@ from django import template from django.template.loader import render_to_string from django.utils.translation import ugettext as _ from django.core.urlresolvers import reverse -from django.conf import settings -from modoboa.lib.webutils import _render_to_string register = template.Library() @@ -23,8 +21,24 @@ def viewm_menu(mail_id, rcpt): "url": reverse('modoboa.extensions.amavis.views.delete', args=[mail_id]) + ("?rcpt=%s" % rcpt if rcpt else ""), "label": _("Delete")}, + {"name": "process", + "img": "icon-cog", + "menu": [ + {"name": "mark-as-spam", + "label": _("Mark as spam"), + "url": reverse( + "modoboa.extensions.amavis.views.mark_as_spam", args=[mail_id] + ) + ("?rcpt=%s" % rcpt if rcpt else "")}, + {"name": "mark-as-ham", + "label": _("Mark as non-spam"), + "url": reverse( + "modoboa.extensions.amavis.views.mark_as_ham", args=[mail_id] + ) + ("?rcpt=%s" % rcpt if rcpt else "")} + ]}, {"name": "headers", - "url": reverse('modoboa.extensions.amavis.views.viewheaders', args=[mail_id]), + "url": reverse( + 'modoboa.extensions.amavis.views.viewheaders', args=[mail_id] + ), "label": _("View full headers")}, ] diff --git a/modoboa/extensions/amavis/urls.py b/modoboa/extensions/amavis/urls.py index 6c79062ee..806f62f38 100644 --- a/modoboa/extensions/amavis/urls.py +++ b/modoboa/extensions/amavis/urls.py @@ -9,6 +9,8 @@ urlpatterns = patterns( (r'^nbrequests/$', 'nbrequests'), (r'^delete/(?P[\w\-\+]+)/$', 'delete'), (r'^release/(?P[\w\-\+]+)/$', 'release'), + (r'^markspam/(?P[\w\-\+]+)/$', 'mark_as_spam'), + (r'^markham/(?P[\w\-\+]+)/$', 'mark_as_ham'), (r'^(?P[\w\-\+]+)/$', 'viewmail'), (r'^(?P[\w\-\+]+)/headers/$', 'viewheaders'), - ) +) diff --git a/modoboa/extensions/amavis/views.py b/modoboa/extensions/amavis/views.py index 76fc990ec..5cd084222 100644 --- a/modoboa/extensions/amavis/views.py +++ b/modoboa/extensions/amavis/views.py @@ -17,7 +17,10 @@ from modoboa.extensions.admin.models import Mailbox, Domain from modoboa.extensions.amavis.templatetags.amavis_tags import ( quar_menu, viewm_menu ) -from .lib import selfservice, AMrelease, QuarantineNavigationParameters +from .lib import ( + selfservice, AMrelease, QuarantineNavigationParameters, + SpamassassinClient +) from .models import Msgrcpt from .sql_connector import get_connector from .sql_listing import SQLlisting, SQLemail @@ -254,11 +257,67 @@ def release(request, mail_id): ) +def mark_messages(request, selection, mtype): + """Mark a selection of messages as spam. + + :param str selection: message unique identifier + :param str mtype: type of marking (spam or ham) + """ + selection = check_mail_id(request, selection) + connector = get_connector() + per_user_bayesian_filter = parameters.get_admin("PER_USER_BAYESIAN_FILTER") + if per_user_bayesian_filter == "yes" \ + and request.user.group == "SimpleUsers": + username = request.user.email + else: + username = None + saclient = SpamassassinClient(username) + for item in selection: + rcpt, mail_id = item.split() + content = "".join( + [msg.mail_text for msg in connector.get_mail_content(mail_id)] + ) + result = saclient.learn_spam(content) if mtype == "spam" \ + else saclient.learn_ham(content) + if not result: + break + if saclient.error is None: + saclient.done() + message = ungettext("%(count)d message processed successfully", + "%(count)d messages processed successfully", + len(selection)) % {"count": len(selection)} + else: + message = saclient.error + return ajax_response( + request, "ko" if saclient.error else "ok", respmsg=message, + url=QuarantineNavigationParameters(request).back_to_listing() + ) + + +@login_required +def mark_as_spam(request, mail_id): + """Mark a single message as spam.""" + return mark_messages(request, mail_id, "spam") + + +@login_required +def mark_as_ham(request, mail_id): + """Mark a single message as ham.""" + return mark_messages(request, mail_id, "ham") + + @login_required def process(request): + """Process a selection of messages. + + The request must specify an action to execute against the + selection. + + """ + action = request.POST.get("action", None) ids = request.POST.get("selection", "") ids = ids.split(",") - if not len(ids): + if not ids or action is None: return HttpResponseRedirect(reverse(index)) if request.POST["action"] == "release": @@ -267,6 +326,12 @@ def process(request): if request.POST["action"] == "delete": return delete(request, ids) + if request.POST["action"] == "mark_as_spam": + return mark_messages(request, ids, "spam") + + if request.POST["action"] == "mark_as_ham": + return mark_messages(request, ids, "ham") + @login_required @user_passes_test(lambda u: u.group != 'SimpleUsers') diff --git a/modoboa/lib/sysutils.py b/modoboa/lib/sysutils.py index 02af77148..b30444277 100644 --- a/modoboa/lib/sysutils.py +++ b/modoboa/lib/sysutils.py @@ -9,7 +9,7 @@ import inspect import re -def exec_cmd(cmd, sudo_user=None, **kwargs): +def exec_cmd(cmd, sudo_user=None, pinput=None, **kwargs): """Execute a shell command. Run a command using the current user. Set :keyword:`sudo_user` if @@ -17,15 +17,21 @@ def exec_cmd(cmd, sudo_user=None, **kwargs): :param str cmd: the command to execute :param str sudo_user: a valid system username + :param str pinput: data to send to process's stdin :rtype: tuple :return: return code, command output """ if sudo_user is not None: cmd = "sudo -u %s %s" % (sudo_user, cmd) - p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, **kwargs) - output = p.communicate()[0] - return p.returncode, output + p_args = {"shell": True, "stdout": subprocess.PIPE, + "stderr": subprocess.STDOUT} + if pinput is not None: + p_args["stdin"] = subprocess.PIPE + p_args.update(**kwargs) + process = subprocess.Popen(cmd, **p_args) + c_args = [pinput] if pinput is not None else [] + output = process.communicate(*c_args)[0] + return process.returncode, output def guess_extension_name(): diff --git a/modoboa/static/js/global.js b/modoboa/static/js/global.js index ae8478b2d..3b54ed91c 100644 --- a/modoboa/static/js/global.js +++ b/modoboa/static/js/global.js @@ -239,11 +239,11 @@ function parse_qs(raw) { * Ref: http://stackoverflow.com/questions/901115/get-query-string-values-in-javascript */ function get_parameter_by_name(url, name) { - var name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); + name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), results = regex.exec(url); - return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); + return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); } /* From 56f48ed6b854f21b5a9cc532ea4795d359803cf1 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 25 Oct 2014 17:14:33 +0200 Subject: [PATCH 02/27] Better settings to control manual learning. see #622 --- doc/extending/events.rst | 7 +-- modoboa/extensions/amavis/app_settings.py | 39 ++++++++++----- .../extensions/amavis/general_callbacks.py | 47 +++++++++++++++-- modoboa/extensions/amavis/lib.py | 50 +++++++++++++++---- .../templates/amavis/main_action_bar.html | 4 +- .../amavis/templatetags/amavis_tags.py | 48 +++++++++++------- modoboa/extensions/amavis/views.py | 16 +++--- 7 files changed, 152 insertions(+), 59 deletions(-) diff --git a/doc/extending/events.rst b/doc/extending/events.rst index 2741bd421..6d51a7ea3 100644 --- a/doc/extending/events.rst +++ b/doc/extending/events.rst @@ -712,10 +712,11 @@ Raised when an existing mailbox is modified. *Callback prototype*:: - def callback(newmailbox, oldmailbox): pass + def callback(mailbox): pass -* ``newmailbox`` is a ``Mailbox`` instance containing the new values -* ``oldmailbox`` is a ``Mailbox`` instance containing the old values +* ``mailbox`` is the ``Mailbox`` modified instance. It contains a + ``old_full_address`` extra field to check if the address was + modified. PasswordChange ============== diff --git a/modoboa/extensions/amavis/app_settings.py b/modoboa/extensions/amavis/app_settings.py index de5c43b77..bb0874caa 100644 --- a/modoboa/extensions/amavis/app_settings.py +++ b/modoboa/extensions/amavis/app_settings.py @@ -74,12 +74,22 @@ class ParametersForm(AdminParametersForm): help_text=_("The e-mail address used to send notitications") ) - lsep = SeparatorField(label=_("Learning from messages")) + lsep = SeparatorField(label=_("Manual learning")) - amavis_is_local = YesNoField( - label=_("Is amavis local?"), + manual_learning = YesNoField( + label=_("Enable manual learning"), initial="yes", - help_text=_("Tell if amavis is running on the same server than modoboa") + help_text=_( + "Allow users to manually train Spamassassin about spam and non-spam" + ) + ) + + sa_is_local = YesNoField( + label=_("Is Spamassassin local?"), + initial="yes", + help_text=_( + "Tell if spamassassin is running on the same server than modoboa" + ) ) default_user = forms.CharField( @@ -90,12 +100,6 @@ class ParametersForm(AdminParametersForm): ) ) - per_user_bayesian_filter = YesNoField( - label=_("Enable per-user bayesian filters?"), - initial="no", - help_text=_("Allow users to personally train spamassassin") - ) - spamd_address = forms.CharField( label=_("Spamd address"), initial="127.0.0.1", @@ -108,12 +112,23 @@ class ParametersForm(AdminParametersForm): help_text=_("The TCP port spamd is listening on") ) + user_manual_learning = YesNoField( + label=_("Enable per-user manual learning"), + initial="no", + help_text=_("Allow users to personally tell Spamassassin about " + "spam and non-spam") + ) + visibility_rules = { "am_pdp_host": "am_pdp_mode=inet", "am_pdp_port": "am_pdp_mode=inet", "am_pdp_socket": "am_pdp_mode=unix", - "spamd_address": "amavis_is_local=no", - "spamd_port": "amavis_is_local=no", + + "sa_is_local": "manual_learning=yes", + "default_user": "manual_learning=yes", + "spamd_address": "sa_is_local=no", + "spamd_port": "sa_is_local=no", + "user_manual_learning": "manual_learning=yes" } diff --git a/modoboa/extensions/amavis/general_callbacks.py b/modoboa/extensions/amavis/general_callbacks.py index 1ef740e64..3223ca551 100644 --- a/modoboa/extensions/amavis/general_callbacks.py +++ b/modoboa/extensions/amavis/general_callbacks.py @@ -8,6 +8,8 @@ from modoboa.extensions.amavis.lib import ( create_user_and_policy, update_user_and_policy, delete_user_and_policy, create_user_and_use_policy, delete_user ) +from .lib import manual_learning_enabled +from .models import Users @events.observe("UserMenuDisplay") @@ -54,18 +56,53 @@ def on_domain_alias_deleted(domainaliases): delete_user("@{0}".format(domainalias.name)) -@events.observe("MailboxCreated") -def on_mailbox_created(user, mailbox): - """Create amavis records for the new mailbox.""" - create_user_and_policy(mailbox.full_address) +@events.observe("MailboxModified") +def on_mailbox_modified(mailbox): + """Update amavis records if address has changed.""" + if parameters.get_admin("MANUAL_LEARNING") == "no" or \ + mailbox.full_address == mailbox.old_full_address: + return + user = Users.objects.select_related.get(email=mailbox.old_full_address) + full_address = mailbox.full_address + user.email = full_address + user.policy.policy_name = full_address[:32] + user.policy.sa_username = full_address + user.policy.save() + user.save() @events.observe("MailboxDeleted") def on_mailbox_deleted(mailbox): - """Delete amavis records related to this mailbox.""" + """Clean amavis database when a mailbox is removed.""" + if parameters.get_admin("MANUAL_LEARNING") == "no": + return delete_user_and_policy(mailbox.full_address) +@events.observe("MailboxAliasCreated") +def on_mailboxalias_created(user, alias): + """Create amavis record for the new alias. + + FIXME: how to deal with distibution lists ? + """ + if not manual_learning_enabled(user) or alias.type != "alias": + return + policy = Policy.objects.get( + policy_name=alias.mboxes.all()[0].full_address + ) + email = alias.full_address + Users.objects.create(email=email, policy=policy, fullname=email) + + +@events.observe("MailboxAliasDeleted") +def on_mailboxalias_deleted(alias): + """Clean amavis database when an alias is removed.""" + if parameters.get_admin("MANUAL_LEARNING") == "no": + return + if Users.objects.exists(email=alias.fullname): + Users.objects.delete(email=alias.fullname) + + @events.observe("GetStaticContent") def extra_static_content(caller, user): if user.group == "SimpleUsers": diff --git a/modoboa/extensions/amavis/lib.py b/modoboa/extensions/amavis/lib.py index 118687f4f..163682de3 100644 --- a/modoboa/extensions/amavis/lib.py +++ b/modoboa/extensions/amavis/lib.py @@ -88,20 +88,20 @@ class SpamassassinClient(object): """A stupid spamassassin client.""" - def __init__(self, username=None): + def __init__(self, user): """Constructor.""" - self._amavis_is_local = parameters.get_admin("AMAVIS_IS_LOCAL") - if username is None: - self._username = parameters.get_admin("DEFAULT_USER") + self._sa_is_local = parameters.get_admin("SA_IS_LOCAL") + if user.group == "SimpleUsers": + user_manual_learning = parameters.get_admin("USER_MANUAL_LEARNING") + if user_manual_learning == "yes": + self._username = user.email else: - self._username = username + self._username = parameters.get_admin("DEFAULT_USER") + setup_manual_learning(user) self.error = None - if self._amavis_is_local == "yes": + if self._sa_is_local == "yes": self._learn_cmd = "sa-learn --{0} --no-sync -u {1}" self._learn_cmd_kwargs = {} - # self._learn_cmd_kwargs = { - # "sudo_user": parameters.get_admin("AMAVIS_SYSTEM_USER") - # } self._expected_exit_codes = [0] else: self._learn_cmd = "spamc -d {0} -p {1}".format( @@ -131,7 +131,7 @@ class SpamassassinClient(object): def done(self): """Call this method at the end of the processing.""" - if self._amavis_is_local: + if self._sa_is_local: exec_cmd("sa-learn -u {0} --sync".format(self._username), **self._learn_cmd_kwargs) @@ -177,11 +177,13 @@ def create_user_and_policy(name, priority=7): an identifier. :param str name: name + :return: the new ``Policy`` object """ policy = Policy.objects.create(policy_name=name[:32]) Users.objects.create( email=name, fullname=name, priority=priority, policy=policy ) + return policy def create_user_and_use_policy(name, policy_name, priority=7): @@ -234,3 +236,31 @@ def delete_user(name): Users.objects.get(email=name).delete() except Users.DoesNotExist: pass + + +def manual_learning_enabled(user): + """Check if manual learning is enabled or not. + + Also check for :kw:`user` if necessary. + + :return: True if learning is enabled, False otherwise. + """ + manual_learning = parameters.get_admin("MANUAL_LEARNING") == "yes" + if manual_learning and user.group == "SimpleUsers": + manual_learning = parameters.get_admin("USER_MANUAL_LEARNING") == "yes" + return manual_learning + + +def setup_manual_learning(user): + """Setup manual learning if necessary. + + :return: True if learning has been setup, False otherwise + """ + result = False + if user.group == "SimpleUsers": + if not Policy.objects.exists(email=user.email): + policy = create_user_and_policy(user.email) + for alias in user.mailbox_set.all()[0].alias_addresses: + create_user_and_use_policy(alias.full_address, policy) + result = True + return result diff --git a/modoboa/extensions/amavis/templates/amavis/main_action_bar.html b/modoboa/extensions/amavis/templates/amavis/main_action_bar.html index 3b3684f03..36b607005 100644 --- a/modoboa/extensions/amavis/templates/amavis/main_action_bar.html +++ b/modoboa/extensions/amavis/templates/amavis/main_action_bar.html @@ -23,7 +23,8 @@ {% trans "Delete" %}
-
+ {% if manual_learning %} +
@@ -32,6 +33,7 @@
  • {% trans "Mark as non-spam" %}
  • + {% endif %} {% include "common/email_searchbar.html" with extraopts=extraopts %}
    diff --git a/modoboa/extensions/amavis/templatetags/amavis_tags.py b/modoboa/extensions/amavis/templatetags/amavis_tags.py index 187cbe997..7f644ebed 100644 --- a/modoboa/extensions/amavis/templatetags/amavis_tags.py +++ b/modoboa/extensions/amavis/templatetags/amavis_tags.py @@ -1,13 +1,20 @@ +""" +Amavis frontend template tags. +""" + from django import template from django.template.loader import render_to_string from django.utils.translation import ugettext as _ from django.core.urlresolvers import reverse +from ..lib import manual_learning_enabled + register = template.Library() @register.simple_tag -def viewm_menu(mail_id, rcpt): +def viewm_menu(user, mail_id, rcpt): + """Menu displayed within the viewmail action.""" entries = [ {"name": "release", "img": "icon-white icon-ok", @@ -21,20 +28,6 @@ def viewm_menu(mail_id, rcpt): "url": reverse('modoboa.extensions.amavis.views.delete', args=[mail_id]) + ("?rcpt=%s" % rcpt if rcpt else ""), "label": _("Delete")}, - {"name": "process", - "img": "icon-cog", - "menu": [ - {"name": "mark-as-spam", - "label": _("Mark as spam"), - "url": reverse( - "modoboa.extensions.amavis.views.mark_as_spam", args=[mail_id] - ) + ("?rcpt=%s" % rcpt if rcpt else "")}, - {"name": "mark-as-ham", - "label": _("Mark as non-spam"), - "url": reverse( - "modoboa.extensions.amavis.views.mark_as_ham", args=[mail_id] - ) + ("?rcpt=%s" % rcpt if rcpt else "")} - ]}, {"name": "headers", "url": reverse( 'modoboa.extensions.amavis.views.viewheaders', args=[mail_id] @@ -42,6 +35,24 @@ def viewm_menu(mail_id, rcpt): "label": _("View full headers")}, ] + if manual_learning_enabled(user): + entries.insert(1, { + "name": "process", + "img": "icon-cog", + "menu": [ + {"name": "mark-as-spam", + "label": _("Mark as spam"), + "url": reverse( + "modoboa.extensions.amavis.views.mark_as_spam", args=[mail_id] + ) + ("?rcpt=%s" % rcpt if rcpt else "")}, + {"name": "mark-as-ham", + "label": _("Mark as non-spam"), + "url": reverse( + "modoboa.extensions.amavis.views.mark_as_ham", args=[mail_id] + ) + ("?rcpt=%s" % rcpt if rcpt else "")} + ] + }) + menu = render_to_string('common/buttons_list.html', {"entries": entries, "extraclasses": "pull-left"}) @@ -80,13 +91,14 @@ def viewm_menu_simple(user, mail_id, rcpt, secret_id=""): @register.simple_tag -def quar_menu(): +def quar_menu(user): """Render the quarantine listing menu. :rtype: str :return: resulting HTML """ extraopts = [{"name": "to", "label": _("To")}] - return render_to_string('amavis/main_action_bar.html', { - 'extraopts': extraopts + return render_to_string("amavis/main_action_bar.html", { + "extraopts": extraopts, + "manual_learning": manual_learning_enabled(user) }) diff --git a/modoboa/extensions/amavis/views.py b/modoboa/extensions/amavis/views.py index 5cd084222..9fbdfff37 100644 --- a/modoboa/extensions/amavis/views.py +++ b/modoboa/extensions/amavis/views.py @@ -19,7 +19,7 @@ from modoboa.extensions.amavis.templatetags.amavis_tags import ( ) from .lib import ( selfservice, AMrelease, QuarantineNavigationParameters, - SpamassassinClient + SpamassassinClient, manual_learning_enabled ) from .models import Msgrcpt from .sql_connector import get_connector @@ -57,7 +57,7 @@ def _listing(request): "ok", listing=content, paginbar=pagination_bar(page), page=page.number ) if request.session.get('location', 'listing') != 'listing': - ctx['menu'] = quar_menu() + ctx['menu'] = quar_menu(request.user) request.session['location'] = 'listing' return render_to_json_response(ctx) @@ -115,7 +115,7 @@ def viewmail(request, mail_id): content = Template(""" """).render(Context({"url": reverse(getmailcontent, args=[mail_id])})) - menu = viewm_menu(mail_id, rcpt) + menu = viewm_menu(request.user, mail_id, rcpt) ctx = getctx("ok", menu=menu, listing=content) request.session['location'] = 'viewmail' return render_to_json_response(ctx) @@ -263,15 +263,11 @@ def mark_messages(request, selection, mtype): :param str selection: message unique identifier :param str mtype: type of marking (spam or ham) """ + if not manual_learning_enabled(request.user): + return render_to_json_response({"status": "ok"}) selection = check_mail_id(request, selection) connector = get_connector() - per_user_bayesian_filter = parameters.get_admin("PER_USER_BAYESIAN_FILTER") - if per_user_bayesian_filter == "yes" \ - and request.user.group == "SimpleUsers": - username = request.user.email - else: - username = None - saclient = SpamassassinClient(username) + saclient = SpamassassinClient(request.user) for item in selection: rcpt, mail_id = item.split() content = "".join( From 0d7c5b44f5d3e72eb5a9da7ee0db9272ea45354b Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 26 Oct 2014 12:15:59 +0100 Subject: [PATCH 03/27] Documentation. see #622 --- doc/getting_started/plugins.rst | 70 ++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/doc/getting_started/plugins.rst b/doc/getting_started/plugins.rst index 3662c6ffe..21334ce6c 100644 --- a/doc/getting_started/plugins.rst +++ b/doc/getting_started/plugins.rst @@ -278,7 +278,7 @@ feature: Self-service mode ================= -The *self-service* mode let users act on quarantined messages without +The *self-service* mode lets users act on quarantined messages without beeing authenticated. They can: * View messages @@ -307,6 +307,74 @@ Here is a link example:: http:///quarantine/%i/?rcpt=%R&secret_id=[:secret_id] +Manual SpamAssassin learning +============================ + +It is possible to manually train SpamAssassin (FIXME: URL) using +the quarantine's content. By train, we mean: + +* Mark message(s) as spam (false negative(s)) + +* Mark message(s) as non-spam (false positive(s)) + +This feature is available to all users (from super administrators to +simple users) but not enabled by default. + +SpamAssassin configuration +-------------------------- + +For better performance and to enable the per-user level, SpamAssassin +must store bayes information into a SQL database. + +Create a new database and a new user/password (using your favorite +database server) and edit the default configuration file +(:file:`/etc/spamassassin/local.cf`) to add the following lines +inside: + +.. sourcecode:: perl + + bayes_store_module Mail::SpamAssassin::BayesStore:: + bayes_sql_dsn + bayes_sql_username + bayes_sql_password + +Replace values between ``<>`` by yours. Possible values for ``Driver`` +are ``PgSQL`` or ``MySQL`` (non exhaustive list). The syntax for +``DSN`` depends on the driver you choose. Please consult the official +documentation. (FIXME: URL) + +Enable the feature through Modoboa +---------------------------------- + +Manual learning is disabled by default. You can activate it through +the administration panel (*Modoboa > Paremeters > Amavis*). There two +learning levels: + +#. Global: available to administrators only. A single (global) bayes + database is shared between everyone. + +#. Per user: each user can create its own database to customize the + way SpamAssassin will detect spam. + +The per-user level is not activated by default, a dedicated parameter +is available through the panel. + +.. note:: + + A user database is only created the first time that user calls the + learning feature through the quarantine. + +.. warning:: + + A bayes database needs to reach pre-defined thresholds before it + can be used by SpamAssassin. The default values are **200** spams + and **200** hams. + +You will find other paramaters related to this feature. You won't need +to change them most of the time, unless SpamAssassin is hosted on a +different machine than Modoboa. (in this case, ``spamc`` will be used +instead of ``sa-learn``). + .. _stats: ******************** From 20b04db767c1e033e348302a192bfac524668617 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 29 Oct 2014 20:17:22 +0100 Subject: [PATCH 04/27] Allow per-domain learning. see #622 --- modoboa/extensions/amavis/app_settings.py | 35 +- modoboa/extensions/amavis/forms.py | 40 +- modoboa/extensions/amavis/lib.py | 101 +++- modoboa/extensions/amavis/sql_connector.py | 14 +- .../amavis/static/amavis/js/quarantine.js | 111 +++- .../amavis/templates/amavis/index.html | 6 +- .../amavis/templatetags/amavis_tags.py | 12 +- modoboa/extensions/amavis/urls.py | 1 + modoboa/extensions/amavis/views.py | 79 ++- modoboa/lib/templatetags/lib_tags.py | 4 +- modoboa/locale/cs_CZ/LC_MESSAGES/django.po | 297 +++++---- modoboa/locale/de/LC_MESSAGES/django.po | 562 ++++++++++++------ modoboa/locale/en/LC_MESSAGES/django.po | 290 +++++---- modoboa/locale/es/LC_MESSAGES/django.po | 296 +++++---- modoboa/locale/fr/LC_MESSAGES/django.po | 298 ++++++---- modoboa/locale/it/LC_MESSAGES/django.po | 294 +++++---- modoboa/locale/nl_NL/LC_MESSAGES/django.po | 556 +++++++++++------ modoboa/locale/pt_PT/LC_MESSAGES/django.po | 294 +++++---- modoboa/locale/ru/LC_MESSAGES/django.po | 295 +++++---- modoboa/locale/sv/LC_MESSAGES/django.po | 296 +++++---- 20 files changed, 2628 insertions(+), 1253 deletions(-) diff --git a/modoboa/extensions/amavis/app_settings.py b/modoboa/extensions/amavis/app_settings.py index bb0874caa..20d57542c 100644 --- a/modoboa/extensions/amavis/app_settings.py +++ b/modoboa/extensions/amavis/app_settings.py @@ -6,6 +6,9 @@ from modoboa.lib.formutils import SeparatorField, YesNoField, InlineRadioSelect class ParametersForm(AdminParametersForm): + + """Extension settings.""" + app = "amavis" qsettings_sep = SeparatorField(label=_("Quarantine settings")) @@ -21,7 +24,8 @@ class ParametersForm(AdminParametersForm): released_msgs_cleanup = YesNoField( label=_("Remove released messages"), initial="no", - help_text=_("Remove messages marked as released while cleaning up the database") + help_text=_("Remove messages marked as released while cleaning up " + "the database") ) am_pdp_mode = forms.ChoiceField( @@ -80,7 +84,7 @@ class ParametersForm(AdminParametersForm): label=_("Enable manual learning"), initial="yes", help_text=_( - "Allow users to manually train Spamassassin about spam and non-spam" + "Allow super administrators to manually train Spamassassin" ) ) @@ -88,7 +92,7 @@ class ParametersForm(AdminParametersForm): label=_("Is Spamassassin local?"), initial="yes", help_text=_( - "Tell if spamassassin is running on the same server than modoboa" + "Tell if Spamassassin is running on the same server than modoboa" ) ) @@ -96,7 +100,7 @@ class ParametersForm(AdminParametersForm): label=_("Default user"), initial="amavis", help_text=_( - "Name of the user used to store default bayesian filter data" + "Name of the user owning the default bayesian database" ) ) @@ -112,11 +116,22 @@ class ParametersForm(AdminParametersForm): help_text=_("The TCP port spamd is listening on") ) - user_manual_learning = YesNoField( + domain_level_learning = YesNoField( + label=_("Enable per-domain manual learning"), + initial="no", + help_text=_( + "Allow domain administrators to train Spamassassin " + "(within dedicated per-domain databases)" + ) + ) + + user_level_learning = YesNoField( label=_("Enable per-user manual learning"), initial="no", - help_text=_("Allow users to personally tell Spamassassin about " - "spam and non-spam") + help_text=_( + "Allow simple users to personally train Spamassassin " + "(within a dedicated database)" + ) ) visibility_rules = { @@ -128,11 +143,15 @@ class ParametersForm(AdminParametersForm): "default_user": "manual_learning=yes", "spamd_address": "sa_is_local=no", "spamd_port": "sa_is_local=no", - "user_manual_learning": "manual_learning=yes" + "domain_level_learning": "manual_learning=yes", + "user_level_learning": "manual_learning=yes" } class UserSettings(UserParametersForm): + + """Per-user settings.""" + app = "amavis" dsep = SeparatorField(label=_("Display")) diff --git a/modoboa/extensions/amavis/forms.py b/modoboa/extensions/amavis/forms.py index 1f9a270ad..f0fa975a6 100644 --- a/modoboa/extensions/amavis/forms.py +++ b/modoboa/extensions/amavis/forms.py @@ -1,7 +1,14 @@ # coding: utf-8 +""" +Amavis forms. +""" + from django import forms +from django.utils.translation import ugettext as _ + +from modoboa.lib import parameters from modoboa.lib.formutils import InlineRadioSelect -from modoboa.extensions.amavis.models import Policy, Users +from .models import Policy, Users class DomainPolicyForm(forms.ModelForm): @@ -52,3 +59,34 @@ class DomainPolicyForm(forms.ModelForm): u.policy = policy policy.save() return policy + + +class LearningRecipientForm(forms.Form): + + """A form to select the recipient of a learning request.""" + + recipient = forms.ChoiceField( + label=None, choices=[] + ) + ltype = forms.ChoiceField( + label="", choices=[("spam", "spam"), ("ham", "ham")], + widget=forms.widgets.HiddenInput + ) + selection = forms.CharField( + label="", widget=forms.widgets.HiddenInput) + + def __init__(self, user, *args, **kwargs): + """Constructor.""" + super(LearningRecipientForm, self).__init__(*args, **kwargs) + choices = [] + if user.group == "SuperAdmins": + choices.append(("global", _("Global database"))) + domain_level_learning = parameters.get_admin( + "DOMAIN_LEVEL_LEARNING") == "yes" + user_level_learning = parameters.get_admin( + "USER_LEVEL_LEARNING") == "yes" + if domain_level_learning: + choices.append(("domain", _("Domain's database"))) + if user_level_learning: + choices.append(("user", _("User's database"))) + self.fields["recipient"].choices = choices diff --git a/modoboa/extensions/amavis/lib.py b/modoboa/extensions/amavis/lib.py index 163682de3..9233fa94f 100644 --- a/modoboa/extensions/amavis/lib.py +++ b/modoboa/extensions/amavis/lib.py @@ -9,11 +9,13 @@ import struct from django.utils.translation import ugettext as _ from django.core.urlresolvers import reverse +from modoboa.extensions.admin.models import Mailbox, Alias from modoboa.lib import parameters +from modoboa.lib.emailutils import split_mailbox from modoboa.lib.exceptions import InternalError from modoboa.lib.sysutils import exec_cmd from modoboa.lib.webutils import NavigationParameters -from modoboa.extensions.amavis.models import Users, Policy +from .models import Users, Policy def selfservice(ssfunc=None): @@ -88,16 +90,18 @@ class SpamassassinClient(object): """A stupid spamassassin client.""" - def __init__(self, user): + def __init__(self, user, recipient_db): """Constructor.""" self._sa_is_local = parameters.get_admin("SA_IS_LOCAL") + self._default_username = parameters.get_admin("DEFAULT_USER") + self._recipient_db = recipient_db + self._setup_cache = {} if user.group == "SimpleUsers": - user_manual_learning = parameters.get_admin("USER_MANUAL_LEARNING") - if user_manual_learning == "yes": + user_level_learning = parameters.get_admin("USER_LEVEL_LEARNING") + if user_level_learning == "yes": self._username = user.email else: - self._username = parameters.get_admin("DEFAULT_USER") - setup_manual_learning(user) + self._username = None self.error = None if self._sa_is_local == "yes": self._learn_cmd = "sa-learn --{0} --no-sync -u {1}" @@ -112,22 +116,58 @@ class SpamassassinClient(object): self._learn_cmd_kwargs = {} self._expected_exit_codes = [5, 6] - def _learn(self, msg, mtype): + def _get_mailbox_from_rcpt(self, rcpt): + """Retrieve a mailbox from a recipient address.""" + local_part, domname = split_mailbox(rcpt) + try: + mailbox = Mailbox.objects.select_related("domain").get( + address=local_part, domain__name=domname) + except Mailbox.DoesNotExist: + try: + alias = Alias.objects.select_related("domain").get( + address=local_part, domain__name=domname) + except Alias.DoesNotExist: + raise InternalError(_("No recipient found")) + if alias.type != "alias": + return None + mailbox = alias.mboxes.all()[0] + return mailbox + + def _learn(self, rcpt, msg, mtype): """Internal method to call the learning command.""" - cmd = self._learn_cmd.format(mtype, self._username) + if self._username is None: + if self._recipient_db == "global": + username = self._default_username + else: + mbox = self._get_mailbox_from_rcpt(rcpt) + if mbox is None: + username = self._default_username + if self._recipient_db == "domain": + username = mbox.domain.name + if username not in self._setup_cache and \ + setup_manual_learning_for_domain(mbox.domain): + self._setup_cache[username] = True + else: + username = mbox.full_address + if username not in self._setup_cache and \ + setup_manual_learning_for_mbox(mbox): + self._setup_cache[username] = True + else: + username = self._username + cmd = self._learn_cmd.format(mtype, username) code, output = exec_cmd(cmd, pinput=msg, **self._learn_cmd_kwargs) if code in self._expected_exit_codes: return True self.error = output return False - def learn_spam(self, msg): + def learn_spam(self, rcpt, msg): """Learn new spam.""" - return self._learn(msg, "spam") + return self._learn(rcpt, msg, "spam") - def learn_ham(self, msg): + def learn_ham(self, rcpt, msg): """Learn new ham.""" - return self._learn(msg, "ham") + return self._learn(rcpt, msg, "ham") def done(self): """Call this method at the end of the processing.""" @@ -246,21 +286,40 @@ def manual_learning_enabled(user): :return: True if learning is enabled, False otherwise. """ manual_learning = parameters.get_admin("MANUAL_LEARNING") == "yes" - if manual_learning and user.group == "SimpleUsers": - manual_learning = parameters.get_admin("USER_MANUAL_LEARNING") == "yes" + if manual_learning: + domain_level_learning = parameters.get_admin( + "DOMAIN_LEVEL_LEARNING") == "yes" + user_level_learning = parameters.get_admin( + "USER_LEVEL_LEARNING") == "yes" + if user.has_perm("admin.view_domains"): + manual_learning = domain_level_learning or user_level_learning + else: + manual_learning = user_level_learning return manual_learning -def setup_manual_learning(user): +def setup_manual_learning_for_domain(domain): + """Setup manual learning if necessary. + + :return: True if learning has been setup, False otherwise + """ + if Policy.objects.filter(sa_username=domain.name).count(): + return False + policy = Policy.objects.get(policy_name=domain.name) + policy.sa_username = domain.name + policy.save() + return True + + +def setup_manual_learning_for_mbox(mbox): """Setup manual learning if necessary. :return: True if learning has been setup, False otherwise """ result = False - if user.group == "SimpleUsers": - if not Policy.objects.exists(email=user.email): - policy = create_user_and_policy(user.email) - for alias in user.mailbox_set.all()[0].alias_addresses: - create_user_and_use_policy(alias.full_address, policy) - result = True + if not Policy.objects.filter(policy_name=mbox.full_address).exists(): + policy = create_user_and_policy(mbox.full_address) + for alias in mbox.alias_addresses: + create_user_and_use_policy(alias, policy) + result = True return result diff --git a/modoboa/extensions/amavis/sql_connector.py b/modoboa/extensions/amavis/sql_connector.py index 026483d31..2e8f4cab8 100644 --- a/modoboa/extensions/amavis/sql_connector.py +++ b/modoboa/extensions/amavis/sql_connector.py @@ -100,6 +100,7 @@ class SQLconnector(object): criteria = "from_addr,subject,to" search_flt = None for crit in criteria.split(","): + print crit if crit == "from_addr": nfilter = Q(mail__from_addr__contains=pattern) elif crit == "subject": @@ -120,7 +121,7 @@ class SQLconnector(object): mail__in=Quarantine.objects.filter(chunk_ind=1).values("mail_id") ) - messages = Msgrcpt.objects.select_related().filter(flt) + messages = Msgrcpt.objects.select_related("mail", "rid").filter(flt) messages = self._apply_extra_select_filters(messages) return messages @@ -220,6 +221,11 @@ class PgSQLconnector(SQLconnector): Make use of ``QuerySet.extra`` and postgres ``convert_from`` function to let the quarantine manager work as expected ! + + The T4 alias is not a random choice. The generated query was + dumped to found it. Be careful since it can changes with + future Django versions... + """ def _apply_msgrcpt_filters(self, flt): @@ -244,11 +250,13 @@ class PgSQLconnector(SQLconnector): def _apply_extra_search_filter(self, crit, pattern): """Apply search filters using additional criterias. + """ if crit == "to": self._where.append( - "convert_from(maddr.email, 'UTF8') LIKE '%%%s%%'" - % pattern) + "convert_from(maddr.email, 'UTF8') LIKE '%%{0}%%'".format( + pattern) + ) return None def _apply_extra_select_filters(self, messages): diff --git a/modoboa/extensions/amavis/static/amavis/js/quarantine.js b/modoboa/extensions/amavis/static/amavis/js/quarantine.js index 905016fc9..83f1bcb34 100644 --- a/modoboa/extensions/amavis/static/amavis/js/quarantine.js +++ b/modoboa/extensions/amavis/static/amavis/js/quarantine.js @@ -163,14 +163,12 @@ Quarantine.prototype = { this.navobj.update(); }, - _send_selection: function(e, name, message) { - var $link = $(e.target); - - e.preventDefault(); - if (!this.htmltable.current_selection().length || - !confirm(message)) { - return; - } + /** + * Return the list of currently selected messages. + * + * @return {Array} - list of message IDs + */ + get_current_selection: function() { var selection = []; this.htmltable.current_selection().each(function() { @@ -183,12 +181,30 @@ Quarantine.prototype = { selection.push($tr.attr("id")); } }); + return selection; + }, + + _send_selection: function(e, name, message) { + var $link = $(e.target); + + e.preventDefault(); + if (!this.htmltable.current_selection().length || + !confirm(message)) { + return; + } + var selection = this.get_current_selection(); + $.ajax({ url: $link.attr("href"), data: "action=" + name + "&selection=" + selection.join(","), type: 'POST', dataType: 'json' - }).done($.proxy(this.action_cb, this)); + }).done( + $.proxy(this.action_cb, this) + ).fail(function(jqxhr) { + var data = $.parseJSON(jqxhr.responseText); + $("body").notify("error", data.message); + }); }, release_selection: function(e) { @@ -199,14 +215,45 @@ Quarantine.prototype = { this._send_selection(e, "delete", gettext("Delete this selection?")); }, + /** + * Show the recipient selection form inside a modal box. + * + * @param {Object} evt - event object + * @param {string} ltype - learning type (spam or ham) + */ + show_select_rcpt_form: function(evt, ltype, selection) { + if (selection === undefined) { + selection = this.get_current_selection(); + } + var url = this.options.learning_recipient_url + + "?type=" + ltype + "&selection=" + + selection.join(","); + var $this = this; + + modalbox(evt, null, url, function() { + $(".submit").on("click", function(evt) { + simple_ajax_form_post(evt, { + formid: "learning_recipient_form", + reload_on_success: false, + success_cb: $this.action_cb + }); + }); + }); + }, + /** * Mark the current selection as spam. * * @param {Object} e - event object */ mark_selection_as_spam: function(e) { - this._send_selection( - e, "mark_as_spam", gettext("Mark this selection as spam?")); + if (this.options.check_learning_rcpt && + this.htmltable.current_selection().length) { + this.show_select_rcpt_form(e, "spam"); + } else { + this._send_selection( + e, "mark_as_spam", gettext("Mark this selection as spam?")); + } }, /** @@ -215,8 +262,13 @@ Quarantine.prototype = { * @param {Object} e - event object */ mark_selection_as_ham: function(e) { - this._send_selection( - e, "mark_as_ham", gettext("Mark this selection as non-spam?")); + if (this.options.check_learning_rcpt && + this.htmltable.current_selection().length) { + this.show_select_rcpt_form(e, "ham"); + } else { + this._send_selection( + e, "mark_as_ham", gettext("Mark this selection as non-spam?")); + } }, _send_action: function(e, message) { @@ -231,10 +283,15 @@ Quarantine.prototype = { dataType: 'json', type: 'POST', data: {rcpt: get_parameter_by_name($link.attr("href"), 'rcpt')} - }).done($.proxy(this.action_cb, this)); + }).done( + $.proxy(this.action_cb, this) + ).fail(function(jqxhr) { + var data = $.parseJSON(jqxhr.responseText); + $("body").notify("error", data.message); + }); }, - release : function(e) { + release : function(e) { this._send_action(e, gettext("Release this message?")); }, @@ -248,7 +305,14 @@ Quarantine.prototype = { * @param {Object} e - event object */ mark_as_spam: function(e) { - this._send_action(e, gettext("Mark as spam?")); + if (this.options.check_learning_rcpt) { + var $link = get_target(e, "a"); + var selection = get_parameter_by_name($link.attr("href"), "rcpt") + + " " + $link.attr("data-mail-id"); + this.show_select_rcpt_form(e, "spam", [selection]); + } else { + this._send_action(e, gettext("Mark as spam?")); + } }, /** @@ -257,7 +321,14 @@ Quarantine.prototype = { * @param {Object} e - event object */ mark_as_ham: function(e) { - this._send_action(e, gettext("Mark as non-spam?")); + if (this.options.check_learning_rcpt) { + var $link = get_target(e, "a"); + var selection = get_parameter_by_name($link.attr("href"), "rcpt") + + " " + $link.attr("data-mail-id"); + this.show_select_rcpt_form(e, "ham", [selection]); + } else { + this._send_action(e, gettext("Mark as non-spam?")); + } }, show_rawheaders: function($mailcontent) { @@ -336,12 +407,10 @@ Quarantine.prototype = { }, action_cb: function(data) { - if (data.status == "ok") { + if (data.url) { this.navobj.parse_string(data.url, true).update(true); - $("body").notify("success", data.respmsg, 2000); - } else { - $("body").notify("error", data.respmsg); } + $("body").notify("success", data.message, 2000); } }; diff --git a/modoboa/extensions/amavis/templates/amavis/index.html b/modoboa/extensions/amavis/templates/amavis/index.html index aceed6622..a80fefdc5 100644 --- a/modoboa/extensions/amavis/templates/amavis/index.html +++ b/modoboa/extensions/amavis/templates/amavis/index.html @@ -13,12 +13,14 @@ $(document).ready(function() { var qm = new Quarantine({ deflocation: "{{ deflocation }}", - defcallback: "{{ defcallback }}" + defcallback: "{{ defcallback }}", + check_learning_rcpt: {{ check_learning_rcpt }}, + learning_recipient_url: "{% url 'modoboa.extensions.amavis.views.learning_recipient' %}" }); }); {% endblock %} {% block fixed_content %} - +
    {% endblock %} diff --git a/modoboa/extensions/amavis/templatetags/amavis_tags.py b/modoboa/extensions/amavis/templatetags/amavis_tags.py index 7f644ebed..94525fd3a 100644 --- a/modoboa/extensions/amavis/templatetags/amavis_tags.py +++ b/modoboa/extensions/amavis/templatetags/amavis_tags.py @@ -36,7 +36,7 @@ def viewm_menu(user, mail_id, rcpt): ] if manual_learning_enabled(user): - entries.insert(1, { + entries.insert(2, { "name": "process", "img": "icon-cog", "menu": [ @@ -44,12 +44,18 @@ def viewm_menu(user, mail_id, rcpt): "label": _("Mark as spam"), "url": reverse( "modoboa.extensions.amavis.views.mark_as_spam", args=[mail_id] - ) + ("?rcpt=%s" % rcpt if rcpt else "")}, + ) + ("?rcpt=%s" % rcpt if rcpt else ""), + "extra_attributes": { + "data-mail-id": mail_id + }}, {"name": "mark-as-ham", "label": _("Mark as non-spam"), "url": reverse( "modoboa.extensions.amavis.views.mark_as_ham", args=[mail_id] - ) + ("?rcpt=%s" % rcpt if rcpt else "")} + ) + ("?rcpt=%s" % rcpt if rcpt else ""), + "extra_attributes": { + "data-mail-id": mail_id + }} ] }) diff --git a/modoboa/extensions/amavis/urls.py b/modoboa/extensions/amavis/urls.py index 806f62f38..dde072633 100644 --- a/modoboa/extensions/amavis/urls.py +++ b/modoboa/extensions/amavis/urls.py @@ -11,6 +11,7 @@ urlpatterns = patterns( (r'^release/(?P[\w\-\+]+)/$', 'release'), (r'^markspam/(?P[\w\-\+]+)/$', 'mark_as_spam'), (r'^markham/(?P[\w\-\+]+)/$', 'mark_as_ham'), + (r'^learning_recipient/$', 'learning_recipient'), (r'^(?P[\w\-\+]+)/$', 'viewmail'), (r'^(?P[\w\-\+]+)/headers/$', 'viewheaders'), ) diff --git a/modoboa/extensions/amavis/views.py b/modoboa/extensions/amavis/views.py index 9fbdfff37..865d2520d 100644 --- a/modoboa/extensions/amavis/views.py +++ b/modoboa/extensions/amavis/views.py @@ -21,6 +21,7 @@ from .lib import ( selfservice, AMrelease, QuarantineNavigationParameters, SpamassassinClient, manual_learning_enabled ) +from .forms import LearningRecipientForm from .models import Msgrcpt from .sql_connector import get_connector from .sql_listing import SQLlisting, SQLemail @@ -64,9 +65,18 @@ def _listing(request): @login_required def index(request): + check_learning_rcpt = "false" + if parameters.get_admin("MANUAL_LEARNING") == "yes": + if request.user.group != "SimpleUsers": + user_level_learning = parameters.get_admin( + "USER_LEVEL_LEARNING") == "yes" + domain_level_learning = parameters.get_admin( + "DOMAIN_LEVEL_LEARNING") == "yes" + if user_level_learning or domain_level_learning: + check_learning_rcpt = "true" return render(request, "amavis/index.html", dict( deflocation="listing/?sort_order=-date", defcallback="listing_cb", - selection="quarantine" + selection="quarantine", check_learning_rcpt=check_learning_rcpt )) @@ -171,10 +181,10 @@ def delete(request, mail_id): message = ungettext("%(count)d message deleted successfully", "%(count)d messages deleted successfully", len(mail_id)) % {"count": len(mail_id)} - return ajax_response( - request, respmsg=message, - url=QuarantineNavigationParameters(request).back_to_listing() - ) + return render_to_json_response({ + "message": message, + "url": QuarantineNavigationParameters(request).back_to_listing() + }) def release_selfservice(request, mail_id): @@ -251,13 +261,14 @@ def release(request, mail_id): len(mail_id)) % {"count": len(mail_id)} else: message = error - return ajax_response( - request, "ko" if error else "ok", respmsg=message, - url=QuarantineNavigationParameters(request).back_to_listing() - ) + status = 400 if error else 200 + return render_to_json_response({ + "message": message, + "url": QuarantineNavigationParameters(request).back_to_listing() + }, status=status) -def mark_messages(request, selection, mtype): +def mark_messages(request, selection, mtype, recipient_db=None): """Mark a selection of messages as spam. :param str selection: message unique identifier @@ -265,16 +276,20 @@ def mark_messages(request, selection, mtype): """ if not manual_learning_enabled(request.user): return render_to_json_response({"status": "ok"}) + if recipient_db is None: + recipient_db = ( + "user" if request.user.group == "SimpleUsers" else "global" + ) selection = check_mail_id(request, selection) connector = get_connector() - saclient = SpamassassinClient(request.user) + saclient = SpamassassinClient(request.user, recipient_db) for item in selection: rcpt, mail_id = item.split() content = "".join( [msg.mail_text for msg in connector.get_mail_content(mail_id)] ) - result = saclient.learn_spam(content) if mtype == "spam" \ - else saclient.learn_ham(content) + result = saclient.learn_spam(rcpt, content) if mtype == "spam" \ + else saclient.learn_ham(rcpt, content) if not result: break if saclient.error is None: @@ -284,10 +299,40 @@ def mark_messages(request, selection, mtype): len(selection)) % {"count": len(selection)} else: message = saclient.error - return ajax_response( - request, "ko" if saclient.error else "ok", respmsg=message, - url=QuarantineNavigationParameters(request).back_to_listing() - ) + status = 400 if saclient.error else 200 + return render_to_json_response({"message": message}, status=status) + + +@login_required +def learning_recipient(request): + """A view to select the recipient database of a learning action.""" + if request.method == "POST": + form = LearningRecipientForm(request.user, request.POST) + if form.is_valid(): + return mark_messages( + request, + form.cleaned_data["selection"].split(","), + form.cleaned_data["ltype"], + form.cleaned_data["recipient"] + ) + return render_to_json_response( + {"form_errors": form.errors}, status=400 + ) + ltype = request.GET.get("type", None) + selection = request.GET.get("selection", None) + if ltype is None or selection is None: + raise BadRequest + form = LearningRecipientForm(request.user) + form.fields["ltype"].initial = ltype + form.fields["selection"].initial = selection + return render(request, "common/generic_modal_form.html", { + "title": _("Select a database"), + "formid": "learning_recipient_form", + "action": reverse("modoboa.extensions.amavis.views.learning_recipient"), + "action_classes": "submit", + "action_label": _("Valider"), + "form": form + }) @login_required diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py index 930d2b3b8..4d3d7676d 100644 --- a/modoboa/lib/templatetags/lib_tags.py +++ b/modoboa/lib/templatetags/lib_tags.py @@ -127,7 +127,9 @@ def render_link(linkdef, mdclass=""): {% if link.modalcb %}modalcb="{{ link.modalcb }}"{% endif %} {% if link.closecb %}closecb="{{ link.closecb }}"{% endif %} class="{{ mdclass }}{% if link.class %} {{ link.class }}{% endif %}" -{% if link.confirm %} onclick="return confirm('{{ link.confirm }}')"{% endif %}> +{% if link.confirm %} onclick="return confirm('{{ link.confirm }}')"{% endif %} +{% for attr, value in link.extra_attributes.items %} {{ attr }}="{{ value }}"{% endfor %} +> {% if link.img %}{% endif %} {{ link.label }}""") return t.render(Context(dict(link=linkdef, mdclass=mdclass))) diff --git a/modoboa/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/locale/cs_CZ/LC_MESSAGES/django.po index eda915777..0d7bf2600 100644 --- a/modoboa/locale/cs_CZ/LC_MESSAGES/django.po +++ b/modoboa/locale/cs_CZ/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: modoboa-1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:29+0200\n" +"POT-Creation-Date: 2014-10-29 13:25+0100\n" "PO-Revision-Date: 2013-09-29 22:08+0100\n" "Last-Translator: Miroslav Abrahám \n" "Language-Team: CS \n" @@ -19,8 +19,8 @@ msgstr "" "X-Generator: Poedit 1.5.7\n" #: core/__init__.py:52 core/__init__.py:53 -#: extensions/admin/forms/account.py:326 extensions/admin/forms/domain.py:256 -#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:129 +#: extensions/admin/forms/account.py:327 extensions/admin/forms/domain.py:248 +#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:133 #: extensions/postfix_autoreply/app_settings.py:11 #: extensions/postfix_relay_domains/forms.py:138 #: extensions/sievefilters/app_settings.py:50 @@ -290,8 +290,8 @@ msgstr "Neplatný požadavek" msgid "This field is required" msgstr "Toto pole je vyžadováno" -#: core/app_settings.py:349 extensions/amavis/app_settings.py:87 -#: extensions/amavis/templates/amavis/main_action_bar.html:29 +#: core/app_settings.py:349 extensions/amavis/app_settings.py:149 +#: extensions/amavis/templates/amavis/main_action_bar.html:40 #: extensions/webmail/app_settings.py:73 msgid "Display" msgstr "Zobrazení" @@ -347,36 +347,36 @@ msgstr "Poslední přihlášení" msgid "You can't delete your own account" msgstr "Nemůžete smazat vlastní účet" -#: core/models.py:117 +#: core/models.py:130 msgid "Failed to update password: LDAP module not installed" msgstr "Nebylo možné změnit heslo: LDAP modul není instalován" -#: core/models.py:170 +#: core/models.py:183 msgid "account" msgstr "účet" -#: core/models.py:321 extensions/admin/models/domain.py:144 +#: core/models.py:334 extensions/admin/models/domain.py:144 #: extensions/admin/models/domain_alias.py:39 #: extensions/postfix_relay_domains/models.py:134 #: extensions/postfix_relay_domains/models.py:190 msgid "Invalid line" msgstr "Neplatný řádek" -#: core/models.py:325 +#: core/models.py:338 msgid "You can't import an account with a role greater than yours" msgstr "Nemůžete importvat účet s vyšším oprávněním, než máte vy sám" -#: core/models.py:337 +#: core/models.py:350 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Uživatel '%s' musí mít nastavenou platnou emailovou adresu" -#: core/models.py:341 +#: core/models.py:354 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "pole uživatelského jména a emailu se nesmí pro '%s' lišit" -#: core/models.py:410 extensions/admin/models/alias.py:35 +#: core/models.py:423 extensions/admin/models/alias.py:35 #: extensions/admin/models/domain.py:32 #: extensions/admin/models/domain_alias.py:17 #: extensions/postfix_autoreply/models.py:28 @@ -385,29 +385,29 @@ msgstr "pole uživatelského jména a emailu se nesmí pro '%s' lišit" msgid "enabled" msgstr "povoleno" -#: core/models.py:411 +#: core/models.py:424 msgid "Check to enable this extension" msgstr "Zatrhněte pole pro povolení tohoto rozšíření" -#: core/models.py:491 +#: core/models.py:504 msgid "added" msgstr "přidáno" -#: core/models.py:494 +#: core/models.py:507 msgid "modified" msgstr "upraveno" -#: core/models.py:496 core/models.py:521 +#: core/models.py:509 core/models.py:534 #, python-format msgid "%(object)s '%(name)s' %(action)s by user %(user)s" msgstr "%(object)s '%(name)s' %(action)s uživatelem %(user)s" -#: core/models.py:523 +#: core/models.py:536 msgid "deleted" msgstr "smazáno" #: core/tables.py:8 core/templates/core/information.html:8 -#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:187 +#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:179 #: extensions/admin/templates/admin/domains_table.html:5 #: extensions/admin/templates/admin/editdomainform.html:13 #: extensions/admin/templates/admin/identities_table.html:5 @@ -523,7 +523,7 @@ msgstr "Aktualizovat osobní informace" #: core/templates/core/user_profile.html:8 #: extensions/admin/templates/admin/forward.html:8 #: extensions/admin/views/alias.py:112 extensions/admin/views/domain.py:168 -#: extensions/admin/views/identity.py:200 +#: extensions/admin/views/identity.py:204 #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9 #: extensions/postfix_relay_domains/views.py:66 #: extensions/sievefilters/views.py:166 extensions/webmail/views.py:172 @@ -652,7 +652,7 @@ msgstr "Přeposlat" msgid "Account import failed (%s): domain does not exist" msgstr "Import účtu nebyl úspěšný (%s): doména neexistuje" -#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:196 +#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:197 #, python-format msgid "Mailbox %s already exists" msgstr "Schránka %s již existuje" @@ -662,6 +662,13 @@ msgstr "Schránka %s již existuje" msgid "Account import failed (%s): wrong quota value" msgstr "Import účtu nebyl úspěšný (%s): doména neexistuje" +#: extensions/admin/__init__.py:212 extensions/admin/forms/domain.py:75 +#: extensions/postfix_relay_domains/forms.py:50 +#: extensions/postfix_relay_domains/forms.py:70 +#, fuzzy +msgid "domain alias" +msgstr "Doménové aliasy" + #: extensions/admin/app_settings.py:13 #: extensions/admin/templates/admin/editdomainform.html:25 #: extensions/limits/app_settings.py:31 extensions/limits/models.py:23 @@ -710,7 +717,7 @@ 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" #: extensions/admin/app_settings.py:81 extensions/admin/forms/account.py:178 -#: extensions/admin/forms/domain.py:56 +#: extensions/admin/forms/domain.py:57 msgid "Must be a positive integer" msgstr "" @@ -758,7 +765,7 @@ msgstr "Nemůžete zakázat váš vlastní účet" msgid "E-mail" msgstr "E-mail" -#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:17 +#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:18 msgid "Quota" msgstr "Kvóta" @@ -772,7 +779,7 @@ msgstr "" "hodnotu domény. Ponechejte prázdné pro neomezenou kvótu (není povoleno " "správcům domény)." -#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:26 +#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:27 #: extensions/admin/templates/admin/domains_table.html:6 #: extensions/postfix_relay_domains/forms.py:12 msgid "Alias(es)" @@ -788,25 +795,25 @@ msgstr "" "pro vložení dalšího aliasu. Pro vytvoření doménového koše vložte '*' (např. " "*@domena.cz)." -#: extensions/admin/forms/account.py:187 extensions/admin/forms/account.py:217 +#: extensions/admin/forms/account.py:188 extensions/admin/forms/account.py:218 #: extensions/admin/forms/alias.py:65 msgid "Domain does not exist" msgstr "Doména neexistuje" -#: extensions/admin/forms/account.py:284 +#: extensions/admin/forms/account.py:285 msgid "Domain(s)" msgstr "Doména(y)" -#: extensions/admin/forms/account.py:286 +#: extensions/admin/forms/account.py:287 msgid "Domain(s) that user administrates" msgstr "Doména(y) pod správou uživatele" -#: extensions/admin/forms/account.py:328 -#: extensions/admin/views/identity.py:132 +#: extensions/admin/forms/account.py:329 +#: extensions/admin/views/identity.py:136 msgid "Mail" msgstr "Mail" -#: extensions/admin/forms/account.py:330 +#: extensions/admin/forms/account.py:331 msgid "Permissions" msgstr "Oprávnění" @@ -857,14 +864,14 @@ msgstr "Příjemce %s je již vložen" msgid "No recipient defined" msgstr "Nebyl určen příjemce" -#: extensions/admin/forms/domain.py:20 +#: extensions/admin/forms/domain.py:21 #, fuzzy msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." msgstr "Výchozí kvóta schránek v MB" -#: extensions/admin/forms/domain.py:29 +#: extensions/admin/forms/domain.py:30 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." @@ -872,55 +879,48 @@ msgstr "" "Alias(y) této domény. Uveďte na řádek pouze jeden alias; pro vložení dalšího " "aliasu stiskněte po vložení ENTER." -#: extensions/admin/forms/domain.py:75 -#: extensions/postfix_relay_domains/forms.py:50 -#: extensions/postfix_relay_domains/forms.py:70 -#, fuzzy -msgid "domain alias" -msgstr "Doménové aliasy" - -#: extensions/admin/forms/domain.py:82 extensions/admin/forms/domain.py:98 +#: extensions/admin/forms/domain.py:78 extensions/admin/forms/domain.py:92 #: extensions/postfix_relay_domains/forms.py:58 #: extensions/postfix_relay_domains/forms.py:78 #, fuzzy, python-format msgid "A %s with this name already exists" msgstr "Alias s tímto názvem již existuje" -#: extensions/admin/forms/domain.py:92 +#: extensions/admin/forms/domain.py:89 #: extensions/postfix_relay_domains/forms.py:49 #: extensions/postfix_relay_domains/forms.py:71 #, fuzzy msgid "domain" msgstr "Domény" -#: extensions/admin/forms/domain.py:181 +#: extensions/admin/forms/domain.py:173 msgid "Create a domain administrator" msgstr "Vytvořit správce domény" -#: extensions/admin/forms/domain.py:183 +#: extensions/admin/forms/domain.py:175 msgid "Automatically create an administrator for this domain" msgstr "Automaticky vytvořit správce této domény" -#: extensions/admin/forms/domain.py:190 +#: extensions/admin/forms/domain.py:182 msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." msgstr "" "Jméno správce. Nevkládejte sem název domény, název bude automaticky doplněn." -#: extensions/admin/forms/domain.py:198 +#: extensions/admin/forms/domain.py:190 msgid "Create aliases" msgstr "Vytvořit aliasy" -#: extensions/admin/forms/domain.py:200 +#: extensions/admin/forms/domain.py:192 msgid "Automatically create standard aliases for this domain" msgstr "Automaticky vytvořit běžné aliasy pro tuto doménu" -#: extensions/admin/forms/domain.py:216 +#: extensions/admin/forms/domain.py:208 msgid "Invalid format" msgstr "Neplatný formát" -#: extensions/admin/forms/domain.py:230 +#: extensions/admin/forms/domain.py:222 #, python-format msgid "User '%s' already exists" msgstr "Uživatel '%s' již existuje" @@ -957,7 +957,7 @@ msgstr "" "Nemůžete nastavit přeposílání na místní adresu. Požádejte správce o " "vytvoření aliasu." -#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:198 +#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:200 msgid "Select a file" msgstr "Vybrat soubor" @@ -977,7 +977,7 @@ msgstr "Zašifrovat hesla" msgid "Check this option if passwords contained in your file are not crypted" msgstr "Zatrhněte toto pole, pokud hesla ve vašem souboru nejsou zašifrována" -#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:62 +#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:74 msgid "address" msgstr "adresa" @@ -1076,21 +1076,21 @@ msgstr "Doména, na kterou tento alias odkazuje" msgid "Unknown domain %s" msgstr "Neznámá doména %s" -#: extensions/admin/models/mailbox.py:63 +#: extensions/admin/models/mailbox.py:75 msgid "Mailbox address (without the @domain.tld part)" msgstr "Adresa schránky (bez části @doména.tld)" -#: extensions/admin/models/mailbox.py:125 +#: extensions/admin/models/mailbox.py:136 #, python-format msgid "Failed to retrieve mailbox location (%s)" msgstr "Nebylo možné zjistit umístění schránky (%s)" -#: extensions/admin/models/mailbox.py:194 +#: extensions/admin/models/mailbox.py:221 #, python-format msgid "Quota is greater than the allowed domain's limit (%dM)" msgstr "Zvolená kvóta je větší než povolené omezení domény (%dM)" -#: extensions/admin/models/mailbox.py:199 +#: extensions/admin/models/mailbox.py:227 msgid "A quota is required" msgstr "Kvóta je vyžadována" @@ -1163,7 +1163,7 @@ msgid "Importing..." msgstr "Importuji..." #: extensions/admin/templates/admin/listing.html:14 -#: extensions/stats/templates/stats/index.html:28 +#: extensions/stats/templates/stats/index.html:23 msgid "Filter" msgstr "Filtr" @@ -1265,8 +1265,8 @@ msgid "Alias with this name already exists" msgstr "Alias s tímto názvem již existuje" #: extensions/admin/views/alias.py:50 extensions/admin/views/domain.py:102 -#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:133 -#: extensions/admin/views/identity.py:160 +#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:137 +#: extensions/admin/views/identity.py:164 #: extensions/postfix_relay_domains/views.py:34 #: extensions/sievefilters/views.py:144 extensions/sievefilters/views.py:233 #: extensions/webmail/views.py:153 @@ -1309,7 +1309,7 @@ msgstr "Přeposílání upraveno" msgid "Alias modified" msgstr "Alias upraven" -#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:130 +#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:134 msgid "Next" msgstr "Další" @@ -1317,7 +1317,7 @@ msgstr "Další" msgid "Options" msgstr "Možnosti" -#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:134 +#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:138 msgid "Previous" msgstr "Předchozí" @@ -1352,11 +1352,11 @@ msgstr "Exportovat identity" msgid "Export domains" msgstr "Exportovat domény" -#: extensions/admin/views/identity.py:104 -#: extensions/admin/views/identity.py:227 -#: extensions/admin/views/identity.py:232 extensions/amavis/views.py:144 -#: extensions/amavis/views.py:148 extensions/amavis/views.py:181 -#: extensions/amavis/views.py:186 extensions/amavis/views.py:188 +#: extensions/admin/views/identity.py:108 +#: extensions/admin/views/identity.py:231 +#: extensions/admin/views/identity.py:236 extensions/amavis/views.py:147 +#: extensions/amavis/views.py:151 extensions/amavis/views.py:184 +#: extensions/amavis/views.py:189 extensions/amavis/views.py:191 #: extensions/webmail/views.py:49 extensions/webmail/views.py:67 #: extensions/webmail/views.py:81 extensions/webmail/views.py:99 #: extensions/webmail/views.py:116 extensions/webmail/views.py:202 @@ -1367,19 +1367,19 @@ msgstr "Exportovat domény" msgid "Invalid request" msgstr "Neplatný požadavek" -#: extensions/admin/views/identity.py:151 +#: extensions/admin/views/identity.py:155 msgid "Account created" msgstr "Účet vytvořen" -#: extensions/admin/views/identity.py:157 +#: extensions/admin/views/identity.py:161 msgid "New account" msgstr "Nový účet" -#: extensions/admin/views/identity.py:193 +#: extensions/admin/views/identity.py:197 msgid "Account updated" msgstr "Účet aktualizován" -#: extensions/admin/views/identity.py:217 +#: extensions/admin/views/identity.py:221 msgid "Account deleted" msgid_plural "Accounts deleted" msgstr[0] "Účet smazán" @@ -1465,7 +1465,7 @@ msgstr "Přeposílání aktualizováno" msgid "Simple amavis management frontend" msgstr "Jednoduché rozhraní pro správu amavis" -#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:18 +#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:20 msgid "Quarantine" msgstr "Karanténa" @@ -1559,28 +1559,96 @@ msgstr "Odesílatel upozornění" msgid "The e-mail address used to send notitications" msgstr "E-mailová adresa používaná k zasílání upozornění" -#: extensions/amavis/app_settings.py:91 extensions/webmail/app_settings.py:91 +#: extensions/amavis/app_settings.py:77 +#: extensions/amavis/templates/amavis/main_action_bar.html:27 +msgid "Manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:80 +msgid "Enable manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:83 +msgid "Allow super administrators to manually train Spamassassin" +msgstr "" + +#: extensions/amavis/app_settings.py:88 +msgid "Is Spamassassin local?" +msgstr "" + +#: extensions/amavis/app_settings.py:91 +msgid "Tell if Spamassassin is running on the same server than modoboa" +msgstr "" + +#: extensions/amavis/app_settings.py:96 +#, fuzzy +msgid "Default user" +msgstr "Výchozí editor" + +#: extensions/amavis/app_settings.py:99 +msgid "Name of the user owning the default bayesian database" +msgstr "" + +#: extensions/amavis/app_settings.py:104 +#, fuzzy +msgid "Spamd address" +msgstr "Z adresy" + +#: extensions/amavis/app_settings.py:106 +msgid "The IP address where spamd can be reached" +msgstr "" + +#: extensions/amavis/app_settings.py:110 +#, fuzzy +msgid "Spamd port" +msgstr "Spam" + +#: extensions/amavis/app_settings.py:112 +msgid "The TCP port spamd is listening on" +msgstr "" + +#: extensions/amavis/app_settings.py:116 +msgid "Enable per-domain manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:119 +msgid "" +"Allow domain administrators to train Spamassassin (within dedicated per-" +"domain databases)" +msgstr "" + +#: extensions/amavis/app_settings.py:125 +msgid "Enable per-user manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:128 +msgid "" +"Allow simple users to personally train Spamassassin (within a dedicated " +"database)" +msgstr "" + +#: extensions/amavis/app_settings.py:153 extensions/webmail/app_settings.py:91 msgid "Number of displayed emails per page" msgstr "Počet zobrazených zpráv na stránce" -#: extensions/amavis/app_settings.py:92 +#: extensions/amavis/app_settings.py:154 msgid "Set the maximum number of messages displayed in a page" msgstr "Nastavit maximální počet zobrazených zpráv na stránce" -#: extensions/amavis/general_callbacks.py:82 +#: extensions/amavis/general_callbacks.py:136 msgid "pending requests" msgstr "nevyřízené požadavky" -#: extensions/amavis/general_callbacks.py:125 +#: extensions/amavis/general_callbacks.py:179 #, fuzzy msgid "Pending requests" msgstr "nevyřízené požadavky" -#: extensions/amavis/general_callbacks.py:135 +#: extensions/amavis/general_callbacks.py:189 msgid "Content filter" msgstr "Filtr obsahu" -#: extensions/amavis/lib.py:56 +#: extensions/amavis/lib.py:60 #, python-format msgid "Connection to amavis failed: %s" msgstr "Spojení s amavis selhalo: %s" @@ -1648,8 +1716,8 @@ msgid "Score" msgstr "" #: extensions/amavis/sql_listing.py:33 -#: extensions/amavis/templatetags/amavis_tags.py:75 -#: extensions/webmail/forms.py:82 +#: extensions/amavis/templatetags/amavis_tags.py:100 +#: extensions/webmail/forms.py:83 msgid "To" msgstr "Komu" @@ -1660,21 +1728,21 @@ msgid "From" msgstr "Od" #: extensions/amavis/sql_listing.py:40 extensions/sievefilters/forms.py:77 -#: extensions/webmail/forms.py:86 extensions/webmail/lib/imapemail.py:288 +#: extensions/webmail/forms.py:87 extensions/webmail/lib/imapemail.py:288 #: extensions/webmail/lib/listing.py:27 extensions/webmail/lib/tables.py:26 #: templates/common/email_searchbar.html:6 msgid "Subject" msgstr "Předmět" -#: extensions/amavis/views.py:27 +#: extensions/amavis/views.py:30 msgid "Empty quarantine" msgstr "Vyprázdnit karanténu" -#: extensions/amavis/views.py:149 +#: extensions/amavis/views.py:152 msgid "Message deleted" msgstr "Zpráva smazána" -#: extensions/amavis/views.py:168 +#: extensions/amavis/views.py:171 #, python-format msgid "%(count)d message deleted successfully" msgid_plural "%(count)d messages deleted successfully" @@ -1682,15 +1750,15 @@ msgstr[0] "%(count)d zpráva úspěšně smazána" msgstr[1] "%(count)d zprávy úspěšně smazány" msgstr[2] "%(count)d zpráv úspěšně smazáno" -#: extensions/amavis/views.py:191 +#: extensions/amavis/views.py:194 msgid "Request sent" msgstr "Požadavek odeslán" -#: extensions/amavis/views.py:197 +#: extensions/amavis/views.py:200 msgid "Message released" msgstr "Zprávy odblokována" -#: extensions/amavis/views.py:225 +#: extensions/amavis/views.py:228 #, python-format msgid "%(count)d request sent" msgid_plural "%(count)d requests sent" @@ -1698,7 +1766,7 @@ msgstr[0] "%(count)d požadavek odeslán" msgstr[1] "%(count)d požadavky odeslány" msgstr[2] "%(count)d požadavků odesláno" -#: extensions/amavis/views.py:246 +#: extensions/amavis/views.py:249 #, python-format msgid "%(count)d message released successfully" msgid_plural "%(count)d messages released successfully" @@ -1706,6 +1774,14 @@ msgstr[0] "%(count)d zpráva úspěšně odblokována" msgstr[1] "%(count)d zprávy úspěšně odblokovány" msgstr[2] "%(count)d zpráv úspěšně odblokováno" +#: extensions/amavis/views.py:282 +#, fuzzy, python-format +msgid "%(count)d message processed successfully" +msgid_plural "%(count)d messages processed successfully" +msgstr[0] "%(count)d zpráva úspěšně odblokována" +msgstr[1] "%(count)d zprávy úspěšně odblokovány" +msgstr[2] "%(count)d zpráv úspěšně odblokováno" + #: extensions/amavis/management/commands/amnotify.py:61 msgid "[modoboa] Pending release requests" msgstr "[modoboa] Nevyřízené požadavky na odblokování" @@ -1754,48 +1830,59 @@ msgid "Banned" msgstr "Filtr zakázané pošty" #: extensions/amavis/templates/amavis/main_action_bar.html:18 -#: extensions/amavis/templatetags/amavis_tags.py:19 -#: extensions/amavis/templatetags/amavis_tags.py:54 +#: extensions/amavis/templatetags/amavis_tags.py:24 +#: extensions/amavis/templatetags/amavis_tags.py:79 msgid "Release" msgstr "Odblokovat" #: extensions/amavis/templates/amavis/main_action_bar.html:23 -#: extensions/amavis/templatetags/amavis_tags.py:25 -#: extensions/amavis/templatetags/amavis_tags.py:61 +#: extensions/amavis/templatetags/amavis_tags.py:30 +#: extensions/amavis/templatetags/amavis_tags.py:86 #: extensions/webmail/templatetags/webmail_tags.py:32 msgid "Delete" msgstr "Smazat" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templatetags/amavis_tags.py:44 +#, fuzzy +msgid "Mark as spam" +msgstr "Označit zprávy" + +#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templatetags/amavis_tags.py:49 +msgid "Mark as non-spam" +msgstr "" + +#: extensions/amavis/templates/amavis/main_action_bar.html:42 #: extensions/sievefilters/forms.py:64 msgid "All messages" msgstr "Všechny zprávy" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:42 msgid "All" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templates/amavis/main_action_bar.html:43 #, fuzzy msgid "Spam only" msgstr "Spam" -#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templates/amavis/main_action_bar.html:44 #, fuzzy msgid "Virus only" msgstr "Vir" -#: extensions/amavis/templates/amavis/main_action_bar.html:34 +#: extensions/amavis/templates/amavis/main_action_bar.html:45 #, fuzzy msgid "Bad Header only" msgstr "Chybné záhlaví" -#: extensions/amavis/templates/amavis/main_action_bar.html:35 +#: extensions/amavis/templates/amavis/main_action_bar.html:46 #, fuzzy msgid "Bad MIME only" msgstr "Špatný MIME" -#: extensions/amavis/templates/amavis/main_action_bar.html:36 +#: extensions/amavis/templates/amavis/main_action_bar.html:47 #, fuzzy msgid "Banned only" msgstr "Filtr zakázané pošty" @@ -1847,7 +1934,7 @@ msgstr "Úkony na zprávě:" msgid "Please visit %(listingurl)s for a full listing." msgstr "Navštivte stránku %(listingurl)s pro zobrazení kompletního seznamu." -#: extensions/amavis/templatetags/amavis_tags.py:28 +#: extensions/amavis/templatetags/amavis_tags.py:35 msgid "View full headers" msgstr "Zobrazit úplné záhlaví" @@ -2302,7 +2389,7 @@ msgstr "Odesílatel" msgid "Recipient" msgstr "Příjemce" -#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:83 +#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:84 msgid "Cc" msgstr "Kopie" @@ -2559,19 +2646,19 @@ msgstr "Nastaveno neznámé zobrazení" msgid "Bad custom period" msgstr "Neplatně nastavený vlastní časový interval" -#: extensions/stats/templates/stats/index.html:33 +#: extensions/stats/templates/stats/index.html:28 msgid "Search a domain" msgstr "Hledat doménu" -#: extensions/stats/templates/stats/index.html:37 +#: extensions/stats/templates/stats/index.html:32 msgid "Predefined time ranges" msgstr "Předdefinované časové intervaly" -#: extensions/stats/templates/stats/index.html:44 +#: extensions/stats/templates/stats/index.html:39 msgid "Custom time range" msgstr "Vlastní časový interval" -#: extensions/stats/templates/stats/index.html:57 +#: extensions/stats/templates/stats/index.html:52 msgid "Apply" msgstr "Uložit" @@ -2729,7 +2816,7 @@ msgstr "Odpověď serveru" msgid "Unknown action" msgstr "Neznámá akce" -#: extensions/webmail/forms.py:84 +#: extensions/webmail/forms.py:85 msgid "Cci" msgstr "BCC" @@ -2938,15 +3025,15 @@ msgstr "Ne" msgid "Failed to update password: %s" msgstr "Nebylo možné změnit heslo: %s" -#: lib/permissions.py:20 +#: lib/permissions.py:19 msgid "Simple user" msgstr "Uživatel" -#: lib/permissions.py:22 +#: lib/permissions.py:21 msgid "Super administrator" msgstr "Super správce" -#: lib/permissions.py:28 +#: lib/permissions.py:27 msgid "Domain administrator" msgstr "Správce domény" diff --git a/modoboa/locale/de/LC_MESSAGES/django.po b/modoboa/locale/de/LC_MESSAGES/django.po index 265d2d314..d0cf6874b 100644 --- a/modoboa/locale/de/LC_MESSAGES/django.po +++ b/modoboa/locale/de/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: # Arvedui , 2014 # Patrick Koetter , 2010 @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:29+0200\n" +"POT-Creation-Date: 2014-10-29 13:25+0100\n" "PO-Revision-Date: 2014-09-12 12:44+0000\n" "Last-Translator: Arvedui \n" -"Language-Team: German (http://www.transifex.com/projects/p/modoboa/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/modoboa/language/" +"de/)\n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: core/__init__.py:52 core/__init__.py:53 -#: extensions/admin/forms/account.py:326 extensions/admin/forms/domain.py:256 -#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:129 +#: extensions/admin/forms/account.py:327 extensions/admin/forms/domain.py:248 +#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:133 #: extensions/postfix_autoreply/app_settings.py:11 #: extensions/postfix_relay_domains/forms.py:138 #: extensions/sievefilters/app_settings.py:50 @@ -81,7 +82,9 @@ msgstr "Runden" msgid "" "Number of rounds to use (only used by sha256crypt and sha512crypt). Must be " "between 1000 and 999999999, inclusive." -msgstr "Anzahl zu verwendender Runden (nur für sha256crypt und sha512crypt). Zahl muss zwischen 1000 und 999999999 liegen." +msgstr "" +"Anzahl zu verwendender Runden (nur für sha256crypt und sha512crypt). Zahl " +"muss zwischen 1000 und 999999999 liegen." #: core/app_settings.py:73 msgid "Secret key" @@ -145,7 +148,8 @@ msgstr "Bind DN" msgid "" "The distinguished name to use when binding to the LDAP server. Leave empty " "for an anonymous bind" -msgstr "Der DN für einen Bind an den LDAP-Server. Nichts eingeben für anonymen Bind." +msgstr "" +"Der DN für einen Bind an den LDAP-Server. Nichts eingeben für anonymen Bind." #: core/app_settings.py:121 msgid "Bind password" @@ -171,7 +175,9 @@ msgstr "Suchfilter" msgid "" "An optional filter string (e.g. '(objectClass=person)'). In order to be " "valid, it must be enclosed in parentheses." -msgstr "Ein optionaler Filter z.B. (objectClass=person). Das Filter muss entsprechend der LDAP-Konvention in Klammern gesetzt werden." +msgstr "" +"Ein optionaler Filter z.B. (objectClass=person). Das Filter muss " +"entsprechend der LDAP-Konvention in Klammern gesetzt werden." #: core/app_settings.py:151 msgid "User DN template" @@ -182,7 +188,9 @@ msgstr "Vorlage für User DN" msgid "" "The template used to construct a user's DN. It should contain one " "placeholder (ie. %(user)s)" -msgstr "Die Vorlage für einen User DN. Sie sollte einen Platzhalter z.B. %(user)s enthalten." +msgstr "" +"Die Vorlage für einen User DN. Sie sollte einen Platzhalter z.B. %(user)s " +"enthalten." #: core/app_settings.py:161 msgid "Password attribute" @@ -206,9 +214,11 @@ msgstr "Administrator-Gruppen" #: core/app_settings.py:177 msgid "" -"Members of those LDAP Posix groups will be created as domain administrators." -" Use ';' characters to separate groups." -msgstr "Mitglieder dieser LDAP Posix-Gruppe werden als Domain-Administratoren angelegt werden. Nutzen sie ';', um Gruppen zu separieren." +"Members of those LDAP Posix groups will be created as domain administrators. " +"Use ';' characters to separate groups." +msgstr "" +"Mitglieder dieser LDAP Posix-Gruppe werden als Domain-Administratoren " +"angelegt werden. Nutzen sie ';', um Gruppen zu separieren." #: core/app_settings.py:184 msgid "Groups search base" @@ -226,7 +236,9 @@ msgstr "Domain/Mailbox Erstellung" msgid "" "Automatically create a domain and a mailbox when a new user is created just " "after the first successful authentication." -msgstr "Erstelle automatisch eine Domain und eine Mailbox wenn ein neuer user erstellt wurde, direkt nach der ersten erfolgreichen Au­then­ti­fi­ka­ti­on." +msgstr "" +"Erstelle automatisch eine Domain und eine Mailbox wenn ein neuer user " +"erstellt wurde, direkt nach der ersten erfolgreichen Au­then­ti­fi­ka­ti­on." #: core/app_settings.py:201 #: extensions/admin/templates/admin/editdomainform.html:7 @@ -273,8 +285,8 @@ msgstr "Ungültige Zahl für Runden" msgid "This field is required" msgstr "Dieses Feld ist erforderlich" -#: core/app_settings.py:349 extensions/amavis/app_settings.py:87 -#: extensions/amavis/templates/amavis/main_action_bar.html:29 +#: core/app_settings.py:349 extensions/amavis/app_settings.py:149 +#: extensions/amavis/templates/amavis/main_action_bar.html:40 #: extensions/webmail/app_settings.py:73 msgid "Display" msgstr "Darstellung" @@ -328,36 +340,38 @@ msgstr "Letzte Anmeldung" msgid "You can't delete your own account" msgstr "Sie können Ihr eigenes Konto nicht entfernen" -#: core/models.py:117 +#: core/models.py:130 msgid "Failed to update password: LDAP module not installed" msgstr "Konnte Kennwort nicht aktualisieren: LDAP-Modul nicht installiert" -#: core/models.py:170 +#: core/models.py:183 msgid "account" msgstr "Konto" -#: core/models.py:321 extensions/admin/models/domain.py:144 +#: core/models.py:334 extensions/admin/models/domain.py:144 #: extensions/admin/models/domain_alias.py:39 #: extensions/postfix_relay_domains/models.py:134 #: extensions/postfix_relay_domains/models.py:190 msgid "Invalid line" msgstr "Ungültige Zeile" -#: core/models.py:325 +#: core/models.py:338 msgid "You can't import an account with a role greater than yours" msgstr "Sie können kein Konto einer höheren Rolle importieren" -#: core/models.py:337 +#: core/models.py:350 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Der normale Benutzer '%s' muss eine gültige E-Mail-Adresse besitzen" -#: core/models.py:341 +#: core/models.py:354 #, python-format msgid "username and email fields must not differ for '%s'" -msgstr "Die Felder für Benutzername und E-Mail für '%s' dürfen sich nicht unterscheiden" +msgstr "" +"Die Felder für Benutzername und E-Mail für '%s' dürfen sich nicht " +"unterscheiden" -#: core/models.py:410 extensions/admin/models/alias.py:35 +#: core/models.py:423 extensions/admin/models/alias.py:35 #: extensions/admin/models/domain.py:32 #: extensions/admin/models/domain_alias.py:17 #: extensions/postfix_autoreply/models.py:28 @@ -366,29 +380,29 @@ msgstr "Die Felder für Benutzername und E-Mail für '%s' dürfen sich nicht unt msgid "enabled" msgstr "aktiviert" -#: core/models.py:411 +#: core/models.py:424 msgid "Check to enable this extension" msgstr "Auswählen, um diese Erweiterung zu aktivieren" -#: core/models.py:491 +#: core/models.py:504 msgid "added" msgstr "hinzugefügt" -#: core/models.py:494 +#: core/models.py:507 msgid "modified" msgstr "verändert" -#: core/models.py:496 core/models.py:521 +#: core/models.py:509 core/models.py:534 #, python-format msgid "%(object)s '%(name)s' %(action)s by user %(user)s" msgstr "%(object)s '%(name)s' %(action)s der Identität %(user)s" -#: core/models.py:523 +#: core/models.py:536 msgid "deleted" msgstr "entfernt" #: core/tables.py:8 core/templates/core/information.html:8 -#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:187 +#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:179 #: extensions/admin/templates/admin/domains_table.html:5 #: extensions/admin/templates/admin/editdomainform.html:13 #: extensions/admin/templates/admin/identities_table.html:5 @@ -504,7 +518,7 @@ msgstr "Aktualisieren sie ihre persönlichen Daten" #: core/templates/core/user_profile.html:8 #: extensions/admin/templates/admin/forward.html:8 #: extensions/admin/views/alias.py:112 extensions/admin/views/domain.py:168 -#: extensions/admin/views/identity.py:200 +#: extensions/admin/views/identity.py:204 #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9 #: extensions/postfix_relay_domains/views.py:66 #: extensions/sievefilters/views.py:166 extensions/webmail/views.py:172 @@ -535,7 +549,9 @@ msgstr "Identität '%s' hat sich erfolgreich angemeldet" #: core/views/auth.py:43 msgid "Your username and password didn't match. Please try again." -msgstr "Ihr Benutzername und Passwort stimmen nicht überein. Bitte versuchen Sie es noch einmal." +msgstr "" +"Ihr Benutzername und Passwort stimmen nicht überein. Bitte versuchen Sie es " +"noch einmal." #: core/views/auth.py:69 #, python-format @@ -571,15 +587,31 @@ msgid "" "\n" "

    Welcome to the online demo!

    \n" "

    Warning: the demo's concent is resetted every two hours.

    \n" -"

    To try the demo, the following users are available (username/password):

    \n" +"

    To try the demo, the following users are available (username/password):

    \n" "
      \n" "
    • A super administrator : admin/password
    • \n" "
    • A domain administrator : admin@demo.local/admin
    • \n" "
    • A simple user : user@demo.local/user
    • \n" "
    \n" "

    Please report any issue or give any suggestion to \n" -" the mailing list.

    \n" -msgstr "\n

    Willkommen zur Online Demo!

    \n

    Warnung: die Inhalte dieser Demo werden alle zwei Stunden gelöscht.

    \n

    Folgende User (Benutzername/Kennwort) stehen zum Testen zur Verfügung:

    \n
      \n
    • Super-Administrator : admin/password
    • \n
    • Domänen-Administrator : admin@demo.local/admin
    • \n
    • Normaler Benutzer: user@demo.local/user
    • \n
    \n

    Probleme und Anregungen bitte an die\n Mailingliste berichten.

    \n" +" the " +"mailing list.

    \n" +msgstr "" +"\n" +"

    Willkommen zur Online Demo!

    \n" +"

    Warnung: die Inhalte dieser Demo werden alle zwei Stunden gelöscht." +"

    \n" +"

    Folgende User (Benutzername/Kennwort) stehen zum Testen zur " +"Verfügung:

    \n" +"
      \n" +"
    • Super-Administrator : admin/password
    • \n" +"
    • Domänen-Administrator : admin@demo.local/admin
    • \n" +"
    • Normaler Benutzer: user@demo.local/user
    • \n" +"
    \n" +"

    Probleme und Anregungen bitte an die\n" +" Mailingliste berichten.

    \n" #: extensions/admin/__init__.py:48 msgid "Administration console" @@ -615,7 +647,7 @@ msgstr "Weiterleiten" msgid "Account import failed (%s): domain does not exist" msgstr "Kann Konto nicht importieren (%s): Die Domain existiert nicht" -#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:196 +#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:197 #, python-format msgid "Mailbox %s already exists" msgstr "Mailbox %s existiert bereits" @@ -625,6 +657,12 @@ msgstr "Mailbox %s existiert bereits" msgid "Account import failed (%s): wrong quota value" msgstr "Konto Import fehlgeschlagen (%s): Falscher Kontingentwert" +#: extensions/admin/__init__.py:212 extensions/admin/forms/domain.py:75 +#: extensions/postfix_relay_domains/forms.py:50 +#: extensions/postfix_relay_domains/forms.py:70 +msgid "domain alias" +msgstr "Domain-Alias" + #: extensions/admin/app_settings.py:13 #: extensions/admin/templates/admin/editdomainform.html:25 #: extensions/limits/app_settings.py:31 extensions/limits/models.py:23 @@ -641,7 +679,9 @@ msgstr "Mailbox im Dateisystem verwalten" msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" -msgstr "Mailboxen auch in Dateisystem umbenennen oder entfernen wenn sie in Modoboa umbenannt oder entfernt werden" +msgstr "" +"Mailboxen auch in Dateisystem umbenennen oder entfernen wenn sie in Modoboa " +"umbenannt oder entfernt werden" #: extensions/admin/app_settings.py:22 msgid "Mailboxes ower" @@ -649,7 +689,9 @@ msgstr "Mailbox-Besitzer" #: extensions/admin/app_settings.py:24 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." +msgstr "" +"UID des virtuellen Benutzers, der Besitzer der Domains, Mailboxen und " +"Nachrichten im Dateisystem ist." #: extensions/admin/app_settings.py:28 msgid "Default domain quota" @@ -659,7 +701,9 @@ msgstr "Standard Domainquota" msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. 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“" +msgstr "" +"Standardquota (in MB) für neu erstelle Domains ohne explizite Wertangabe. " +"Der Wert 0 bedeutet „Kein Quota“" #: extensions/admin/app_settings.py:38 msgid "Automatic account removal" @@ -670,7 +714,7 @@ msgid "When a mailbox is removed, also remove the associated account" msgstr "Beim Löschen der Mailbox auch das Konto entfernen." #: extensions/admin/app_settings.py:81 extensions/admin/forms/account.py:178 -#: extensions/admin/forms/domain.py:56 +#: extensions/admin/forms/domain.py:57 msgid "Must be a positive integer" msgstr "Muss eine positive Integer sein" @@ -682,7 +726,9 @@ msgstr "Ein Mailbox ist erforderlich" msgid "" "The user's name. Must be a valid e-mail address for simple users or " "administrators with a mailbox." -msgstr "Der Anwendername. Muss eine gültige E-Mail-Adresse für 'simple users' oder Administratoren mit einer Mailbox sein." +msgstr "" +"Der Anwendername. Muss eine gültige E-Mail-Adresse für 'simple users' oder " +"Administratoren mit einer Mailbox sein." #: extensions/admin/forms/account.py:26 msgid "Role" @@ -716,7 +762,7 @@ msgstr "Sie können Ihr eigenes Konto nicht deaktivieren" msgid "E-mail" msgstr "E-Mail" -#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:17 +#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:18 msgid "Quota" msgstr "Quota" @@ -725,9 +771,12 @@ msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " "administrators)." -msgstr "Quota in MB für diese Mailbox. Geben Sie einen eigenen Wert an oder nutzen Sie den Standardwert der Domain. Lassen Sie das Feld leer für unbegrenztes Quota - Domänen-Administratoren ist dies nicht gestattet." +msgstr "" +"Quota in MB für diese Mailbox. Geben Sie einen eigenen Wert an oder nutzen " +"Sie den Standardwert der Domain. Lassen Sie das Feld leer für unbegrenztes " +"Quota - Domänen-Administratoren ist dies nicht gestattet." -#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:26 +#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:27 #: extensions/admin/templates/admin/domains_table.html:6 #: extensions/postfix_relay_domains/forms.py:12 msgid "Alias(es)" @@ -738,27 +787,30 @@ msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " "*@domain.tld)." -msgstr "Alias(e) für diese Mailbox. Geben Sie jeweils nur eine Adresse pro Eingabe an. Bestätigen Sie mit ENTER um die Eingabe zu bestätigen. Geben Sie '*' an, um einen 'catchall'-Alias (Bsp: *@example.com) zu erstellen." +msgstr "" +"Alias(e) für diese Mailbox. Geben Sie jeweils nur eine Adresse pro Eingabe " +"an. Bestätigen Sie mit ENTER um die Eingabe zu bestätigen. Geben Sie '*' an, " +"um einen 'catchall'-Alias (Bsp: *@example.com) zu erstellen." -#: extensions/admin/forms/account.py:187 extensions/admin/forms/account.py:217 +#: extensions/admin/forms/account.py:188 extensions/admin/forms/account.py:218 #: extensions/admin/forms/alias.py:65 msgid "Domain does not exist" msgstr "Domain existiert nicht" -#: extensions/admin/forms/account.py:284 +#: extensions/admin/forms/account.py:285 msgid "Domain(s)" msgstr "Domain(s)" -#: extensions/admin/forms/account.py:286 +#: extensions/admin/forms/account.py:287 msgid "Domain(s) that user administrates" msgstr "Domänen, die dieser Anwender administriert" -#: extensions/admin/forms/account.py:328 -#: extensions/admin/views/identity.py:132 +#: extensions/admin/forms/account.py:329 +#: extensions/admin/views/identity.py:136 msgid "Mail" msgstr "E-Mail" -#: extensions/admin/forms/account.py:330 +#: extensions/admin/forms/account.py:331 msgid "Permissions" msgstr "Berechtigungen" @@ -770,7 +822,9 @@ msgstr "E-Mail Adresse" msgid "" "The distribution list address. Use the '*' character to create a 'catchall' " "address (ex: *@domain.tld)." -msgstr "Adresse einer Verteilerliste. Geben Sie '*' an, um einen 'catchall'-Alias (Bsp: *@example.com) zu erstellen." +msgstr "" +"Adresse einer Verteilerliste. Geben Sie '*' an, um einen 'catchall'-Alias " +"(Bsp: *@example.com) zu erstellen." #: extensions/admin/forms/alias.py:23 msgid "Recipients" @@ -780,7 +834,9 @@ msgstr "Empfänger" msgid "" "Mailbox(es) this alias will point to. Indicate only one address per input, " "press ENTER to add a new input." -msgstr "Mailboxen auf die der Alias verweist. Geben Sie jeweils nur eine Adresse ein und bestätigen Sie mit ENTER." +msgstr "" +"Mailboxen auf die der Alias verweist. Geben Sie jeweils nur eine Adresse ein " +"und bestätigen Sie mit ENTER." #: extensions/admin/forms/alias.py:68 msgid "You don't have access to this domain" @@ -804,64 +860,65 @@ msgstr "Empfänger %s existiert bereits" msgid "No recipient defined" msgstr "Keine Empfänger angegeben" -#: extensions/admin/forms/domain.py:20 +#: extensions/admin/forms/domain.py:21 msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." -msgstr "Standardquota in MB für Mailboxen. Bei leerem Feld wird der Domain-Standard genutzt." +msgstr "" +"Standardquota in MB für Mailboxen. Bei leerem Feld wird der Domain-Standard " +"genutzt." -#: extensions/admin/forms/domain.py:29 +#: extensions/admin/forms/domain.py:30 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." -msgstr "Alias(e) für diese Mailbox. Geben Sie jeweils nur eine Adresse pro Eingabefeld an. Bestätigen Sie mit ENTER, um ein neues Eingabefeld zu erhalten." +msgstr "" +"Alias(e) für diese Mailbox. Geben Sie jeweils nur eine Adresse pro " +"Eingabefeld an. Bestätigen Sie mit ENTER, um ein neues Eingabefeld zu " +"erhalten." -#: extensions/admin/forms/domain.py:75 -#: extensions/postfix_relay_domains/forms.py:50 -#: extensions/postfix_relay_domains/forms.py:70 -msgid "domain alias" -msgstr "Domain-Alias" - -#: extensions/admin/forms/domain.py:82 extensions/admin/forms/domain.py:98 +#: extensions/admin/forms/domain.py:78 extensions/admin/forms/domain.py:92 #: extensions/postfix_relay_domains/forms.py:58 #: extensions/postfix_relay_domains/forms.py:78 #, python-format msgid "A %s with this name already exists" msgstr "Ein %s mit diesem Namen existiert bereits" -#: extensions/admin/forms/domain.py:92 +#: extensions/admin/forms/domain.py:89 #: extensions/postfix_relay_domains/forms.py:49 #: extensions/postfix_relay_domains/forms.py:71 msgid "domain" msgstr "Domain" -#: extensions/admin/forms/domain.py:181 +#: extensions/admin/forms/domain.py:173 msgid "Create a domain administrator" msgstr "Domänen-Administrator erstellen" -#: extensions/admin/forms/domain.py:183 +#: extensions/admin/forms/domain.py:175 msgid "Automatically create an administrator for this domain" msgstr "Automatisch Administrator für diese Domain anlegen" -#: extensions/admin/forms/domain.py:190 +#: extensions/admin/forms/domain.py:182 msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." -msgstr "Name des Administrators. Geben Sie nicht den Domainnamen mit an. Er wird automatisch hinzugefügt." +msgstr "" +"Name des Administrators. Geben Sie nicht den Domainnamen mit an. Er wird " +"automatisch hinzugefügt." -#: extensions/admin/forms/domain.py:198 +#: extensions/admin/forms/domain.py:190 msgid "Create aliases" msgstr "Aliase erstellen" -#: extensions/admin/forms/domain.py:200 +#: extensions/admin/forms/domain.py:192 msgid "Automatically create standard aliases for this domain" msgstr "Automatisch Standard-Aliase für Domain anlegen" -#: extensions/admin/forms/domain.py:216 +#: extensions/admin/forms/domain.py:208 msgid "Invalid format" msgstr "Ungültiges Format" -#: extensions/admin/forms/domain.py:230 +#: extensions/admin/forms/domain.py:222 #, python-format msgid "User '%s' already exists" msgstr "Identität %s existiert bereits" @@ -894,9 +951,11 @@ msgstr "Nachricht weiterleiten und Kopie in Mailbox ablegen" msgid "" "You can't define a forward to a local destination. Please ask your " "administrator to create an alias instead." -msgstr "Sie können keine Weiterleitung auf ein lokales Ziel anlegen. Bitten Sie Ihren Administrator stattdessen einen Alias anzulegen." +msgstr "" +"Sie können keine Weiterleitung auf ein lokales Ziel anlegen. Bitten Sie " +"Ihren Administrator stattdessen einen Alias anzulegen." -#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:198 +#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:200 msgid "Select a file" msgstr "Wählen Sie eine Datei" @@ -916,15 +975,17 @@ msgstr "Passworte verschlüsseln" msgid "Check this option if passwords contained in your file are not crypted" msgstr "Auswählen wenn Kennwörter in Datei nicht verschlüsselt sind" -#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:62 +#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:74 msgid "address" msgstr "Adresse" #: extensions/admin/models/alias.py:20 msgid "" -"The alias address (without the domain part). For a 'catch-all' address, just" -" enter an * character." -msgstr "Die Alias-Adresse (ohne den Domain-Anteil). Geben sie für eine Adresse an, die alles annimmt, * an." +"The alias address (without the domain part). For a 'catch-all' address, just " +"enter an * character." +msgstr "" +"Die Alias-Adresse (ohne den Domain-Anteil). Geben sie für eine Adresse an, " +"die alles annimmt, * an." #: extensions/admin/models/alias.py:26 msgid "mailboxes" @@ -1012,21 +1073,21 @@ msgstr "Domäne auf die dieser Alias verweist" msgid "Unknown domain %s" msgstr "Unbekannte Domain %s" -#: extensions/admin/models/mailbox.py:63 +#: extensions/admin/models/mailbox.py:75 msgid "Mailbox address (without the @domain.tld part)" msgstr "Mailbox-Adresse (ohne den @domain.tld-Anteil)" -#: extensions/admin/models/mailbox.py:125 +#: extensions/admin/models/mailbox.py:136 #, python-format msgid "Failed to retrieve mailbox location (%s)" msgstr "Konnte Speicherort der Mailbox (%s) nicht bestimmen" -#: extensions/admin/models/mailbox.py:194 +#: extensions/admin/models/mailbox.py:221 #, python-format msgid "Quota is greater than the allowed domain's limit (%dM)" msgstr "Das Quota ist größer als das maximale Quota der Domain (%dM)" -#: extensions/admin/models/mailbox.py:199 +#: extensions/admin/models/mailbox.py:227 msgid "A quota is required" msgstr "Ein Quota ist erforderlich" @@ -1098,7 +1159,7 @@ msgid "Importing..." msgstr "Importiere …" #: extensions/admin/templates/admin/listing.html:14 -#: extensions/stats/templates/stats/index.html:28 +#: extensions/stats/templates/stats/index.html:23 msgid "Filter" msgstr "Filter" @@ -1200,8 +1261,8 @@ msgid "Alias with this name already exists" msgstr "Ein Alias mit diesem Namen existiert bereits" #: extensions/admin/views/alias.py:50 extensions/admin/views/domain.py:102 -#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:133 -#: extensions/admin/views/identity.py:160 +#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:137 +#: extensions/admin/views/identity.py:164 #: extensions/postfix_relay_domains/views.py:34 #: extensions/sievefilters/views.py:144 extensions/sievefilters/views.py:233 #: extensions/webmail/views.py:153 @@ -1244,7 +1305,7 @@ msgstr "Weiterleitung verändert" msgid "Alias modified" msgstr "Alias verändert" -#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:130 +#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:134 msgid "Next" msgstr "Nächstes" @@ -1252,7 +1313,7 @@ msgstr "Nächstes" msgid "Options" msgstr "optionen" -#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:134 +#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:138 msgid "Previous" msgstr "Vorheriges" @@ -1286,11 +1347,11 @@ msgstr "Identitäten exportieren" msgid "Export domains" msgstr "Domains exportieren" -#: extensions/admin/views/identity.py:104 -#: extensions/admin/views/identity.py:227 -#: extensions/admin/views/identity.py:232 extensions/amavis/views.py:144 -#: extensions/amavis/views.py:148 extensions/amavis/views.py:181 -#: extensions/amavis/views.py:186 extensions/amavis/views.py:188 +#: extensions/admin/views/identity.py:108 +#: extensions/admin/views/identity.py:231 +#: extensions/admin/views/identity.py:236 extensions/amavis/views.py:147 +#: extensions/amavis/views.py:151 extensions/amavis/views.py:184 +#: extensions/amavis/views.py:189 extensions/amavis/views.py:191 #: extensions/webmail/views.py:49 extensions/webmail/views.py:67 #: extensions/webmail/views.py:81 extensions/webmail/views.py:99 #: extensions/webmail/views.py:116 extensions/webmail/views.py:202 @@ -1301,19 +1362,19 @@ msgstr "Domains exportieren" msgid "Invalid request" msgstr "Ungültige Anfrage" -#: extensions/admin/views/identity.py:151 +#: extensions/admin/views/identity.py:155 msgid "Account created" msgstr "Konto erstellt" -#: extensions/admin/views/identity.py:157 +#: extensions/admin/views/identity.py:161 msgid "New account" msgstr "Neues Konto" -#: extensions/admin/views/identity.py:193 +#: extensions/admin/views/identity.py:197 msgid "Account updated" msgstr "Konto aktualisiert" -#: extensions/admin/views/identity.py:217 +#: extensions/admin/views/identity.py:221 msgid "Account deleted" msgid_plural "Accounts deleted" msgstr[0] "Konto gelöscht" @@ -1328,9 +1389,19 @@ msgid "" "
  • domainalias; name; targeted domain; enabled
  • \n" " %s\n" "\n" -"

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

    \n" +"

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

    \n" "

    You can use a different character as separator.

    \n" -msgstr "Verwenden sie eine CSV-Datei mit einem der folgenden Formate:\n
      \n
    • domain; name; quota; enabled
    • \n
    • domainalias; name; targeted domain; enabled
    • \n %s\n
    \n

    Das erste Element jeder Zeile ist zwingend und muss gleich zum vorhergehenden sein.

    \n

    Ein anderes Zeichen als Trenner ist gestattet.

    \n" +msgstr "" +"Verwenden sie eine CSV-Datei mit einem der folgenden Formate:\n" +"
      \n" +"
    • domain; name; quota; enabled
    • \n" +"
    • domainalias; name; targeted domain; enabled
    • \n" +" %s\n" +"
    \n" +"

    Das erste Element jeder Zeile ist zwingend und muss gleich zum " +"vorhergehenden sein.

    \n" +"

    Ein anderes Zeichen als Trenner ist gestattet.

    \n" #: extensions/admin/views/import.py:51 msgid "Import domains" @@ -1350,15 +1421,29 @@ msgstr "%d Objekte erfolgreich importiert" msgid "" "Provide a CSV file where lines respect one of the following formats:\n" "
      \n" -"
    • account; loginname; password; first name; last name; enabled; group; address; quota; [, domain, ...]
    • \n" +"
    • account; loginname; password; first name; last name; enabled; group; " +"address; quota; [, domain, ...]
    • \n" "
    • alias; address; enabled; internal recipient
    • \n" "
    • forward; address; enabled; external recipient
    • \n" "
    • dlist; address; enabled; recipient; recipient; ...
    • \n" "
    \n" -"

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

    \n" +"

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

    \n" "\n" "

    You can use a different character as separator.

    \n" -msgstr "Verwenden sie eine CSV-Datei in einem der folgenden Formate:\n
      \n
    • account; loginname; password; first name; last name; enabled; group; address; quota; [, domain, ...]
    • \n
    • alias; address; enabled; internal recipient
    • \n
    • forward; address; enabled; external recipient
    • \n
    • dlist; address; enabled; recipient; recipient; ...
    • \n
    \n

    Das erste Element einer Zeile ist zwingend und muss gleich mit einem der vorhergehenden sein.

    \n\n

    Ein anderes Zeichen als Separator ist gestattet.

    \n" +msgstr "" +"Verwenden sie eine CSV-Datei in einem der folgenden Formate:\n" +"
      \n" +"
    • account; loginname; password; first name; last name; enabled; group; " +"address; quota; [, domain, ...]
    • \n" +"
    • alias; address; enabled; internal recipient
    • \n" +"
    • forward; address; enabled; external recipient
    • \n" +"
    • dlist; address; enabled; recipient; recipient; ...
    • \n" +"
    \n" +"

    Das erste Element einer Zeile ist zwingend und muss gleich mit einem der " +"vorhergehenden sein.

    \n" +"\n" +"

    Ein anderes Zeichen als Separator ist gestattet.

    \n" #: extensions/admin/views/import.py:167 msgid "Import identities" @@ -1372,7 +1457,7 @@ msgstr "Weiterleitung aktualisiert" msgid "Simple amavis management frontend" msgstr "Einfache amavis Management Oberfläche" -#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:18 +#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:20 msgid "Quarantine" msgstr "Quarantäne" @@ -1386,7 +1471,9 @@ msgstr "Maximales Alter einer Nachricht" #: extensions/amavis/app_settings.py:16 msgid "Quarantine messages maximum age (in days) before deletion" -msgstr "Maximales Alter (in Tagen) von Nachrichten in der Quarantäne bevor sie gelöscht werden" +msgstr "" +"Maximales Alter (in Tagen) von Nachrichten in der Quarantäne bevor sie " +"gelöscht werden" #: extensions/amavis/app_settings.py:19 msgid "Messages releasing" @@ -1462,29 +1549,100 @@ msgstr "Absender von Benachrichtigungen" #: extensions/amavis/app_settings.py:74 msgid "The e-mail address used to send notitications" -msgstr "Die Mailadresse, die verwendet wird, um Benachrichtigungen zu versenden" +msgstr "" +"Die Mailadresse, die verwendet wird, um Benachrichtigungen zu versenden" -#: extensions/amavis/app_settings.py:91 extensions/webmail/app_settings.py:91 +#: extensions/amavis/app_settings.py:77 +#: extensions/amavis/templates/amavis/main_action_bar.html:27 +msgid "Manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:80 +msgid "Enable manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:83 +msgid "Allow super administrators to manually train Spamassassin" +msgstr "" + +#: extensions/amavis/app_settings.py:88 +msgid "Is Spamassassin local?" +msgstr "" + +#: extensions/amavis/app_settings.py:91 +msgid "Tell if Spamassassin is running on the same server than modoboa" +msgstr "" + +#: extensions/amavis/app_settings.py:96 +#, fuzzy +msgid "Default user" +msgstr "Standard-Editor" + +#: extensions/amavis/app_settings.py:99 +msgid "Name of the user owning the default bayesian database" +msgstr "" + +#: extensions/amavis/app_settings.py:104 +#, fuzzy +msgid "Spamd address" +msgstr "From:-Adresse" + +#: extensions/amavis/app_settings.py:106 +msgid "The IP address where spamd can be reached" +msgstr "" + +#: extensions/amavis/app_settings.py:110 +#, fuzzy +msgid "Spamd port" +msgstr "Nur Spam" + +#: extensions/amavis/app_settings.py:112 +msgid "The TCP port spamd is listening on" +msgstr "" + +#: extensions/amavis/app_settings.py:116 +msgid "Enable per-domain manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:119 +msgid "" +"Allow domain administrators to train Spamassassin (within dedicated per-" +"domain databases)" +msgstr "" + +#: extensions/amavis/app_settings.py:125 +msgid "Enable per-user manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:128 +msgid "" +"Allow simple users to personally train Spamassassin (within a dedicated " +"database)" +msgstr "" + +#: extensions/amavis/app_settings.py:153 extensions/webmail/app_settings.py:91 msgid "Number of displayed emails per page" msgstr "Anzahl dargestellter Nachrichten pro Seite" -#: extensions/amavis/app_settings.py:92 +#: extensions/amavis/app_settings.py:154 msgid "Set the maximum number of messages displayed in a page" -msgstr "Legt die maximale Anzahl von Nachrichten fest, die in einer Seite dargestellt werden" +msgstr "" +"Legt die maximale Anzahl von Nachrichten fest, die in einer Seite " +"dargestellt werden" -#: extensions/amavis/general_callbacks.py:82 +#: extensions/amavis/general_callbacks.py:136 msgid "pending requests" msgstr "Offene Anfragen" -#: extensions/amavis/general_callbacks.py:125 +#: extensions/amavis/general_callbacks.py:179 msgid "Pending requests" msgstr "Offene Anfragen" -#: extensions/amavis/general_callbacks.py:135 +#: extensions/amavis/general_callbacks.py:189 msgid "Content filter" msgstr "Inhaltsfilter" -#: extensions/amavis/lib.py:56 +#: extensions/amavis/lib.py:60 #, python-format msgid "Connection to amavis failed: %s" msgstr "Verbindung zu amavis fehlgeschlagen: %s" @@ -1511,7 +1669,9 @@ msgstr "Standard" #: extensions/amavis/models.py:98 msgid "Bypass virus checks or not. Choose 'default' to use global settings." -msgstr "Virus-Prüfungen umgehen oder nicht. Geben Sie, um den Domain-Standard zu nutzen, keinen individuellen Wert an." +msgstr "" +"Virus-Prüfungen umgehen oder nicht. Geben Sie, um den Domain-Standard zu " +"nutzen, keinen individuellen Wert an." #: extensions/amavis/models.py:101 msgid "Spam filter" @@ -1519,7 +1679,9 @@ msgstr "SPAM-Filter" #: extensions/amavis/models.py:106 msgid "Bypass spam checks or not. Choose 'default' to use global settings." -msgstr "Spam-Prüfungen umgehen oder nicht. Geben Sie, um den Domain-Standard zu nutzen, keinen individuellen Wert an." +msgstr "" +"Spam-Prüfungen umgehen oder nicht. Geben Sie, um den Domain-Standard zu " +"nutzen, keinen individuellen Wert an." #: extensions/amavis/models.py:109 msgid "Banned filter" @@ -1527,7 +1689,9 @@ msgstr "Filter für unerwünschte Dateien" #: extensions/amavis/models.py:114 msgid "Bypass banned checks or not. Choose 'default' to use global settings." -msgstr "Unerwünschte Dateien umgehen oder nicht. Geben Sie, um den Domain-Standard zu nutzen, keinen individuellen Wert an." +msgstr "" +"Unerwünschte Dateien umgehen oder nicht. Geben Sie, um den Domain-Standard " +"zu nutzen, keinen individuellen Wert an." #: extensions/amavis/models.py:144 msgid "Spam marker" @@ -1535,17 +1699,19 @@ msgstr "SPAM-Markierung" #: extensions/amavis/models.py:146 msgid "" -"Modify spam subject using the specified text. Choose 'default' to use global" -" settings." -msgstr "Betreff:-Zeile einer Spam-Nachricht mit dem angegebenen Text ergänzen. Wählen Sie 'Standard' für den systemweiten Standard." +"Modify spam subject using the specified text. Choose 'default' to use global " +"settings." +msgstr "" +"Betreff:-Zeile einer Spam-Nachricht mit dem angegebenen Text ergänzen. " +"Wählen Sie 'Standard' für den systemweiten Standard." #: extensions/amavis/sql_listing.py:29 msgid "Score" msgstr "Punktzahl" #: extensions/amavis/sql_listing.py:33 -#: extensions/amavis/templatetags/amavis_tags.py:75 -#: extensions/webmail/forms.py:82 +#: extensions/amavis/templatetags/amavis_tags.py:100 +#: extensions/webmail/forms.py:83 msgid "To" msgstr "An" @@ -1556,49 +1722,56 @@ msgid "From" msgstr "Von" #: extensions/amavis/sql_listing.py:40 extensions/sievefilters/forms.py:77 -#: extensions/webmail/forms.py:86 extensions/webmail/lib/imapemail.py:288 +#: extensions/webmail/forms.py:87 extensions/webmail/lib/imapemail.py:288 #: extensions/webmail/lib/listing.py:27 extensions/webmail/lib/tables.py:26 #: templates/common/email_searchbar.html:6 msgid "Subject" msgstr "Betreff" -#: extensions/amavis/views.py:27 +#: extensions/amavis/views.py:30 msgid "Empty quarantine" msgstr "Quarantäne leeren" -#: extensions/amavis/views.py:149 +#: extensions/amavis/views.py:152 msgid "Message deleted" msgstr "Nachricht gelöscht" -#: extensions/amavis/views.py:168 +#: extensions/amavis/views.py:171 #, python-format msgid "%(count)d message deleted successfully" msgid_plural "%(count)d messages deleted successfully" msgstr[0] "%(count)d Nachricht erfolgreich gelöscht" msgstr[1] "%(count)d Nachrichten erfolgreich gelöscht" -#: extensions/amavis/views.py:191 +#: extensions/amavis/views.py:194 msgid "Request sent" msgstr "Anfrage gesendet" -#: extensions/amavis/views.py:197 +#: extensions/amavis/views.py:200 msgid "Message released" msgstr "Nachricht freigegeben" -#: extensions/amavis/views.py:225 +#: extensions/amavis/views.py:228 #, python-format msgid "%(count)d request sent" msgid_plural "%(count)d requests sent" msgstr[0] "%(count)d Anfrage gesendet" msgstr[1] "%(count)d Anfragen gesendet" -#: extensions/amavis/views.py:246 +#: extensions/amavis/views.py:249 #, python-format msgid "%(count)d message released successfully" msgid_plural "%(count)d messages released successfully" msgstr[0] "%(count)d Nachicht erfolgreich freigegeben" msgstr[1] "%(count)d Nachichten erfolgreich freigegeben" +#: extensions/amavis/views.py:282 +#, fuzzy, python-format +msgid "%(count)d message processed successfully" +msgid_plural "%(count)d messages processed successfully" +msgstr[0] "%(count)d Nachicht erfolgreich freigegeben" +msgstr[1] "%(count)d Nachichten erfolgreich freigegeben" + #: extensions/amavis/management/commands/amnotify.py:61 msgid "[modoboa] Pending release requests" msgstr "[modoboa] Offene Freigabeanfragen" @@ -1644,44 +1817,55 @@ msgid "Banned" msgstr "Unerwünschte Dateien" #: extensions/amavis/templates/amavis/main_action_bar.html:18 -#: extensions/amavis/templatetags/amavis_tags.py:19 -#: extensions/amavis/templatetags/amavis_tags.py:54 +#: extensions/amavis/templatetags/amavis_tags.py:24 +#: extensions/amavis/templatetags/amavis_tags.py:79 msgid "Release" msgstr "Freigeben" #: extensions/amavis/templates/amavis/main_action_bar.html:23 -#: extensions/amavis/templatetags/amavis_tags.py:25 -#: extensions/amavis/templatetags/amavis_tags.py:61 +#: extensions/amavis/templatetags/amavis_tags.py:30 +#: extensions/amavis/templatetags/amavis_tags.py:86 #: extensions/webmail/templatetags/webmail_tags.py:32 msgid "Delete" msgstr "Löschen" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templatetags/amavis_tags.py:44 +#, fuzzy +msgid "Mark as spam" +msgstr "Markiere Nachrichten" + +#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templatetags/amavis_tags.py:49 +msgid "Mark as non-spam" +msgstr "" + +#: extensions/amavis/templates/amavis/main_action_bar.html:42 #: extensions/sievefilters/forms.py:64 msgid "All messages" msgstr "Alle Nachrichten" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:42 msgid "All" msgstr "Alle" -#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templates/amavis/main_action_bar.html:43 msgid "Spam only" msgstr "Nur Spam" -#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templates/amavis/main_action_bar.html:44 msgid "Virus only" msgstr "Nur Virus" -#: extensions/amavis/templates/amavis/main_action_bar.html:34 +#: extensions/amavis/templates/amavis/main_action_bar.html:45 msgid "Bad Header only" msgstr "Nur Fehlerhafte Header" -#: extensions/amavis/templates/amavis/main_action_bar.html:35 +#: extensions/amavis/templates/amavis/main_action_bar.html:46 msgid "Bad MIME only" msgstr "Nur Fehlerhaftes MIME" -#: extensions/amavis/templates/amavis/main_action_bar.html:36 +#: extensions/amavis/templates/amavis/main_action_bar.html:47 msgid "Banned only" msgstr "Nur Unerwünschte Dateien" @@ -1693,8 +1877,12 @@ msgid "" msgid_plural "" "\n" "%(counter)s release requests are pending for action.\n" -msgstr[0] "\n%(counter)s Freigabe-Anforderung wartet auf sie.\n" -msgstr[1] "\n%(counter)s Freigabe-Anforderungen warten auf sie.\n" +msgstr[0] "" +"\n" +"%(counter)s Freigabe-Anforderung wartet auf sie.\n" +msgstr[1] "" +"\n" +"%(counter)s Freigabe-Anforderungen warten auf sie.\n" #: extensions/amavis/templates/amavis/notifications/pending_requests.html:6 msgid "Sketch:" @@ -1723,16 +1911,18 @@ msgstr "Rektion auf diese Nachricht:" #: extensions/amavis/templates/amavis/notifications/pending_requests.html:14 #, python-format msgid "Please visit %(listingurl)s for a full listing." -msgstr "Bitte besuchen sie %(listingurl)s um eine vollständige Ausgabe zu erhalten." +msgstr "" +"Bitte besuchen sie %(listingurl)s um eine vollständige Ausgabe zu erhalten." -#: extensions/amavis/templatetags/amavis_tags.py:28 +#: extensions/amavis/templatetags/amavis_tags.py:35 msgid "View full headers" msgstr "Alle Mail-Header ansehen" #: extensions/limits/__init__.py:25 msgid "" "Per administrator resources to limit the number of objects they can create" -msgstr "Administrator-Ressourcen, um die Anzahl erstellbarer Objekte einzuschränken" +msgstr "" +"Administrator-Ressourcen, um die Anzahl erstellbarer Objekte einzuschränken" #: extensions/limits/__init__.py:56 msgid "Limits" @@ -1747,9 +1937,10 @@ msgid "Domain admins" msgstr "Domänen-Administratoren" #: extensions/limits/app_settings.py:15 -msgid "" -"Maximum number of allowed domain administrators for a new administrator" -msgstr "Maximale Anzahl Domänenadministratoren, die ein neuer Administrator erstellen darf" +msgid "Maximum number of allowed domain administrators for a new administrator" +msgstr "" +"Maximale Anzahl Domänenadministratoren, die ein neuer Administrator " +"erstellen darf" #: extensions/limits/app_settings.py:21 msgid "Maximum number of allowed domains for a new administrator" @@ -1757,7 +1948,8 @@ msgstr "Maximale Anzahl Domains, die ein neuer Administrator erstellen darf" #: extensions/limits/app_settings.py:27 msgid "Maximum number of allowed domain aliases for a new administrator" -msgstr "Maximale Anzahl Domain Aliase, die ein neuer Administrator erstellen darf" +msgstr "" +"Maximale Anzahl Domain Aliase, die ein neuer Administrator erstellen darf" #: extensions/limits/app_settings.py:33 msgid "Maximum number of allowed mailboxes for a new administrator" @@ -1777,7 +1969,8 @@ msgstr "Ihre Ressourcen wurde noch nicht initialisiert" #: extensions/limits/forms.py:61 msgid "You're not allowed to define unlimited values" -msgstr "Sie verfügen nicht über ausreichend Rechte, um unbegrenzte Werte anzugeben" +msgstr "" +"Sie verfügen nicht über ausreichend Rechte, um unbegrenzte Werte anzugeben" #: extensions/limits/general_callbacks.py:10 msgid "Reseller" @@ -1830,7 +2023,8 @@ msgstr "Ressourcen-Verbrauch" #: extensions/postfix_autoreply/__init__.py:26 msgid "Auto-reply (vacation) functionality using Postfix" -msgstr "Automatische Antwort (Abwesenheitsbenachrichtigung) über Postfix-Programm" +msgstr "" +"Automatische Antwort (Abwesenheitsbenachrichtigung) über Postfix-Programm" #: extensions/postfix_autoreply/__init__.py:49 msgid "Automatic replies" @@ -1842,7 +2036,9 @@ msgstr "Zeitüberschreitung für automatische Antworten" #: extensions/postfix_autoreply/app_settings.py:16 msgid "Timeout in seconds between two auto-replies to the same recipient" -msgstr "Zeit in Sekunden zwischen zwei automatisierten Antworten an denselben Empfänger" +msgstr "" +"Zeit in Sekunden zwischen zwei automatisierten Antworten an denselben " +"Empfänger" #: extensions/postfix_autoreply/app_settings.py:20 msgid "Default subject" @@ -1868,14 +2064,20 @@ msgid "" "\n" "Best regards,\n" "%(name)s\n" -msgstr "Ich bin im Moment weg und werde antworten sobald ich zurück bin.\n\nMit freundlichen Grüßen\n%(name)s\n" +msgstr "" +"Ich bin im Moment weg und werde antworten sobald ich zurück bin.\n" +"\n" +"Mit freundlichen Grüßen\n" +"%(name)s\n" #: extensions/postfix_autoreply/app_settings.py:36 #, python-format msgid "" "Default content used when an auto-reply message is created automatically. " "The '%(name)s' macro will be replaced by the user's full name." -msgstr "Standardinhalt wenn eine Antwort automatisch erstellt wird. Das '%(name)s' Makro wird gegen den vollen Anwendernamen ersetzt." +msgstr "" +"Standardinhalt wenn eine Antwort automatisch erstellt wird. Das '%(name)s' " +"Makro wird gegen den vollen Anwendernamen ersetzt." #: extensions/postfix_autoreply/forms.py:12 msgid "Activate your auto reply from this date" @@ -1937,7 +2139,9 @@ msgstr "Automatische Antwort erfolgreich aktualisiert." #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:2 msgid "Define a message to automatically send when you are off" -msgstr "Gegen sie eine Nachricht an, die gesendet werden soll, wenn Sie nicht erreichbar sind" +msgstr "" +"Gegen sie eine Nachricht an, die gesendet werden soll, wenn Sie nicht " +"erreichbar sind" #: extensions/postfix_relay_domains/__init__.py:72 msgid "Relay domains support for Postfix" @@ -1961,7 +2165,9 @@ msgstr "Pfad zur master.cf Konfigurationsdatei" msgid "" "Alias(es) of this relay domain. Indicate only one name per input, press " "ENTER to add a new input." -msgstr "Alias(e) für diese Relaydomain. Geben Sie jeweils nur einen pro Eingabefeld an. Bestätigen Sie mit ENTER, um ein weiteres Eingabefeld zu erhalten." +msgstr "" +"Alias(e) für diese Relaydomain. Geben Sie jeweils nur einen pro Eingabefeld " +"an. Bestätigen Sie mit ENTER, um ein weiteres Eingabefeld zu erhalten." #: extensions/postfix_relay_domains/forms.py:51 #: extensions/postfix_relay_domains/general_callbacks.py:93 @@ -1993,17 +2199,25 @@ msgstr "Maximale Anzahl Relaydomain-Aliase, die dieser Anwender erstellen darf" #: extensions/postfix_relay_domains/general_callbacks.py:111 msgid "" "\n" -"
  • relaydomain; name; target host; service; enabled; verify recipients
  • \n" +"
  • relaydomain; name; target host; service; enabled; verify recipients
  • \n" +"
  • relaydomainalias; name; target; enabled
  • \n" +msgstr "" +"\n" +"
  • relaydomain; name; target host; service; enabled; verify recipients
  • \n" "
  • relaydomainalias; name; target; enabled
  • \n" -msgstr "\n
  • relaydomain; name; target host; service; enabled; verify recipients
  • \n
  • relaydomainalias; name; target; enabled
  • \n" #: extensions/postfix_relay_domains/limits_callbacks.py:19 msgid "Maximum number of allowed relay domains for a new administrator" -msgstr "Maximale Anzahl Relaydomains, die ein neuer Administrator erstellen darf" +msgstr "" +"Maximale Anzahl Relaydomains, die ein neuer Administrator erstellen darf" #: extensions/postfix_relay_domains/limits_callbacks.py:27 msgid "Maximum number of allowed relay domain aliases for a new administrator" -msgstr "Maximale Anzahl Relaydomain-Aliase, die ein neuer Administrator erstellen darf" +msgstr "" +"Maximale Anzahl Relaydomain-Aliase, die ein neuer Administrator erstellen " +"darf" #: extensions/postfix_relay_domains/models.py:59 msgid "The service name" @@ -2144,7 +2358,7 @@ msgstr "Sender" msgid "Recipient" msgstr "Empfänger" -#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:83 +#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:84 msgid "Cc" msgstr "Cc" @@ -2174,7 +2388,9 @@ msgstr "Falscher Filtername" #: extensions/sievefilters/lib.py:40 msgid "Connection to MANAGESIEVE server failed, check your configuration" -msgstr "Verbindung zu MANAGESIEVE-Server fehlgeschlagen. Überprüfen Sie Ihre Konfiguration." +msgstr "" +"Verbindung zu MANAGESIEVE-Server fehlgeschlagen. Überprüfen Sie Ihre " +"Konfiguration." #: extensions/sievefilters/lib.py:85 msgid "Not enough space on server" @@ -2253,7 +2469,9 @@ msgstr "aktiv" #: extensions/sievefilters/templates/sievefilters/index.html:94 msgid "" "No filters set defined yet. You must create one in order to define filters." -msgstr "Nich keine Filter-Sätze definiert. Sie müssen einen erstellen, damit sie Filter erstellen können." +msgstr "" +"Nich keine Filter-Sätze definiert. Sie müssen einen erstellen, damit sie " +"Filter erstellen können." #: extensions/sievefilters/templatetags/sfilters_tags.py:15 msgid "New filters set" @@ -2397,19 +2615,19 @@ msgstr "Unbekanntes graphisches Set" msgid "Bad custom period" msgstr "Ungültiger individueller Zeitraum" -#: extensions/stats/templates/stats/index.html:33 +#: extensions/stats/templates/stats/index.html:28 msgid "Search a domain" msgstr "Domain suchen" -#: extensions/stats/templates/stats/index.html:37 +#: extensions/stats/templates/stats/index.html:32 msgid "Predefined time ranges" msgstr "Vordefinierte Zeiträume" -#: extensions/stats/templates/stats/index.html:44 +#: extensions/stats/templates/stats/index.html:39 msgid "Custom time range" msgstr "Individueller Zeitraum" -#: extensions/stats/templates/stats/index.html:57 +#: extensions/stats/templates/stats/index.html:52 msgid "Apply" msgstr "Antworten" @@ -2491,7 +2709,9 @@ msgstr "Aktiviere/Deaktiviere Darstellung von HTML-Links" #: extensions/webmail/app_settings.py:92 msgid "Sets the maximum number of messages displayed in a page" -msgstr "Legt die maximale Anzahl von Nachrichten fest, die in einer Seite dargestellt werden" +msgstr "" +"Legt die maximale Anzahl von Nachrichten fest, die in einer Seite " +"dargestellt werden" #: extensions/webmail/app_settings.py:97 msgid "Listing refresh rate" @@ -2565,7 +2785,7 @@ msgstr "Server-Antwort" msgid "Unknown action" msgstr "Unbekannte Aktion" -#: extensions/webmail/forms.py:84 +#: extensions/webmail/forms.py:85 msgid "Cci" msgstr "Cci" @@ -2772,15 +2992,15 @@ msgstr "Nein" msgid "Failed to update password: %s" msgstr "Konnte Kennwort nicht aktualisieren: %s" -#: lib/permissions.py:20 +#: lib/permissions.py:19 msgid "Simple user" msgstr "Normaler Anwender" -#: lib/permissions.py:22 +#: lib/permissions.py:21 msgid "Super administrator" msgstr "Super-Administrator" -#: lib/permissions.py:28 +#: lib/permissions.py:27 msgid "Domain administrator" msgstr "Domänen-Administrator" diff --git a/modoboa/locale/en/LC_MESSAGES/django.po b/modoboa/locale/en/LC_MESSAGES/django.po index 45c36bb2c..5a0799efe 100644 --- a/modoboa/locale/en/LC_MESSAGES/django.po +++ b/modoboa/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:29+0200\n" +"POT-Creation-Date: 2014-10-29 13:25+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,8 +18,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: core/__init__.py:52 core/__init__.py:53 -#: extensions/admin/forms/account.py:326 extensions/admin/forms/domain.py:256 -#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:129 +#: extensions/admin/forms/account.py:327 extensions/admin/forms/domain.py:248 +#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:133 #: extensions/postfix_autoreply/app_settings.py:11 #: extensions/postfix_relay_domains/forms.py:138 #: extensions/sievefilters/app_settings.py:50 @@ -271,8 +271,8 @@ msgstr "" msgid "This field is required" msgstr "" -#: core/app_settings.py:349 extensions/amavis/app_settings.py:87 -#: extensions/amavis/templates/amavis/main_action_bar.html:29 +#: core/app_settings.py:349 extensions/amavis/app_settings.py:149 +#: extensions/amavis/templates/amavis/main_action_bar.html:40 #: extensions/webmail/app_settings.py:73 msgid "Display" msgstr "" @@ -326,36 +326,36 @@ msgstr "" msgid "You can't delete your own account" msgstr "" -#: core/models.py:117 +#: core/models.py:130 msgid "Failed to update password: LDAP module not installed" msgstr "" -#: core/models.py:170 +#: core/models.py:183 msgid "account" msgstr "" -#: core/models.py:321 extensions/admin/models/domain.py:144 +#: core/models.py:334 extensions/admin/models/domain.py:144 #: extensions/admin/models/domain_alias.py:39 #: extensions/postfix_relay_domains/models.py:134 #: extensions/postfix_relay_domains/models.py:190 msgid "Invalid line" msgstr "" -#: core/models.py:325 +#: core/models.py:338 msgid "You can't import an account with a role greater than yours" msgstr "" -#: core/models.py:337 +#: core/models.py:350 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "" -#: core/models.py:341 +#: core/models.py:354 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "" -#: core/models.py:410 extensions/admin/models/alias.py:35 +#: core/models.py:423 extensions/admin/models/alias.py:35 #: extensions/admin/models/domain.py:32 #: extensions/admin/models/domain_alias.py:17 #: extensions/postfix_autoreply/models.py:28 @@ -364,29 +364,29 @@ msgstr "" msgid "enabled" msgstr "" -#: core/models.py:411 +#: core/models.py:424 msgid "Check to enable this extension" msgstr "" -#: core/models.py:491 +#: core/models.py:504 msgid "added" msgstr "" -#: core/models.py:494 +#: core/models.py:507 msgid "modified" msgstr "" -#: core/models.py:496 core/models.py:521 +#: core/models.py:509 core/models.py:534 #, python-format msgid "%(object)s '%(name)s' %(action)s by user %(user)s" msgstr "" -#: core/models.py:523 +#: core/models.py:536 msgid "deleted" msgstr "" #: core/tables.py:8 core/templates/core/information.html:8 -#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:187 +#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:179 #: extensions/admin/templates/admin/domains_table.html:5 #: extensions/admin/templates/admin/editdomainform.html:13 #: extensions/admin/templates/admin/identities_table.html:5 @@ -502,7 +502,7 @@ msgstr "" #: core/templates/core/user_profile.html:8 #: extensions/admin/templates/admin/forward.html:8 #: extensions/admin/views/alias.py:112 extensions/admin/views/domain.py:168 -#: extensions/admin/views/identity.py:200 +#: extensions/admin/views/identity.py:204 #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9 #: extensions/postfix_relay_domains/views.py:66 #: extensions/sievefilters/views.py:166 extensions/webmail/views.py:172 @@ -615,7 +615,7 @@ msgstr "" msgid "Account import failed (%s): domain does not exist" msgstr "" -#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:196 +#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:197 #, python-format msgid "Mailbox %s already exists" msgstr "" @@ -625,6 +625,12 @@ msgstr "" msgid "Account import failed (%s): wrong quota value" msgstr "" +#: extensions/admin/__init__.py:212 extensions/admin/forms/domain.py:75 +#: extensions/postfix_relay_domains/forms.py:50 +#: extensions/postfix_relay_domains/forms.py:70 +msgid "domain alias" +msgstr "" + #: extensions/admin/app_settings.py:13 #: extensions/admin/templates/admin/editdomainform.html:25 #: extensions/limits/app_settings.py:31 extensions/limits/models.py:23 @@ -670,7 +676,7 @@ msgid "When a mailbox is removed, also remove the associated account" msgstr "" #: extensions/admin/app_settings.py:81 extensions/admin/forms/account.py:178 -#: extensions/admin/forms/domain.py:56 +#: extensions/admin/forms/domain.py:57 msgid "Must be a positive integer" msgstr "" @@ -716,7 +722,7 @@ msgstr "" msgid "E-mail" msgstr "" -#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:17 +#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:18 msgid "Quota" msgstr "" @@ -727,7 +733,7 @@ msgid "" "administrators)." msgstr "" -#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:26 +#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:27 #: extensions/admin/templates/admin/domains_table.html:6 #: extensions/postfix_relay_domains/forms.py:12 msgid "Alias(es)" @@ -740,25 +746,25 @@ msgid "" "*@domain.tld)." msgstr "" -#: extensions/admin/forms/account.py:187 extensions/admin/forms/account.py:217 +#: extensions/admin/forms/account.py:188 extensions/admin/forms/account.py:218 #: extensions/admin/forms/alias.py:65 msgid "Domain does not exist" msgstr "" -#: extensions/admin/forms/account.py:284 +#: extensions/admin/forms/account.py:285 msgid "Domain(s)" msgstr "" -#: extensions/admin/forms/account.py:286 +#: extensions/admin/forms/account.py:287 msgid "Domain(s) that user administrates" msgstr "" -#: extensions/admin/forms/account.py:328 -#: extensions/admin/views/identity.py:132 +#: extensions/admin/forms/account.py:329 +#: extensions/admin/views/identity.py:136 msgid "Mail" msgstr "" -#: extensions/admin/forms/account.py:330 +#: extensions/admin/forms/account.py:331 msgid "Permissions" msgstr "" @@ -804,64 +810,58 @@ msgstr "" msgid "No recipient defined" msgstr "" -#: extensions/admin/forms/domain.py:20 +#: extensions/admin/forms/domain.py:21 msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." msgstr "" -#: extensions/admin/forms/domain.py:29 +#: extensions/admin/forms/domain.py:30 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." msgstr "" -#: extensions/admin/forms/domain.py:75 -#: extensions/postfix_relay_domains/forms.py:50 -#: extensions/postfix_relay_domains/forms.py:70 -msgid "domain alias" -msgstr "" - -#: extensions/admin/forms/domain.py:82 extensions/admin/forms/domain.py:98 +#: extensions/admin/forms/domain.py:78 extensions/admin/forms/domain.py:92 #: extensions/postfix_relay_domains/forms.py:58 #: extensions/postfix_relay_domains/forms.py:78 #, python-format msgid "A %s with this name already exists" msgstr "" -#: extensions/admin/forms/domain.py:92 +#: extensions/admin/forms/domain.py:89 #: extensions/postfix_relay_domains/forms.py:49 #: extensions/postfix_relay_domains/forms.py:71 msgid "domain" msgstr "" -#: extensions/admin/forms/domain.py:181 +#: extensions/admin/forms/domain.py:173 msgid "Create a domain administrator" msgstr "" -#: extensions/admin/forms/domain.py:183 +#: extensions/admin/forms/domain.py:175 msgid "Automatically create an administrator for this domain" msgstr "" -#: extensions/admin/forms/domain.py:190 +#: extensions/admin/forms/domain.py:182 msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." msgstr "" -#: extensions/admin/forms/domain.py:198 +#: extensions/admin/forms/domain.py:190 msgid "Create aliases" msgstr "" -#: extensions/admin/forms/domain.py:200 +#: extensions/admin/forms/domain.py:192 msgid "Automatically create standard aliases for this domain" msgstr "" -#: extensions/admin/forms/domain.py:216 +#: extensions/admin/forms/domain.py:208 msgid "Invalid format" msgstr "" -#: extensions/admin/forms/domain.py:230 +#: extensions/admin/forms/domain.py:222 #, python-format msgid "User '%s' already exists" msgstr "" @@ -896,7 +896,7 @@ msgid "" "administrator to create an alias instead." msgstr "" -#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:198 +#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:200 msgid "Select a file" msgstr "" @@ -916,7 +916,7 @@ msgstr "" msgid "Check this option if passwords contained in your file are not crypted" msgstr "" -#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:62 +#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:74 msgid "address" msgstr "" @@ -1012,21 +1012,21 @@ msgstr "" msgid "Unknown domain %s" msgstr "" -#: extensions/admin/models/mailbox.py:63 +#: extensions/admin/models/mailbox.py:75 msgid "Mailbox address (without the @domain.tld part)" msgstr "" -#: extensions/admin/models/mailbox.py:125 +#: extensions/admin/models/mailbox.py:136 #, python-format msgid "Failed to retrieve mailbox location (%s)" msgstr "" -#: extensions/admin/models/mailbox.py:194 +#: extensions/admin/models/mailbox.py:221 #, python-format msgid "Quota is greater than the allowed domain's limit (%dM)" msgstr "" -#: extensions/admin/models/mailbox.py:199 +#: extensions/admin/models/mailbox.py:227 msgid "A quota is required" msgstr "" @@ -1098,7 +1098,7 @@ msgid "Importing..." msgstr "" #: extensions/admin/templates/admin/listing.html:14 -#: extensions/stats/templates/stats/index.html:28 +#: extensions/stats/templates/stats/index.html:23 msgid "Filter" msgstr "" @@ -1200,8 +1200,8 @@ msgid "Alias with this name already exists" msgstr "" #: extensions/admin/views/alias.py:50 extensions/admin/views/domain.py:102 -#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:133 -#: extensions/admin/views/identity.py:160 +#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:137 +#: extensions/admin/views/identity.py:164 #: extensions/postfix_relay_domains/views.py:34 #: extensions/sievefilters/views.py:144 extensions/sievefilters/views.py:233 #: extensions/webmail/views.py:153 @@ -1244,7 +1244,7 @@ msgstr "" msgid "Alias modified" msgstr "" -#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:130 +#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:134 msgid "Next" msgstr "" @@ -1252,7 +1252,7 @@ msgstr "" msgid "Options" msgstr "" -#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:134 +#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:138 msgid "Previous" msgstr "" @@ -1286,11 +1286,11 @@ msgstr "" msgid "Export domains" msgstr "" -#: extensions/admin/views/identity.py:104 -#: extensions/admin/views/identity.py:227 -#: extensions/admin/views/identity.py:232 extensions/amavis/views.py:144 -#: extensions/amavis/views.py:148 extensions/amavis/views.py:181 -#: extensions/amavis/views.py:186 extensions/amavis/views.py:188 +#: extensions/admin/views/identity.py:108 +#: extensions/admin/views/identity.py:231 +#: extensions/admin/views/identity.py:236 extensions/amavis/views.py:147 +#: extensions/amavis/views.py:151 extensions/amavis/views.py:184 +#: extensions/amavis/views.py:189 extensions/amavis/views.py:191 #: extensions/webmail/views.py:49 extensions/webmail/views.py:67 #: extensions/webmail/views.py:81 extensions/webmail/views.py:99 #: extensions/webmail/views.py:116 extensions/webmail/views.py:202 @@ -1301,19 +1301,19 @@ msgstr "" msgid "Invalid request" msgstr "" -#: extensions/admin/views/identity.py:151 +#: extensions/admin/views/identity.py:155 msgid "Account created" msgstr "" -#: extensions/admin/views/identity.py:157 +#: extensions/admin/views/identity.py:161 msgid "New account" msgstr "" -#: extensions/admin/views/identity.py:193 +#: extensions/admin/views/identity.py:197 msgid "Account updated" msgstr "" -#: extensions/admin/views/identity.py:217 +#: extensions/admin/views/identity.py:221 msgid "Account deleted" msgid_plural "Accounts deleted" msgstr[0] "" @@ -1375,7 +1375,7 @@ msgstr "" msgid "Simple amavis management frontend" msgstr "" -#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:18 +#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:20 msgid "Quarantine" msgstr "" @@ -1467,27 +1467,92 @@ msgstr "" msgid "The e-mail address used to send notitications" msgstr "" -#: extensions/amavis/app_settings.py:91 extensions/webmail/app_settings.py:91 +#: extensions/amavis/app_settings.py:77 +#: extensions/amavis/templates/amavis/main_action_bar.html:27 +msgid "Manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:80 +msgid "Enable manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:83 +msgid "Allow super administrators to manually train Spamassassin" +msgstr "" + +#: extensions/amavis/app_settings.py:88 +msgid "Is Spamassassin local?" +msgstr "" + +#: extensions/amavis/app_settings.py:91 +msgid "Tell if Spamassassin is running on the same server than modoboa" +msgstr "" + +#: extensions/amavis/app_settings.py:96 +msgid "Default user" +msgstr "" + +#: extensions/amavis/app_settings.py:99 +msgid "Name of the user owning the default bayesian database" +msgstr "" + +#: extensions/amavis/app_settings.py:104 +msgid "Spamd address" +msgstr "" + +#: extensions/amavis/app_settings.py:106 +msgid "The IP address where spamd can be reached" +msgstr "" + +#: extensions/amavis/app_settings.py:110 +msgid "Spamd port" +msgstr "" + +#: extensions/amavis/app_settings.py:112 +msgid "The TCP port spamd is listening on" +msgstr "" + +#: extensions/amavis/app_settings.py:116 +msgid "Enable per-domain manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:119 +msgid "" +"Allow domain administrators to train Spamassassin (within dedicated per-" +"domain databases)" +msgstr "" + +#: extensions/amavis/app_settings.py:125 +msgid "Enable per-user manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:128 +msgid "" +"Allow simple users to personally train Spamassassin (within a dedicated " +"database)" +msgstr "" + +#: extensions/amavis/app_settings.py:153 extensions/webmail/app_settings.py:91 msgid "Number of displayed emails per page" msgstr "" -#: extensions/amavis/app_settings.py:92 +#: extensions/amavis/app_settings.py:154 msgid "Set the maximum number of messages displayed in a page" msgstr "" -#: extensions/amavis/general_callbacks.py:82 +#: extensions/amavis/general_callbacks.py:136 msgid "pending requests" msgstr "" -#: extensions/amavis/general_callbacks.py:125 +#: extensions/amavis/general_callbacks.py:179 msgid "Pending requests" msgstr "" -#: extensions/amavis/general_callbacks.py:135 +#: extensions/amavis/general_callbacks.py:189 msgid "Content filter" msgstr "" -#: extensions/amavis/lib.py:56 +#: extensions/amavis/lib.py:60 #, python-format msgid "Connection to amavis failed: %s" msgstr "" @@ -1547,8 +1612,8 @@ msgid "Score" msgstr "" #: extensions/amavis/sql_listing.py:33 -#: extensions/amavis/templatetags/amavis_tags.py:75 -#: extensions/webmail/forms.py:82 +#: extensions/amavis/templatetags/amavis_tags.py:100 +#: extensions/webmail/forms.py:83 msgid "To" msgstr "" @@ -1559,49 +1624,56 @@ msgid "From" msgstr "" #: extensions/amavis/sql_listing.py:40 extensions/sievefilters/forms.py:77 -#: extensions/webmail/forms.py:86 extensions/webmail/lib/imapemail.py:288 +#: extensions/webmail/forms.py:87 extensions/webmail/lib/imapemail.py:288 #: extensions/webmail/lib/listing.py:27 extensions/webmail/lib/tables.py:26 #: templates/common/email_searchbar.html:6 msgid "Subject" msgstr "" -#: extensions/amavis/views.py:27 +#: extensions/amavis/views.py:30 msgid "Empty quarantine" msgstr "" -#: extensions/amavis/views.py:149 +#: extensions/amavis/views.py:152 msgid "Message deleted" msgstr "" -#: extensions/amavis/views.py:168 +#: extensions/amavis/views.py:171 #, python-format msgid "%(count)d message deleted successfully" msgid_plural "%(count)d messages deleted successfully" msgstr[0] "" msgstr[1] "" -#: extensions/amavis/views.py:191 +#: extensions/amavis/views.py:194 msgid "Request sent" msgstr "" -#: extensions/amavis/views.py:197 +#: extensions/amavis/views.py:200 msgid "Message released" msgstr "" -#: extensions/amavis/views.py:225 +#: extensions/amavis/views.py:228 #, python-format msgid "%(count)d request sent" msgid_plural "%(count)d requests sent" msgstr[0] "" msgstr[1] "" -#: extensions/amavis/views.py:246 +#: extensions/amavis/views.py:249 #, python-format msgid "%(count)d message released successfully" msgid_plural "%(count)d messages released successfully" msgstr[0] "" msgstr[1] "" +#: extensions/amavis/views.py:282 +#, python-format +msgid "%(count)d message processed successfully" +msgid_plural "%(count)d messages processed successfully" +msgstr[0] "" +msgstr[1] "" + #: extensions/amavis/management/commands/amnotify.py:61 msgid "[modoboa] Pending release requests" msgstr "" @@ -1647,44 +1719,54 @@ msgid "Banned" msgstr "" #: extensions/amavis/templates/amavis/main_action_bar.html:18 -#: extensions/amavis/templatetags/amavis_tags.py:19 -#: extensions/amavis/templatetags/amavis_tags.py:54 +#: extensions/amavis/templatetags/amavis_tags.py:24 +#: extensions/amavis/templatetags/amavis_tags.py:79 msgid "Release" msgstr "" #: extensions/amavis/templates/amavis/main_action_bar.html:23 -#: extensions/amavis/templatetags/amavis_tags.py:25 -#: extensions/amavis/templatetags/amavis_tags.py:61 +#: extensions/amavis/templatetags/amavis_tags.py:30 +#: extensions/amavis/templatetags/amavis_tags.py:86 #: extensions/webmail/templatetags/webmail_tags.py:32 msgid "Delete" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templatetags/amavis_tags.py:44 +msgid "Mark as spam" +msgstr "" + +#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templatetags/amavis_tags.py:49 +msgid "Mark as non-spam" +msgstr "" + +#: extensions/amavis/templates/amavis/main_action_bar.html:42 #: extensions/sievefilters/forms.py:64 msgid "All messages" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:42 msgid "All" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templates/amavis/main_action_bar.html:43 msgid "Spam only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templates/amavis/main_action_bar.html:44 msgid "Virus only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:34 +#: extensions/amavis/templates/amavis/main_action_bar.html:45 msgid "Bad Header only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:35 +#: extensions/amavis/templates/amavis/main_action_bar.html:46 msgid "Bad MIME only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:36 +#: extensions/amavis/templates/amavis/main_action_bar.html:47 msgid "Banned only" msgstr "" @@ -1728,7 +1810,7 @@ msgstr "" msgid "Please visit %(listingurl)s for a full listing." msgstr "" -#: extensions/amavis/templatetags/amavis_tags.py:28 +#: extensions/amavis/templatetags/amavis_tags.py:35 msgid "View full headers" msgstr "" @@ -2147,7 +2229,7 @@ msgstr "" msgid "Recipient" msgstr "" -#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:83 +#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:84 msgid "Cc" msgstr "" @@ -2400,19 +2482,19 @@ msgstr "" msgid "Bad custom period" msgstr "" -#: extensions/stats/templates/stats/index.html:33 +#: extensions/stats/templates/stats/index.html:28 msgid "Search a domain" msgstr "" -#: extensions/stats/templates/stats/index.html:37 +#: extensions/stats/templates/stats/index.html:32 msgid "Predefined time ranges" msgstr "" -#: extensions/stats/templates/stats/index.html:44 +#: extensions/stats/templates/stats/index.html:39 msgid "Custom time range" msgstr "" -#: extensions/stats/templates/stats/index.html:57 +#: extensions/stats/templates/stats/index.html:52 msgid "Apply" msgstr "" @@ -2568,7 +2650,7 @@ msgstr "" msgid "Unknown action" msgstr "" -#: extensions/webmail/forms.py:84 +#: extensions/webmail/forms.py:85 msgid "Cci" msgstr "" @@ -2775,15 +2857,15 @@ msgstr "" msgid "Failed to update password: %s" msgstr "" -#: lib/permissions.py:20 +#: lib/permissions.py:19 msgid "Simple user" msgstr "" -#: lib/permissions.py:22 +#: lib/permissions.py:21 msgid "Super administrator" msgstr "" -#: lib/permissions.py:28 +#: lib/permissions.py:27 msgid "Domain administrator" msgstr "" diff --git a/modoboa/locale/es/LC_MESSAGES/django.po b/modoboa/locale/es/LC_MESSAGES/django.po index 901019d58..2de1039cc 100644 --- a/modoboa/locale/es/LC_MESSAGES/django.po +++ b/modoboa/locale/es/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:29+0200\n" +"POT-Creation-Date: 2014-10-29 13:25+0100\n" "PO-Revision-Date: 2013-10-01 09:56+0000\n" "Last-Translator: Pedro Gracia \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/modoboa/language/" @@ -21,8 +21,8 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: core/__init__.py:52 core/__init__.py:53 -#: extensions/admin/forms/account.py:326 extensions/admin/forms/domain.py:256 -#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:129 +#: extensions/admin/forms/account.py:327 extensions/admin/forms/domain.py:248 +#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:133 #: extensions/postfix_autoreply/app_settings.py:11 #: extensions/postfix_relay_domains/forms.py:138 #: extensions/sievefilters/app_settings.py:50 @@ -289,8 +289,8 @@ msgstr "Petición inválida" msgid "This field is required" msgstr "Este campo es obligatorio" -#: core/app_settings.py:349 extensions/amavis/app_settings.py:87 -#: extensions/amavis/templates/amavis/main_action_bar.html:29 +#: core/app_settings.py:349 extensions/amavis/app_settings.py:149 +#: extensions/amavis/templates/amavis/main_action_bar.html:40 #: extensions/webmail/app_settings.py:73 msgid "Display" msgstr "Mostrar" @@ -346,37 +346,37 @@ msgstr "Última entrada" msgid "You can't delete your own account" msgstr "No puede eliminar su propia cuenta" -#: core/models.py:117 +#: core/models.py:130 msgid "Failed to update password: LDAP module not installed" msgstr "Falló al actualizar la contraseña: módulo LDAP no instalado" -#: core/models.py:170 +#: core/models.py:183 msgid "account" msgstr "cuenta" -#: core/models.py:321 extensions/admin/models/domain.py:144 +#: core/models.py:334 extensions/admin/models/domain.py:144 #: extensions/admin/models/domain_alias.py:39 #: extensions/postfix_relay_domains/models.py:134 #: extensions/postfix_relay_domains/models.py:190 msgid "Invalid line" msgstr "Línea inválida" -#: core/models.py:325 +#: core/models.py:338 msgid "You can't import an account with a role greater than yours" msgstr "No puede importar una cuenta con un rol mayor que el suyo" -#: core/models.py:337 +#: core/models.py:350 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "El usuario normal '%s' debe tener una dirección de email válida" -#: core/models.py:341 +#: core/models.py:354 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "" "Los campos de nombre de usuario y de email no deben ser diferentes para '%s'" -#: core/models.py:410 extensions/admin/models/alias.py:35 +#: core/models.py:423 extensions/admin/models/alias.py:35 #: extensions/admin/models/domain.py:32 #: extensions/admin/models/domain_alias.py:17 #: extensions/postfix_autoreply/models.py:28 @@ -385,29 +385,29 @@ msgstr "" msgid "enabled" msgstr "activado" -#: core/models.py:411 +#: core/models.py:424 msgid "Check to enable this extension" msgstr "Marcar para activar esta extensión" -#: core/models.py:491 +#: core/models.py:504 msgid "added" msgstr "añadido" -#: core/models.py:494 +#: core/models.py:507 msgid "modified" msgstr "modificado" -#: core/models.py:496 core/models.py:521 +#: core/models.py:509 core/models.py:534 #, python-format msgid "%(object)s '%(name)s' %(action)s by user %(user)s" msgstr "%(object)s '%(name)s' %(action)s por el usuario %(user)s" -#: core/models.py:523 +#: core/models.py:536 msgid "deleted" msgstr "eliminado" #: core/tables.py:8 core/templates/core/information.html:8 -#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:187 +#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:179 #: extensions/admin/templates/admin/domains_table.html:5 #: extensions/admin/templates/admin/editdomainform.html:13 #: extensions/admin/templates/admin/identities_table.html:5 @@ -523,7 +523,7 @@ msgstr "Actualizar su información personal" #: core/templates/core/user_profile.html:8 #: extensions/admin/templates/admin/forward.html:8 #: extensions/admin/views/alias.py:112 extensions/admin/views/domain.py:168 -#: extensions/admin/views/identity.py:200 +#: extensions/admin/views/identity.py:204 #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9 #: extensions/postfix_relay_domains/views.py:66 #: extensions/sievefilters/views.py:166 extensions/webmail/views.py:172 @@ -654,7 +654,7 @@ msgstr "Siguiente" msgid "Account import failed (%s): domain does not exist" msgstr "Falló la importación de la cuenta (%s): el dominio no existe" -#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:196 +#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:197 #, python-format msgid "Mailbox %s already exists" msgstr "El mailbox %s ya existe" @@ -664,6 +664,13 @@ msgstr "El mailbox %s ya existe" msgid "Account import failed (%s): wrong quota value" msgstr "Falló la importación de la cuenta (%s): el dominio no existe" +#: extensions/admin/__init__.py:212 extensions/admin/forms/domain.py:75 +#: extensions/postfix_relay_domains/forms.py:50 +#: extensions/postfix_relay_domains/forms.py:70 +#, fuzzy +msgid "domain alias" +msgstr "Alias del dominio" + #: extensions/admin/app_settings.py:13 #: extensions/admin/templates/admin/editdomainform.html:25 #: extensions/limits/app_settings.py:31 extensions/limits/models.py:23 @@ -712,7 +719,7 @@ msgid "When a mailbox is removed, also remove the associated account" msgstr "Cuando un mailbox es eliminado, también lo es su cuenta asociada." #: extensions/admin/app_settings.py:81 extensions/admin/forms/account.py:178 -#: extensions/admin/forms/domain.py:56 +#: extensions/admin/forms/domain.py:57 msgid "Must be a positive integer" msgstr "" @@ -760,7 +767,7 @@ msgstr "No puede deshabilitar su propia cuenta" msgid "E-mail" msgstr "Email" -#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:17 +#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:18 msgid "Quota" msgstr "Cuota" @@ -774,7 +781,7 @@ msgstr "" "dominio por defecto. Déjelo vacío para definir un valor ilimitado (no " "permitido para los administradores del dominio)" -#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:26 +#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:27 #: extensions/admin/templates/admin/domains_table.html:6 #: extensions/postfix_relay_domains/forms.py:12 msgid "Alias(es)" @@ -790,25 +797,25 @@ msgstr "" "ENTER para añadir una nueva entrada. Use el carácter '*' para crear una " "dirección 'catchall' (recogerlos todos, ej. *@domain.tld)" -#: extensions/admin/forms/account.py:187 extensions/admin/forms/account.py:217 +#: extensions/admin/forms/account.py:188 extensions/admin/forms/account.py:218 #: extensions/admin/forms/alias.py:65 msgid "Domain does not exist" msgstr "El dominio no existe" -#: extensions/admin/forms/account.py:284 +#: extensions/admin/forms/account.py:285 msgid "Domain(s)" msgstr "Dominio(s)" -#: extensions/admin/forms/account.py:286 +#: extensions/admin/forms/account.py:287 msgid "Domain(s) that user administrates" msgstr "Dominio(s) que el usuario administra" -#: extensions/admin/forms/account.py:328 -#: extensions/admin/views/identity.py:132 +#: extensions/admin/forms/account.py:329 +#: extensions/admin/views/identity.py:136 msgid "Mail" msgstr "Correo" -#: extensions/admin/forms/account.py:330 +#: extensions/admin/forms/account.py:331 msgid "Permissions" msgstr "Permisos" @@ -858,14 +865,14 @@ msgstr "EL destinatario %s ya existe" msgid "No recipient defined" msgstr "No ha puesto destinatario" -#: extensions/admin/forms/domain.py:20 +#: extensions/admin/forms/domain.py:21 #, fuzzy msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." msgstr "Cuota por defecto en MB que se aplicará a los mailboxes" -#: extensions/admin/forms/domain.py:29 +#: extensions/admin/forms/domain.py:30 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." @@ -873,36 +880,29 @@ msgstr "" "Alia(s) de este dominio. Indique únicamente un nombre por entrada, presione " "ENTER para añadir una nueva entrada." -#: extensions/admin/forms/domain.py:75 -#: extensions/postfix_relay_domains/forms.py:50 -#: extensions/postfix_relay_domains/forms.py:70 -#, fuzzy -msgid "domain alias" -msgstr "Alias del dominio" - -#: extensions/admin/forms/domain.py:82 extensions/admin/forms/domain.py:98 +#: extensions/admin/forms/domain.py:78 extensions/admin/forms/domain.py:92 #: extensions/postfix_relay_domains/forms.py:58 #: extensions/postfix_relay_domains/forms.py:78 #, fuzzy, python-format msgid "A %s with this name already exists" msgstr "Ya existe un alias con este nombre" -#: extensions/admin/forms/domain.py:92 +#: extensions/admin/forms/domain.py:89 #: extensions/postfix_relay_domains/forms.py:49 #: extensions/postfix_relay_domains/forms.py:71 #, fuzzy msgid "domain" msgstr "Dominios" -#: extensions/admin/forms/domain.py:181 +#: extensions/admin/forms/domain.py:173 msgid "Create a domain administrator" msgstr "Crear un administrador del dominio" -#: extensions/admin/forms/domain.py:183 +#: extensions/admin/forms/domain.py:175 msgid "Automatically create an administrator for this domain" msgstr "Automáticamente crear una administrador para este dominio" -#: extensions/admin/forms/domain.py:190 +#: extensions/admin/forms/domain.py:182 msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." @@ -910,19 +910,19 @@ msgstr "" "El nombre del administrador. No incluya el nombre del dominio aquí, será " "añadido automáticamente." -#: extensions/admin/forms/domain.py:198 +#: extensions/admin/forms/domain.py:190 msgid "Create aliases" msgstr "Crear alias" -#: extensions/admin/forms/domain.py:200 +#: extensions/admin/forms/domain.py:192 msgid "Automatically create standard aliases for this domain" msgstr "Automáticamente crear alias estándar para este dominio" -#: extensions/admin/forms/domain.py:216 +#: extensions/admin/forms/domain.py:208 msgid "Invalid format" msgstr "Formato inválido" -#: extensions/admin/forms/domain.py:230 +#: extensions/admin/forms/domain.py:222 #, python-format msgid "User '%s' already exists" msgstr "El usuario '%s' ya existe" @@ -959,7 +959,7 @@ msgstr "" "No puede definir un reenvío a un destino local. Por favor, pregunte a su " "administrador para crear un alias en su lugar." -#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:198 +#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:200 msgid "Select a file" msgstr "Seleccione un fichero" @@ -981,7 +981,7 @@ msgstr "" "Marque esta opción si las contraseñas que contiene su fichero no están " "cifradas" -#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:62 +#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:74 msgid "address" msgstr "dirección" @@ -1080,21 +1080,21 @@ msgstr "El dominio al que este alias apunta" msgid "Unknown domain %s" msgstr "Dominio desconocido %s" -#: extensions/admin/models/mailbox.py:63 +#: extensions/admin/models/mailbox.py:75 msgid "Mailbox address (without the @domain.tld part)" msgstr "Dirección del mailbox (sin la parte @dominio.tld)" -#: extensions/admin/models/mailbox.py:125 +#: extensions/admin/models/mailbox.py:136 #, python-format msgid "Failed to retrieve mailbox location (%s)" msgstr "Fallo al recuperar la localización del mailbox (%s)" -#: extensions/admin/models/mailbox.py:194 +#: extensions/admin/models/mailbox.py:221 #, python-format msgid "Quota is greater than the allowed domain's limit (%dM)" msgstr "La cuota es mayor que el límite permitido para el dominio (%dM)" -#: extensions/admin/models/mailbox.py:199 +#: extensions/admin/models/mailbox.py:227 msgid "A quota is required" msgstr "Una cuota es obligatoria" @@ -1167,7 +1167,7 @@ msgid "Importing..." msgstr "Importando..." #: extensions/admin/templates/admin/listing.html:14 -#: extensions/stats/templates/stats/index.html:28 +#: extensions/stats/templates/stats/index.html:23 msgid "Filter" msgstr "FIltro" @@ -1269,8 +1269,8 @@ msgid "Alias with this name already exists" msgstr "Ya existe un alias con este nombre" #: extensions/admin/views/alias.py:50 extensions/admin/views/domain.py:102 -#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:133 -#: extensions/admin/views/identity.py:160 +#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:137 +#: extensions/admin/views/identity.py:164 #: extensions/postfix_relay_domains/views.py:34 #: extensions/sievefilters/views.py:144 extensions/sievefilters/views.py:233 #: extensions/webmail/views.py:153 @@ -1313,7 +1313,7 @@ msgstr "Reenvío modificado" msgid "Alias modified" msgstr "Alias modificado" -#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:130 +#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:134 msgid "Next" msgstr "Siguiente" @@ -1321,7 +1321,7 @@ msgstr "Siguiente" msgid "Options" msgstr "Opciones" -#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:134 +#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:138 msgid "Previous" msgstr "Anterior" @@ -1355,11 +1355,11 @@ msgstr "Exportar identidades" msgid "Export domains" msgstr "Exportar dominios" -#: extensions/admin/views/identity.py:104 -#: extensions/admin/views/identity.py:227 -#: extensions/admin/views/identity.py:232 extensions/amavis/views.py:144 -#: extensions/amavis/views.py:148 extensions/amavis/views.py:181 -#: extensions/amavis/views.py:186 extensions/amavis/views.py:188 +#: extensions/admin/views/identity.py:108 +#: extensions/admin/views/identity.py:231 +#: extensions/admin/views/identity.py:236 extensions/amavis/views.py:147 +#: extensions/amavis/views.py:151 extensions/amavis/views.py:184 +#: extensions/amavis/views.py:189 extensions/amavis/views.py:191 #: extensions/webmail/views.py:49 extensions/webmail/views.py:67 #: extensions/webmail/views.py:81 extensions/webmail/views.py:99 #: extensions/webmail/views.py:116 extensions/webmail/views.py:202 @@ -1370,19 +1370,19 @@ msgstr "Exportar dominios" msgid "Invalid request" msgstr "Petición inválida" -#: extensions/admin/views/identity.py:151 +#: extensions/admin/views/identity.py:155 msgid "Account created" msgstr "Cuenta creada" -#: extensions/admin/views/identity.py:157 +#: extensions/admin/views/identity.py:161 msgid "New account" msgstr "Nueva cuenta" -#: extensions/admin/views/identity.py:193 +#: extensions/admin/views/identity.py:197 msgid "Account updated" msgstr "Cuenta actualizada" -#: extensions/admin/views/identity.py:217 +#: extensions/admin/views/identity.py:221 msgid "Account deleted" msgid_plural "Accounts deleted" msgstr[0] "Cuenta eliminada" @@ -1464,7 +1464,7 @@ msgstr "Reenvío actualizado" msgid "Simple amavis management frontend" msgstr "Panel de gestión sencilla para amavis" -#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:18 +#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:20 msgid "Quarantine" msgstr "Cuarentena" @@ -1560,28 +1560,96 @@ msgstr "Notificaciones al remitente" msgid "The e-mail address used to send notitications" msgstr "La dirección de correo usada para enviar notificaciones" -#: extensions/amavis/app_settings.py:91 extensions/webmail/app_settings.py:91 +#: extensions/amavis/app_settings.py:77 +#: extensions/amavis/templates/amavis/main_action_bar.html:27 +msgid "Manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:80 +msgid "Enable manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:83 +msgid "Allow super administrators to manually train Spamassassin" +msgstr "" + +#: extensions/amavis/app_settings.py:88 +msgid "Is Spamassassin local?" +msgstr "" + +#: extensions/amavis/app_settings.py:91 +msgid "Tell if Spamassassin is running on the same server than modoboa" +msgstr "" + +#: extensions/amavis/app_settings.py:96 +#, fuzzy +msgid "Default user" +msgstr "Editor por defecto" + +#: extensions/amavis/app_settings.py:99 +msgid "Name of the user owning the default bayesian database" +msgstr "" + +#: extensions/amavis/app_settings.py:104 +#, fuzzy +msgid "Spamd address" +msgstr "De la dirección" + +#: extensions/amavis/app_settings.py:106 +msgid "The IP address where spamd can be reached" +msgstr "" + +#: extensions/amavis/app_settings.py:110 +#, fuzzy +msgid "Spamd port" +msgstr "Correo basura" + +#: extensions/amavis/app_settings.py:112 +msgid "The TCP port spamd is listening on" +msgstr "" + +#: extensions/amavis/app_settings.py:116 +msgid "Enable per-domain manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:119 +msgid "" +"Allow domain administrators to train Spamassassin (within dedicated per-" +"domain databases)" +msgstr "" + +#: extensions/amavis/app_settings.py:125 +msgid "Enable per-user manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:128 +msgid "" +"Allow simple users to personally train Spamassassin (within a dedicated " +"database)" +msgstr "" + +#: extensions/amavis/app_settings.py:153 extensions/webmail/app_settings.py:91 msgid "Number of displayed emails per page" msgstr "Número de emails mostrados por página" -#: extensions/amavis/app_settings.py:92 +#: extensions/amavis/app_settings.py:154 msgid "Set the maximum number of messages displayed in a page" msgstr "Fijar el número máxima de mensajes mostrados en una página" -#: extensions/amavis/general_callbacks.py:82 +#: extensions/amavis/general_callbacks.py:136 msgid "pending requests" msgstr "Peticiones pendientes" -#: extensions/amavis/general_callbacks.py:125 +#: extensions/amavis/general_callbacks.py:179 #, fuzzy msgid "Pending requests" msgstr "Peticiones pendientes" -#: extensions/amavis/general_callbacks.py:135 +#: extensions/amavis/general_callbacks.py:189 msgid "Content filter" msgstr "Filtro de contenido" -#: extensions/amavis/lib.py:56 +#: extensions/amavis/lib.py:60 #, python-format msgid "Connection to amavis failed: %s" msgstr "La conexión con amavis falló: %s" @@ -1649,8 +1717,8 @@ msgid "Score" msgstr "" #: extensions/amavis/sql_listing.py:33 -#: extensions/amavis/templatetags/amavis_tags.py:75 -#: extensions/webmail/forms.py:82 +#: extensions/amavis/templatetags/amavis_tags.py:100 +#: extensions/webmail/forms.py:83 msgid "To" msgstr "A" @@ -1661,49 +1729,56 @@ msgid "From" msgstr "Desde" #: extensions/amavis/sql_listing.py:40 extensions/sievefilters/forms.py:77 -#: extensions/webmail/forms.py:86 extensions/webmail/lib/imapemail.py:288 +#: extensions/webmail/forms.py:87 extensions/webmail/lib/imapemail.py:288 #: extensions/webmail/lib/listing.py:27 extensions/webmail/lib/tables.py:26 #: templates/common/email_searchbar.html:6 msgid "Subject" msgstr "Tema" -#: extensions/amavis/views.py:27 +#: extensions/amavis/views.py:30 msgid "Empty quarantine" msgstr "Vaciar cuarentena" -#: extensions/amavis/views.py:149 +#: extensions/amavis/views.py:152 msgid "Message deleted" msgstr "Mensaje eliminado" -#: extensions/amavis/views.py:168 +#: extensions/amavis/views.py:171 #, python-format msgid "%(count)d message deleted successfully" msgid_plural "%(count)d messages deleted successfully" msgstr[0] "%(count)d mensaje eliminado correctamente" msgstr[1] "%(count)d mensajes eliminados correctamente" -#: extensions/amavis/views.py:191 +#: extensions/amavis/views.py:194 msgid "Request sent" msgstr "Petición enviada" -#: extensions/amavis/views.py:197 +#: extensions/amavis/views.py:200 msgid "Message released" msgstr "Mensaje publicado" -#: extensions/amavis/views.py:225 +#: extensions/amavis/views.py:228 #, python-format msgid "%(count)d request sent" msgid_plural "%(count)d requests sent" msgstr[0] "%(count)d petición enviada" msgstr[1] "%(count)d peticiones enviadas" -#: extensions/amavis/views.py:246 +#: extensions/amavis/views.py:249 #, python-format msgid "%(count)d message released successfully" msgid_plural "%(count)d messages released successfully" msgstr[0] "%(count)d mensaje publicado correctamente" msgstr[1] "%(count)d mensajes publicados correctamente" +#: extensions/amavis/views.py:282 +#, fuzzy, python-format +msgid "%(count)d message processed successfully" +msgid_plural "%(count)d messages processed successfully" +msgstr[0] "%(count)d mensaje publicado correctamente" +msgstr[1] "%(count)d mensajes publicados correctamente" + #: extensions/amavis/management/commands/amnotify.py:61 msgid "[modoboa] Pending release requests" msgstr "[modoboa] Pendiente de publicar las peticiones" @@ -1752,48 +1827,59 @@ msgid "Banned" msgstr "Filtro de expulsados" #: extensions/amavis/templates/amavis/main_action_bar.html:18 -#: extensions/amavis/templatetags/amavis_tags.py:19 -#: extensions/amavis/templatetags/amavis_tags.py:54 +#: extensions/amavis/templatetags/amavis_tags.py:24 +#: extensions/amavis/templatetags/amavis_tags.py:79 msgid "Release" msgstr "Publicar" #: extensions/amavis/templates/amavis/main_action_bar.html:23 -#: extensions/amavis/templatetags/amavis_tags.py:25 -#: extensions/amavis/templatetags/amavis_tags.py:61 +#: extensions/amavis/templatetags/amavis_tags.py:30 +#: extensions/amavis/templatetags/amavis_tags.py:86 #: extensions/webmail/templatetags/webmail_tags.py:32 msgid "Delete" msgstr "Eliminar" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templatetags/amavis_tags.py:44 +#, fuzzy +msgid "Mark as spam" +msgstr "Marcar mensajes" + +#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templatetags/amavis_tags.py:49 +msgid "Mark as non-spam" +msgstr "" + +#: extensions/amavis/templates/amavis/main_action_bar.html:42 #: extensions/sievefilters/forms.py:64 msgid "All messages" msgstr "Todos los mensajes" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:42 msgid "All" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templates/amavis/main_action_bar.html:43 #, fuzzy msgid "Spam only" msgstr "Correo basura" -#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templates/amavis/main_action_bar.html:44 #, fuzzy msgid "Virus only" msgstr "Virus" -#: extensions/amavis/templates/amavis/main_action_bar.html:34 +#: extensions/amavis/templates/amavis/main_action_bar.html:45 #, fuzzy msgid "Bad Header only" msgstr "Mala cabecera" -#: extensions/amavis/templates/amavis/main_action_bar.html:35 +#: extensions/amavis/templates/amavis/main_action_bar.html:46 #, fuzzy msgid "Bad MIME only" msgstr "Mal MIME" -#: extensions/amavis/templates/amavis/main_action_bar.html:36 +#: extensions/amavis/templates/amavis/main_action_bar.html:47 #, fuzzy msgid "Banned only" msgstr "Filtro de expulsados" @@ -1842,7 +1928,7 @@ msgstr "Actuar sobre este mensaje" msgid "Please visit %(listingurl)s for a full listing." msgstr "Por favor, visite %(listingurl)s para un listado completo." -#: extensions/amavis/templatetags/amavis_tags.py:28 +#: extensions/amavis/templatetags/amavis_tags.py:35 msgid "View full headers" msgstr "Ver todas las cabeceras" @@ -2295,7 +2381,7 @@ msgstr "Remitente" msgid "Recipient" msgstr "Destinatario" -#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:83 +#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:84 msgid "Cc" msgstr "Cc" @@ -2551,19 +2637,19 @@ msgstr "Conjunto gráfico desconocido" msgid "Bad custom period" msgstr "Período elegido erróneo" -#: extensions/stats/templates/stats/index.html:33 +#: extensions/stats/templates/stats/index.html:28 msgid "Search a domain" msgstr "Buscar un dominio" -#: extensions/stats/templates/stats/index.html:37 +#: extensions/stats/templates/stats/index.html:32 msgid "Predefined time ranges" msgstr "Rangos de tiempo predefinidos" -#: extensions/stats/templates/stats/index.html:44 +#: extensions/stats/templates/stats/index.html:39 msgid "Custom time range" msgstr "Rango de tiempo definido" -#: extensions/stats/templates/stats/index.html:57 +#: extensions/stats/templates/stats/index.html:52 msgid "Apply" msgstr "Aplicar" @@ -2720,7 +2806,7 @@ msgstr "Respuesta del servidor" msgid "Unknown action" msgstr "Acción desconocida" -#: extensions/webmail/forms.py:84 +#: extensions/webmail/forms.py:85 msgid "Cci" msgstr "Cco" @@ -2927,15 +3013,15 @@ msgstr "No " msgid "Failed to update password: %s" msgstr "Falló la actualización de la contraseña: %s" -#: lib/permissions.py:20 +#: lib/permissions.py:19 msgid "Simple user" msgstr "Usuario normal" -#: lib/permissions.py:22 +#: lib/permissions.py:21 msgid "Super administrator" msgstr "Super administrador" -#: lib/permissions.py:28 +#: lib/permissions.py:27 msgid "Domain administrator" msgstr "Administrador de dominio" diff --git a/modoboa/locale/fr/LC_MESSAGES/django.po b/modoboa/locale/fr/LC_MESSAGES/django.po index 4cb4a74b0..b79771fcd 100644 --- a/modoboa/locale/fr/LC_MESSAGES/django.po +++ b/modoboa/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: modoboa-1.1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:29+0200\n" +"POT-Creation-Date: 2014-10-29 13:25+0100\n" "PO-Revision-Date: 2011-01-07 10:00+100\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: FR \n" @@ -18,8 +18,8 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: core/__init__.py:52 core/__init__.py:53 -#: extensions/admin/forms/account.py:326 extensions/admin/forms/domain.py:256 -#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:129 +#: extensions/admin/forms/account.py:327 extensions/admin/forms/domain.py:248 +#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:133 #: extensions/postfix_autoreply/app_settings.py:11 #: extensions/postfix_relay_domains/forms.py:138 #: extensions/sievefilters/app_settings.py:50 @@ -243,8 +243,8 @@ msgid "" "Automatically create a domain and a mailbox when a new user is created just " "after the first successful authentication." msgstr "" -"Créer automatiquement un domaine et une boite aux lettres quand un " -"nouvel utilisateur est créé après la première authenfication réussie." +"Créer automatiquement un domaine et une boite aux lettres quand un nouvel " +"utilisateur est créé après la première authenfication réussie." #: core/app_settings.py:201 #: extensions/admin/templates/admin/editdomainform.html:7 @@ -292,8 +292,8 @@ msgstr "Nombre invalide de tours" msgid "This field is required" msgstr "Ce champ est requis" -#: core/app_settings.py:349 extensions/amavis/app_settings.py:87 -#: extensions/amavis/templates/amavis/main_action_bar.html:29 +#: core/app_settings.py:349 extensions/amavis/app_settings.py:149 +#: extensions/amavis/templates/amavis/main_action_bar.html:40 #: extensions/webmail/app_settings.py:73 msgid "Display" msgstr "Afficher" @@ -347,37 +347,37 @@ msgstr "dernière connexion" msgid "You can't delete your own account" msgstr "Vous ne pouvez pas supprimer votre propre compte" -#: core/models.py:117 +#: core/models.py:130 msgid "Failed to update password: LDAP module not installed" msgstr "" "Echec de la mise à jour du mot de passe : le module LDAP n'est pas installé" -#: core/models.py:170 +#: core/models.py:183 msgid "account" msgstr "compte" -#: core/models.py:321 extensions/admin/models/domain.py:144 +#: core/models.py:334 extensions/admin/models/domain.py:144 #: extensions/admin/models/domain_alias.py:39 #: extensions/postfix_relay_domains/models.py:134 #: extensions/postfix_relay_domains/models.py:190 msgid "Invalid line" msgstr "Ligne invalide" -#: core/models.py:325 +#: core/models.py:338 msgid "You can't import an account with a role greater than yours" msgstr "Vous ne pouvez pas importer un compte avec un rôle supérieur au votre" -#: core/models.py:337 +#: core/models.py:350 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "L'utilisateur simple '%s' doit avoir une adresse email valide" -#: core/models.py:341 +#: core/models.py:354 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "Les champs username et email de '%s' ne doivent pas différer" -#: core/models.py:410 extensions/admin/models/alias.py:35 +#: core/models.py:423 extensions/admin/models/alias.py:35 #: extensions/admin/models/domain.py:32 #: extensions/admin/models/domain_alias.py:17 #: extensions/postfix_autoreply/models.py:28 @@ -386,29 +386,29 @@ msgstr "Les champs username et email de '%s' ne doivent pas différer" msgid "enabled" msgstr "Activé" -#: core/models.py:411 +#: core/models.py:424 msgid "Check to enable this extension" msgstr "Cocher pour activer cette extension" -#: core/models.py:491 +#: core/models.py:504 msgid "added" msgstr "ajouté" -#: core/models.py:494 +#: core/models.py:507 msgid "modified" msgstr "modifié" -#: core/models.py:496 core/models.py:521 +#: core/models.py:509 core/models.py:534 #, python-format msgid "%(object)s '%(name)s' %(action)s by user %(user)s" msgstr "%(object)s '%(name)s' %(action)s par l'utilisateur %(user)s" -#: core/models.py:523 +#: core/models.py:536 msgid "deleted" msgstr "Supprimé" #: core/tables.py:8 core/templates/core/information.html:8 -#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:187 +#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:179 #: extensions/admin/templates/admin/domains_table.html:5 #: extensions/admin/templates/admin/editdomainform.html:13 #: extensions/admin/templates/admin/identities_table.html:5 @@ -524,7 +524,7 @@ msgstr "Mettez à jour vos informations personnelles" #: core/templates/core/user_profile.html:8 #: extensions/admin/templates/admin/forward.html:8 #: extensions/admin/views/alias.py:112 extensions/admin/views/domain.py:168 -#: extensions/admin/views/identity.py:200 +#: extensions/admin/views/identity.py:204 #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9 #: extensions/postfix_relay_domains/views.py:66 #: extensions/sievefilters/views.py:166 extensions/webmail/views.py:172 @@ -653,7 +653,7 @@ msgstr "Transfert" msgid "Account import failed (%s): domain does not exist" msgstr "L'import du compte a échoué (%s): le domaine n'existe pas" -#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:196 +#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:197 #, python-format msgid "Mailbox %s already exists" msgstr "La boite %s existe déjà" @@ -663,6 +663,12 @@ msgstr "La boite %s existe déjà" msgid "Account import failed (%s): wrong quota value" msgstr "L'import du compte a échoué (%s): mauvais quota" +#: extensions/admin/__init__.py:212 extensions/admin/forms/domain.py:75 +#: extensions/postfix_relay_domains/forms.py:50 +#: extensions/postfix_relay_domains/forms.py:70 +msgid "domain alias" +msgstr "alias de domaine" + #: extensions/admin/app_settings.py:13 #: extensions/admin/templates/admin/editdomainform.html:25 #: extensions/limits/app_settings.py:31 extensions/limits/models.py:23 @@ -714,7 +720,7 @@ msgstr "" "même temps" #: extensions/admin/app_settings.py:81 extensions/admin/forms/account.py:178 -#: extensions/admin/forms/domain.py:56 +#: extensions/admin/forms/domain.py:57 msgid "Must be a positive integer" msgstr "Doit être un entier positif" @@ -762,7 +768,7 @@ msgstr "Vous ne pouvez pas désactiver votre propre compte" msgid "E-mail" msgstr "E-mail" -#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:17 +#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:18 msgid "Quota" msgstr "Quota" @@ -776,7 +782,7 @@ msgstr "" "valeur par défaut du domaine. Laisser vide pour définir une valeur illimitée " "(interdit pour les admins. de domaine)." -#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:26 +#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:27 #: extensions/admin/templates/admin/domains_table.html:6 #: extensions/postfix_relay_domains/forms.py:12 msgid "Alias(es)" @@ -792,25 +798,25 @@ msgstr "" "ENTREE pour ajouter un nouveau champ. Utiliser le caractère '*' pour créer " "une adresse 'attrape tout' (ex: *@domain.tld)." -#: extensions/admin/forms/account.py:187 extensions/admin/forms/account.py:217 +#: extensions/admin/forms/account.py:188 extensions/admin/forms/account.py:218 #: extensions/admin/forms/alias.py:65 msgid "Domain does not exist" msgstr "Domain inexistant" -#: extensions/admin/forms/account.py:284 +#: extensions/admin/forms/account.py:285 msgid "Domain(s)" msgstr "Domaine(s)" -#: extensions/admin/forms/account.py:286 +#: extensions/admin/forms/account.py:287 msgid "Domain(s) that user administrates" msgstr "Domaine(s) que cet utilisateur administre" -#: extensions/admin/forms/account.py:328 -#: extensions/admin/views/identity.py:132 +#: extensions/admin/forms/account.py:329 +#: extensions/admin/views/identity.py:136 msgid "Mail" msgstr "Courrier" -#: extensions/admin/forms/account.py:330 +#: extensions/admin/forms/account.py:331 msgid "Permissions" msgstr "Permissions" @@ -860,7 +866,7 @@ msgstr "Destinataire %s déjà présent" msgid "No recipient defined" msgstr "Aucune destinataire défini" -#: extensions/admin/forms/domain.py:20 +#: extensions/admin/forms/domain.py:21 msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." @@ -868,7 +874,7 @@ msgstr "" "Quota par défaut en Mo appliqué aux boites aux lettres. Laisser vide pour " "utiliser la valeur par défaut." -#: extensions/admin/forms/domain.py:29 +#: extensions/admin/forms/domain.py:30 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." @@ -876,34 +882,28 @@ msgstr "" "Alias de ce domaine. Indiquer seulement un nom par champ, appuyer sur ENTREE " "pour ajouter un nouveau champ." -#: extensions/admin/forms/domain.py:75 -#: extensions/postfix_relay_domains/forms.py:50 -#: extensions/postfix_relay_domains/forms.py:70 -msgid "domain alias" -msgstr "alias de domaine" - -#: extensions/admin/forms/domain.py:82 extensions/admin/forms/domain.py:98 +#: extensions/admin/forms/domain.py:78 extensions/admin/forms/domain.py:92 #: extensions/postfix_relay_domains/forms.py:58 #: extensions/postfix_relay_domains/forms.py:78 #, python-format msgid "A %s with this name already exists" msgstr "Un %s de ce nom existe déjà" -#: extensions/admin/forms/domain.py:92 +#: extensions/admin/forms/domain.py:89 #: extensions/postfix_relay_domains/forms.py:49 #: extensions/postfix_relay_domains/forms.py:71 msgid "domain" msgstr "domaine" -#: extensions/admin/forms/domain.py:181 +#: extensions/admin/forms/domain.py:173 msgid "Create a domain administrator" msgstr "Créer un administrateur de domaine" -#: extensions/admin/forms/domain.py:183 +#: extensions/admin/forms/domain.py:175 msgid "Automatically create an administrator for this domain" msgstr "Créer automatiquement un administrateur pour ce domaine" -#: extensions/admin/forms/domain.py:190 +#: extensions/admin/forms/domain.py:182 msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." @@ -911,19 +911,19 @@ msgstr "" "Le nom de l'administrateur. Ne pas include un nom de domaine ici, il sera " "ajouté automatiquement." -#: extensions/admin/forms/domain.py:198 +#: extensions/admin/forms/domain.py:190 msgid "Create aliases" msgstr "Créer des alias" -#: extensions/admin/forms/domain.py:200 +#: extensions/admin/forms/domain.py:192 msgid "Automatically create standard aliases for this domain" msgstr "Créer automatiquement des alias standard pour ce domaine" -#: extensions/admin/forms/domain.py:216 +#: extensions/admin/forms/domain.py:208 msgid "Invalid format" msgstr "Format invalide" -#: extensions/admin/forms/domain.py:230 +#: extensions/admin/forms/domain.py:222 #, python-format msgid "User '%s' already exists" msgstr "L'utilisateur '%s' existe déjà" @@ -960,7 +960,7 @@ msgstr "" "Vous ne pouvez pas définir un transfert vers une destination locale. " "Veuillez plutôt demander à votre administrateur de créer un alias" -#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:198 +#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:200 msgid "Select a file" msgstr "Sélectionner un fichier" @@ -982,7 +982,7 @@ msgstr "" "Cocher cette option si les mots de passe contenus dans votre fichier ne sont " "pas chiffrés" -#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:62 +#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:74 msgid "address" msgstr "Adresse" @@ -1080,21 +1080,21 @@ msgstr "Le domaine vers lequel cet alias pointe" msgid "Unknown domain %s" msgstr "Domain %s inconnu" -#: extensions/admin/models/mailbox.py:63 +#: extensions/admin/models/mailbox.py:75 msgid "Mailbox address (without the @domain.tld part)" msgstr "Adresse de la boite aux lettres (sans la partie @domain.tld)" -#: extensions/admin/models/mailbox.py:125 +#: extensions/admin/models/mailbox.py:136 #, python-format msgid "Failed to retrieve mailbox location (%s)" msgstr "Impossible de récuperer l'emplacement de la boite (%s)" -#: extensions/admin/models/mailbox.py:194 +#: extensions/admin/models/mailbox.py:221 #, python-format msgid "Quota is greater than the allowed domain's limit (%dM)" msgstr "Le quota est supérieur à la limité autorisée pour le domaine (%dM)" -#: extensions/admin/models/mailbox.py:199 +#: extensions/admin/models/mailbox.py:227 msgid "A quota is required" msgstr "Un quota est requis" @@ -1166,7 +1166,7 @@ msgid "Importing..." msgstr "Import en cours..." #: extensions/admin/templates/admin/listing.html:14 -#: extensions/stats/templates/stats/index.html:28 +#: extensions/stats/templates/stats/index.html:23 msgid "Filter" msgstr "Filter" @@ -1268,8 +1268,8 @@ msgid "Alias with this name already exists" msgstr "Un alias de ce nom existe déjà" #: extensions/admin/views/alias.py:50 extensions/admin/views/domain.py:102 -#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:133 -#: extensions/admin/views/identity.py:160 +#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:137 +#: extensions/admin/views/identity.py:164 #: extensions/postfix_relay_domains/views.py:34 #: extensions/sievefilters/views.py:144 extensions/sievefilters/views.py:233 #: extensions/webmail/views.py:153 @@ -1312,7 +1312,7 @@ msgstr "Transfert modifié" msgid "Alias modified" msgstr "Alias modifié" -#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:130 +#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:134 msgid "Next" msgstr "Suivante" @@ -1320,7 +1320,7 @@ msgstr "Suivante" msgid "Options" msgstr "Options" -#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:134 +#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:138 msgid "Previous" msgstr "Précédente" @@ -1354,11 +1354,11 @@ msgstr "Export d'identités" msgid "Export domains" msgstr "Export de domaines" -#: extensions/admin/views/identity.py:104 -#: extensions/admin/views/identity.py:227 -#: extensions/admin/views/identity.py:232 extensions/amavis/views.py:144 -#: extensions/amavis/views.py:148 extensions/amavis/views.py:181 -#: extensions/amavis/views.py:186 extensions/amavis/views.py:188 +#: extensions/admin/views/identity.py:108 +#: extensions/admin/views/identity.py:231 +#: extensions/admin/views/identity.py:236 extensions/amavis/views.py:147 +#: extensions/amavis/views.py:151 extensions/amavis/views.py:184 +#: extensions/amavis/views.py:189 extensions/amavis/views.py:191 #: extensions/webmail/views.py:49 extensions/webmail/views.py:67 #: extensions/webmail/views.py:81 extensions/webmail/views.py:99 #: extensions/webmail/views.py:116 extensions/webmail/views.py:202 @@ -1369,19 +1369,19 @@ msgstr "Export de domaines" msgid "Invalid request" msgstr "Requête invalide" -#: extensions/admin/views/identity.py:151 +#: extensions/admin/views/identity.py:155 msgid "Account created" msgstr "Compte créé" -#: extensions/admin/views/identity.py:157 +#: extensions/admin/views/identity.py:161 msgid "New account" msgstr "Nouveau compte" -#: extensions/admin/views/identity.py:193 +#: extensions/admin/views/identity.py:197 msgid "Account updated" msgstr "Compte mis à jour" -#: extensions/admin/views/identity.py:217 +#: extensions/admin/views/identity.py:221 msgid "Account deleted" msgid_plural "Accounts deleted" msgstr[0] "Compte supprimé" @@ -1464,7 +1464,7 @@ msgstr "Transfert mis à jour" msgid "Simple amavis management frontend" msgstr "Interface simplifiée pour la gestion d'amavis" -#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:18 +#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:20 msgid "Quarantine" msgstr "Quarantaine" @@ -1558,27 +1558,96 @@ msgstr "Emetteur des notifications" msgid "The e-mail address used to send notitications" msgstr "L'adresse e-mail utilisée pour envoyer les notifications" -#: extensions/amavis/app_settings.py:91 extensions/webmail/app_settings.py:91 +#: extensions/amavis/app_settings.py:77 +#: extensions/amavis/templates/amavis/main_action_bar.html:27 +msgid "Manual learning" +msgstr "Apprentissage manuel" + +#: extensions/amavis/app_settings.py:80 +msgid "Enable manual learning" +msgstr "Activer l'apprentissage manuel" + +#: extensions/amavis/app_settings.py:83 +msgid "Allow super administrators to manually train Spamassassin" +msgstr "Autorise les super administrateurs à entrainer manuellement Spamassassin" + +#: extensions/amavis/app_settings.py:88 +msgid "Is Spamassassin local?" +msgstr "Spamassassin est il local?" + +#: extensions/amavis/app_settings.py:91 +msgid "Tell if Spamassassin is running on the same server than modoboa" +msgstr "Indique si Spamassassin tourne sur le même serveur que Modoboa" + +#: extensions/amavis/app_settings.py:96 +msgid "Default user" +msgstr "Utilisateur par défaut" + +#: extensions/amavis/app_settings.py:99 +msgid "Name of the user owning the default bayesian database" +msgstr "Nom de l'utilisateur possédant la base bayesienne par défaut" + +#: extensions/amavis/app_settings.py:104 +msgid "Spamd address" +msgstr "Adresse de spamd" + +#: extensions/amavis/app_settings.py:106 +msgid "The IP address where spamd can be reached" +msgstr "L'adresse IP à laquelle spamd peut etre joint" + +#: extensions/amavis/app_settings.py:110 +msgid "Spamd port" +msgstr "Port de spamd" + +#: extensions/amavis/app_settings.py:112 +msgid "The TCP port spamd is listening on" +msgstr "Le port TCP sur lequel écoute spamd" + +#: extensions/amavis/app_settings.py:116 +msgid "Enable per-domain manual learning" +msgstr "Activer l'apprentissage manuel niveau domaine" + +#: extensions/amavis/app_settings.py:119 +msgid "" +"Allow domain administrators to train Spamassassin (within dedicated per-" +"domain databases)" +msgstr "" +"Autorise les administrateurs de domaine à entrainer Spamassassin (au sein" +" de bases dédiées par domaine)" + +#: extensions/amavis/app_settings.py:125 +msgid "Enable per-user manual learning" +msgstr "Activer l'apprentissage manuel par utilisateur" + +#: extensions/amavis/app_settings.py:128 +msgid "" +"Allow simple users to personally train Spamassassin (within a dedicated " +"database)" +msgstr "" +"Autorise les utilisateur à entrainer personnellement Spamassassin" +" (au sein d'une base dédiée)" + +#: extensions/amavis/app_settings.py:153 extensions/webmail/app_settings.py:91 msgid "Number of displayed emails per page" msgstr "Nombre d'emails affichés par page" -#: extensions/amavis/app_settings.py:92 +#: extensions/amavis/app_settings.py:154 msgid "Set the maximum number of messages displayed in a page" msgstr "Définir le nombre maximal de messages affichés dans une page" -#: extensions/amavis/general_callbacks.py:82 +#: extensions/amavis/general_callbacks.py:136 msgid "pending requests" msgstr "requêtes en attente" -#: extensions/amavis/general_callbacks.py:125 +#: extensions/amavis/general_callbacks.py:179 msgid "Pending requests" msgstr "Requêtes en attente" -#: extensions/amavis/general_callbacks.py:135 +#: extensions/amavis/general_callbacks.py:189 msgid "Content filter" msgstr "Filtrage de contenu" -#: extensions/amavis/lib.py:56 +#: extensions/amavis/lib.py:60 #, python-format msgid "Connection to amavis failed: %s" msgstr "La connexion avec amavis a échoué : %s" @@ -1646,8 +1715,8 @@ msgid "Score" msgstr "Score" #: extensions/amavis/sql_listing.py:33 -#: extensions/amavis/templatetags/amavis_tags.py:75 -#: extensions/webmail/forms.py:82 +#: extensions/amavis/templatetags/amavis_tags.py:100 +#: extensions/webmail/forms.py:83 msgid "To" msgstr "A" @@ -1658,49 +1727,56 @@ msgid "From" msgstr "De" #: extensions/amavis/sql_listing.py:40 extensions/sievefilters/forms.py:77 -#: extensions/webmail/forms.py:86 extensions/webmail/lib/imapemail.py:288 +#: extensions/webmail/forms.py:87 extensions/webmail/lib/imapemail.py:288 #: extensions/webmail/lib/listing.py:27 extensions/webmail/lib/tables.py:26 #: templates/common/email_searchbar.html:6 msgid "Subject" msgstr "Sujet" -#: extensions/amavis/views.py:27 +#: extensions/amavis/views.py:30 msgid "Empty quarantine" msgstr "Quarantaine vide" -#: extensions/amavis/views.py:149 +#: extensions/amavis/views.py:152 msgid "Message deleted" msgstr "Message supprimé" -#: extensions/amavis/views.py:168 +#: extensions/amavis/views.py:171 #, python-format msgid "%(count)d message deleted successfully" msgid_plural "%(count)d messages deleted successfully" msgstr[0] "%(count)d message supprimé correctement" msgstr[1] "%(count)d messages supprimés correctement" -#: extensions/amavis/views.py:191 +#: extensions/amavis/views.py:194 msgid "Request sent" msgstr "Requête envoyée" -#: extensions/amavis/views.py:197 +#: extensions/amavis/views.py:200 msgid "Message released" msgstr "Message relâché" -#: extensions/amavis/views.py:225 +#: extensions/amavis/views.py:228 #, python-format msgid "%(count)d request sent" msgid_plural "%(count)d requests sent" msgstr[0] "%(count)d requête envoyée" msgstr[1] "%(count)d requêtes envoyées" -#: extensions/amavis/views.py:246 +#: extensions/amavis/views.py:249 #, python-format msgid "%(count)d message released successfully" msgid_plural "%(count)d messages released successfully" msgstr[0] "%(count)d message relâché correctement" msgstr[1] "%(count)d messages relâchés correctement" +#: extensions/amavis/views.py:282 +#, python-format +msgid "%(count)d message processed successfully" +msgid_plural "%(count)d messages processed successfully" +msgstr[0] "%(count)d message traité correctement" +msgstr[1] "%(count)d messages traités correctement" + #: extensions/amavis/management/commands/amnotify.py:61 msgid "[modoboa] Pending release requests" msgstr "[modoboa] requêtes de libération en attente" @@ -1746,44 +1822,54 @@ msgid "Banned" msgstr "Banni" #: extensions/amavis/templates/amavis/main_action_bar.html:18 -#: extensions/amavis/templatetags/amavis_tags.py:19 -#: extensions/amavis/templatetags/amavis_tags.py:54 +#: extensions/amavis/templatetags/amavis_tags.py:24 +#: extensions/amavis/templatetags/amavis_tags.py:79 msgid "Release" msgstr "Relâcher" #: extensions/amavis/templates/amavis/main_action_bar.html:23 -#: extensions/amavis/templatetags/amavis_tags.py:25 -#: extensions/amavis/templatetags/amavis_tags.py:61 +#: extensions/amavis/templatetags/amavis_tags.py:30 +#: extensions/amavis/templatetags/amavis_tags.py:86 #: extensions/webmail/templatetags/webmail_tags.py:32 msgid "Delete" msgstr "Supprimer" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templatetags/amavis_tags.py:44 +msgid "Mark as spam" +msgstr "Marquer comme spam" + +#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templatetags/amavis_tags.py:49 +msgid "Mark as non-spam" +msgstr "Marquer comme non-spam" + +#: extensions/amavis/templates/amavis/main_action_bar.html:42 #: extensions/sievefilters/forms.py:64 msgid "All messages" msgstr "Tous les messages" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:42 msgid "All" msgstr "Tout" -#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templates/amavis/main_action_bar.html:43 msgid "Spam only" msgstr "Seulement le spam" -#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templates/amavis/main_action_bar.html:44 msgid "Virus only" msgstr "Seulement les virus" -#: extensions/amavis/templates/amavis/main_action_bar.html:34 +#: extensions/amavis/templates/amavis/main_action_bar.html:45 msgid "Bad Header only" msgstr "Seulement les mauvais entêtes" -#: extensions/amavis/templates/amavis/main_action_bar.html:35 +#: extensions/amavis/templates/amavis/main_action_bar.html:46 msgid "Bad MIME only" msgstr "Seulement les mauvais types MIME" -#: extensions/amavis/templates/amavis/main_action_bar.html:36 +#: extensions/amavis/templates/amavis/main_action_bar.html:47 msgid "Banned only" msgstr "Seulement les bannis" @@ -1831,7 +1917,7 @@ msgstr "Agir sur ce message :" msgid "Please visit %(listingurl)s for a full listing." msgstr "Veuillez visiter %(listingurl)s pour une liste complète." -#: extensions/amavis/templatetags/amavis_tags.py:28 +#: extensions/amavis/templatetags/amavis_tags.py:35 msgid "View full headers" msgstr "Afficher tous les entêtes" @@ -2269,7 +2355,7 @@ msgstr "Expéditeur" msgid "Recipient" msgstr "Destinataire" -#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:83 +#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:84 msgid "Cc" msgstr "Cc" @@ -2526,19 +2612,19 @@ msgstr "Jeu de graphiques inconnu" msgid "Bad custom period" msgstr "Mauvaise période personnalisée" -#: extensions/stats/templates/stats/index.html:33 +#: extensions/stats/templates/stats/index.html:28 msgid "Search a domain" msgstr "Chercher un domaine" -#: extensions/stats/templates/stats/index.html:37 +#: extensions/stats/templates/stats/index.html:32 msgid "Predefined time ranges" msgstr "Période de temps pré-définie" -#: extensions/stats/templates/stats/index.html:44 +#: extensions/stats/templates/stats/index.html:39 msgid "Custom time range" msgstr "Période de temps personnalisée" -#: extensions/stats/templates/stats/index.html:57 +#: extensions/stats/templates/stats/index.html:52 msgid "Apply" msgstr "Appliquer" @@ -2694,7 +2780,7 @@ msgstr "Réponse du serveur" msgid "Unknown action" msgstr "Action inconnue" -#: extensions/webmail/forms.py:84 +#: extensions/webmail/forms.py:85 msgid "Cci" msgstr "Cci" @@ -2901,15 +2987,15 @@ msgstr "Non" msgid "Failed to update password: %s" msgstr "Echec de la mise à jour du mot de passe : %s" -#: lib/permissions.py:20 +#: lib/permissions.py:19 msgid "Simple user" msgstr "Utilisateur simple" -#: lib/permissions.py:22 +#: lib/permissions.py:21 msgid "Super administrator" msgstr "Super administrateur" -#: lib/permissions.py:28 +#: lib/permissions.py:27 msgid "Domain administrator" msgstr "Administrateur de domaine" diff --git a/modoboa/locale/it/LC_MESSAGES/django.po b/modoboa/locale/it/LC_MESSAGES/django.po index bfcc10a44..0524c2034 100644 --- a/modoboa/locale/it/LC_MESSAGES/django.po +++ b/modoboa/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:29+0200\n" +"POT-Creation-Date: 2014-10-29 13:25+0100\n" "PO-Revision-Date: 2013-12-23 00:56+0100\n" "Last-Translator: Alberto Berti \n" "Language-Team: ITALIANO \n" @@ -18,8 +18,8 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: core/__init__.py:52 core/__init__.py:53 -#: extensions/admin/forms/account.py:326 extensions/admin/forms/domain.py:256 -#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:129 +#: extensions/admin/forms/account.py:327 extensions/admin/forms/domain.py:248 +#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:133 #: extensions/postfix_autoreply/app_settings.py:11 #: extensions/postfix_relay_domains/forms.py:138 #: extensions/sievefilters/app_settings.py:50 @@ -291,8 +291,8 @@ msgstr "Numero di cicli non valido" msgid "This field is required" msgstr "Questo campo è obbligatorio" -#: core/app_settings.py:349 extensions/amavis/app_settings.py:87 -#: extensions/amavis/templates/amavis/main_action_bar.html:29 +#: core/app_settings.py:349 extensions/amavis/app_settings.py:149 +#: extensions/amavis/templates/amavis/main_action_bar.html:40 #: extensions/webmail/app_settings.py:73 msgid "Display" msgstr "Mostra" @@ -346,36 +346,36 @@ msgstr "ultimo login" msgid "You can't delete your own account" msgstr "Non puoi cancellare il tuo account" -#: core/models.py:117 +#: core/models.py:130 msgid "Failed to update password: LDAP module not installed" msgstr "Aggiornamento della password fallito: il modulo LDAP non è installato" -#: core/models.py:170 +#: core/models.py:183 msgid "account" msgstr "account" -#: core/models.py:321 extensions/admin/models/domain.py:144 +#: core/models.py:334 extensions/admin/models/domain.py:144 #: extensions/admin/models/domain_alias.py:39 #: extensions/postfix_relay_domains/models.py:134 #: extensions/postfix_relay_domains/models.py:190 msgid "Invalid line" msgstr "Riga non valida" -#: core/models.py:325 +#: core/models.py:338 msgid "You can't import an account with a role greater than yours" msgstr "Non puoi importare un account con un ruolo superiore al tuo" -#: core/models.py:337 +#: core/models.py:350 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "L'utente '%s' deve avere un indirizzo email valido" -#: core/models.py:341 +#: core/models.py:354 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "I campi nome utente e email di '%s' devono avere lo stesso valore" -#: core/models.py:410 extensions/admin/models/alias.py:35 +#: core/models.py:423 extensions/admin/models/alias.py:35 #: extensions/admin/models/domain.py:32 #: extensions/admin/models/domain_alias.py:17 #: extensions/postfix_autoreply/models.py:28 @@ -384,29 +384,29 @@ msgstr "I campi nome utente e email di '%s' devono avere lo stesso valore" msgid "enabled" msgstr "Attivato" -#: core/models.py:411 +#: core/models.py:424 msgid "Check to enable this extension" msgstr "Seleziona per abilitare questa estensione" -#: core/models.py:491 +#: core/models.py:504 msgid "added" msgstr "aggiunto" -#: core/models.py:494 +#: core/models.py:507 msgid "modified" msgstr "modificato" -#: core/models.py:496 core/models.py:521 +#: core/models.py:509 core/models.py:534 #, python-format msgid "%(object)s '%(name)s' %(action)s by user %(user)s" msgstr "%(object)s '%(name)s' %(action)s dell'utente %(user)s" -#: core/models.py:523 +#: core/models.py:536 msgid "deleted" msgstr "cancellato" #: core/tables.py:8 core/templates/core/information.html:8 -#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:187 +#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:179 #: extensions/admin/templates/admin/domains_table.html:5 #: extensions/admin/templates/admin/editdomainform.html:13 #: extensions/admin/templates/admin/identities_table.html:5 @@ -522,7 +522,7 @@ msgstr "Aggiorna le informazioni personali" #: core/templates/core/user_profile.html:8 #: extensions/admin/templates/admin/forward.html:8 #: extensions/admin/views/alias.py:112 extensions/admin/views/domain.py:168 -#: extensions/admin/views/identity.py:200 +#: extensions/admin/views/identity.py:204 #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9 #: extensions/postfix_relay_domains/views.py:66 #: extensions/sievefilters/views.py:166 extensions/webmail/views.py:172 @@ -650,7 +650,7 @@ msgstr "Inoltra" msgid "Account import failed (%s): domain does not exist" msgstr "Importazione dell'account fallito (%s): il dominio non esiste" -#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:196 +#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:197 #, python-format msgid "Mailbox %s already exists" msgstr "La casella di posta %s esiste già" @@ -660,6 +660,12 @@ msgstr "La casella di posta %s esiste già" msgid "Account import failed (%s): wrong quota value" msgstr "Importazione dell'account fallito (%s): il dominio non esiste" +#: extensions/admin/__init__.py:212 extensions/admin/forms/domain.py:75 +#: extensions/postfix_relay_domains/forms.py:50 +#: extensions/postfix_relay_domains/forms.py:70 +msgid "domain alias" +msgstr "alias del dominio" + #: extensions/admin/app_settings.py:13 #: extensions/admin/templates/admin/editdomainform.html:25 #: extensions/limits/app_settings.py:31 extensions/limits/models.py:23 @@ -710,7 +716,7 @@ msgstr "" "Quando una casella postale viene rimossa rimuovi anche l'account associato" #: extensions/admin/app_settings.py:81 extensions/admin/forms/account.py:178 -#: extensions/admin/forms/domain.py:56 +#: extensions/admin/forms/domain.py:57 msgid "Must be a positive integer" msgstr "Dev'essere un intero positivo" @@ -759,7 +765,7 @@ msgstr "Tu non puoi disabilitare il tuo account" msgid "E-mail" msgstr "E-mail" -#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:17 +#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:18 msgid "Quota" msgstr "Quota" @@ -773,7 +779,7 @@ msgstr "" "quello predefinito. Lasciare vuoto per non impostare limiti (non consentito " "per gli amministratori di dominio)." -#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:26 +#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:27 #: extensions/admin/templates/admin/domains_table.html:6 #: extensions/postfix_relay_domains/forms.py:12 msgid "Alias(es)" @@ -789,25 +795,25 @@ msgstr "" "premere INVIO per aggiungere un nuovo elemento. Utilizzare il carattere '*' " "per creare un alias 'prenditutto' (p.es.: *@dominio.org)." -#: extensions/admin/forms/account.py:187 extensions/admin/forms/account.py:217 +#: extensions/admin/forms/account.py:188 extensions/admin/forms/account.py:218 #: extensions/admin/forms/alias.py:65 msgid "Domain does not exist" msgstr "Il dominio non esiste" -#: extensions/admin/forms/account.py:284 +#: extensions/admin/forms/account.py:285 msgid "Domain(s)" msgstr "Dominio(i)" -#: extensions/admin/forms/account.py:286 +#: extensions/admin/forms/account.py:287 msgid "Domain(s) that user administrates" msgstr "Dominio(i) amministrato(i) dall'utente" -#: extensions/admin/forms/account.py:328 -#: extensions/admin/views/identity.py:132 +#: extensions/admin/forms/account.py:329 +#: extensions/admin/views/identity.py:136 msgid "Mail" msgstr "Posta" -#: extensions/admin/forms/account.py:330 +#: extensions/admin/forms/account.py:331 msgid "Permissions" msgstr "Permessi" @@ -855,7 +861,7 @@ msgstr "Il destinatario %s è già esistente" msgid "No recipient defined" msgstr "Non è stato definito un destinatario" -#: extensions/admin/forms/domain.py:20 +#: extensions/admin/forms/domain.py:21 msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." @@ -863,7 +869,7 @@ msgstr "" "Quota in MB predefinita applicata alle caselle di posta. Lascialo vuoto se " "vuoi applicare il valore predefinito." -#: extensions/admin/forms/domain.py:29 +#: extensions/admin/forms/domain.py:30 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." @@ -871,34 +877,28 @@ msgstr "" "Alias per questo dominio. Inserire un solo nome alla volta, premere INVIO " "per aggiungere un nuovo elemento" -#: extensions/admin/forms/domain.py:75 -#: extensions/postfix_relay_domains/forms.py:50 -#: extensions/postfix_relay_domains/forms.py:70 -msgid "domain alias" -msgstr "alias del dominio" - -#: extensions/admin/forms/domain.py:82 extensions/admin/forms/domain.py:98 +#: extensions/admin/forms/domain.py:78 extensions/admin/forms/domain.py:92 #: extensions/postfix_relay_domains/forms.py:58 #: extensions/postfix_relay_domains/forms.py:78 #, python-format msgid "A %s with this name already exists" msgstr "Un %s con questo nome esiste già" -#: extensions/admin/forms/domain.py:92 +#: extensions/admin/forms/domain.py:89 #: extensions/postfix_relay_domains/forms.py:49 #: extensions/postfix_relay_domains/forms.py:71 msgid "domain" msgstr "dominio" -#: extensions/admin/forms/domain.py:181 +#: extensions/admin/forms/domain.py:173 msgid "Create a domain administrator" msgstr "Crea un amministratore di dominio" -#: extensions/admin/forms/domain.py:183 +#: extensions/admin/forms/domain.py:175 msgid "Automatically create an administrator for this domain" msgstr "Crea automaticamente un amministratore per questo dominio" -#: extensions/admin/forms/domain.py:190 +#: extensions/admin/forms/domain.py:182 msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." @@ -906,19 +906,19 @@ msgstr "" "Il nome dell'amministratore. Non includere il nome del dominio, verrà " "aggiunto automaticamente." -#: extensions/admin/forms/domain.py:198 +#: extensions/admin/forms/domain.py:190 msgid "Create aliases" msgstr "Crea alias" -#: extensions/admin/forms/domain.py:200 +#: extensions/admin/forms/domain.py:192 msgid "Automatically create standard aliases for this domain" msgstr "Crea automaticamente gli alias standard per questo dominio" -#: extensions/admin/forms/domain.py:216 +#: extensions/admin/forms/domain.py:208 msgid "Invalid format" msgstr "Formato non valido" -#: extensions/admin/forms/domain.py:230 +#: extensions/admin/forms/domain.py:222 #, python-format msgid "User '%s' already exists" msgstr "L'utente '%s' esiste già" @@ -956,7 +956,7 @@ msgstr "" "Non puoi definire l'inoltro con destinazione una cartella locale. Chiedi " "piuttosto all'amministratore di creare un alias." -#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:198 +#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:200 msgid "Select a file" msgstr "Seleziona un file" @@ -977,7 +977,7 @@ 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" -#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:62 +#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:74 msgid "address" msgstr "indirizzo" @@ -1075,21 +1075,21 @@ msgstr "Il dominio a cui punta questo alias" msgid "Unknown domain %s" msgstr "Dominio sconosciuto %s" -#: extensions/admin/models/mailbox.py:63 +#: extensions/admin/models/mailbox.py:75 msgid "Mailbox address (without the @domain.tld part)" msgstr "Indirizzo della casella di posta (senza la parte @dominio.org)" -#: extensions/admin/models/mailbox.py:125 +#: extensions/admin/models/mailbox.py:136 #, python-format msgid "Failed to retrieve mailbox location (%s)" msgstr "Impossibile recuperare la posizione della casella di posta (%s)" -#: extensions/admin/models/mailbox.py:194 +#: extensions/admin/models/mailbox.py:221 #, python-format msgid "Quota is greater than the allowed domain's limit (%dM)" msgstr "La quota è maggiore del limite stabilito per il dominio (%dM)" -#: extensions/admin/models/mailbox.py:199 +#: extensions/admin/models/mailbox.py:227 msgid "A quota is required" msgstr "È richiesta una quota" @@ -1161,7 +1161,7 @@ msgid "Importing..." msgstr "Importazione..." #: extensions/admin/templates/admin/listing.html:14 -#: extensions/stats/templates/stats/index.html:28 +#: extensions/stats/templates/stats/index.html:23 msgid "Filter" msgstr "Filtro" @@ -1263,8 +1263,8 @@ msgid "Alias with this name already exists" msgstr "Un alias con questo nome esiste già" #: extensions/admin/views/alias.py:50 extensions/admin/views/domain.py:102 -#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:133 -#: extensions/admin/views/identity.py:160 +#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:137 +#: extensions/admin/views/identity.py:164 #: extensions/postfix_relay_domains/views.py:34 #: extensions/sievefilters/views.py:144 extensions/sievefilters/views.py:233 #: extensions/webmail/views.py:153 @@ -1307,7 +1307,7 @@ msgstr "Inoltro modificato" msgid "Alias modified" msgstr "Alias modificato" -#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:130 +#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:134 msgid "Next" msgstr "Successivo" @@ -1315,7 +1315,7 @@ msgstr "Successivo" msgid "Options" msgstr "Opzioni" -#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:134 +#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:138 msgid "Previous" msgstr "Precedente" @@ -1349,11 +1349,11 @@ msgstr "Identità di esportazione" msgid "Export domains" msgstr "Esporta domini" -#: extensions/admin/views/identity.py:104 -#: extensions/admin/views/identity.py:227 -#: extensions/admin/views/identity.py:232 extensions/amavis/views.py:144 -#: extensions/amavis/views.py:148 extensions/amavis/views.py:181 -#: extensions/amavis/views.py:186 extensions/amavis/views.py:188 +#: extensions/admin/views/identity.py:108 +#: extensions/admin/views/identity.py:231 +#: extensions/admin/views/identity.py:236 extensions/amavis/views.py:147 +#: extensions/amavis/views.py:151 extensions/amavis/views.py:184 +#: extensions/amavis/views.py:189 extensions/amavis/views.py:191 #: extensions/webmail/views.py:49 extensions/webmail/views.py:67 #: extensions/webmail/views.py:81 extensions/webmail/views.py:99 #: extensions/webmail/views.py:116 extensions/webmail/views.py:202 @@ -1364,19 +1364,19 @@ msgstr "Esporta domini" msgid "Invalid request" msgstr "Richiesta non valida" -#: extensions/admin/views/identity.py:151 +#: extensions/admin/views/identity.py:155 msgid "Account created" msgstr "Account creato" -#: extensions/admin/views/identity.py:157 +#: extensions/admin/views/identity.py:161 msgid "New account" msgstr "Nuovo account" -#: extensions/admin/views/identity.py:193 +#: extensions/admin/views/identity.py:197 msgid "Account updated" msgstr "Account aggiornato" -#: extensions/admin/views/identity.py:217 +#: extensions/admin/views/identity.py:221 msgid "Account deleted" msgid_plural "Accounts deleted" msgstr[0] "Account cancellato" @@ -1461,7 +1461,7 @@ msgstr "Inoltro aggiornato" msgid "Simple amavis management frontend" msgstr "Interfaccia di gestione amavis semplice" -#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:18 +#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:20 msgid "Quarantine" msgstr "Quarantena" @@ -1554,27 +1554,95 @@ msgstr "Spedizione notifiche" msgid "The e-mail address used to send notitications" msgstr "L'indirizzo e-mail utilizzato per l'invio di notifiche" -#: extensions/amavis/app_settings.py:91 extensions/webmail/app_settings.py:91 +#: extensions/amavis/app_settings.py:77 +#: extensions/amavis/templates/amavis/main_action_bar.html:27 +msgid "Manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:80 +msgid "Enable manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:83 +msgid "Allow super administrators to manually train Spamassassin" +msgstr "" + +#: extensions/amavis/app_settings.py:88 +msgid "Is Spamassassin local?" +msgstr "" + +#: extensions/amavis/app_settings.py:91 +msgid "Tell if Spamassassin is running on the same server than modoboa" +msgstr "" + +#: extensions/amavis/app_settings.py:96 +#, fuzzy +msgid "Default user" +msgstr "Editor predefinito" + +#: extensions/amavis/app_settings.py:99 +msgid "Name of the user owning the default bayesian database" +msgstr "" + +#: extensions/amavis/app_settings.py:104 +#, fuzzy +msgid "Spamd address" +msgstr "Mittente" + +#: extensions/amavis/app_settings.py:106 +msgid "The IP address where spamd can be reached" +msgstr "" + +#: extensions/amavis/app_settings.py:110 +#, fuzzy +msgid "Spamd port" +msgstr "Solo messaggi di spam" + +#: extensions/amavis/app_settings.py:112 +msgid "The TCP port spamd is listening on" +msgstr "" + +#: extensions/amavis/app_settings.py:116 +msgid "Enable per-domain manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:119 +msgid "" +"Allow domain administrators to train Spamassassin (within dedicated per-" +"domain databases)" +msgstr "" + +#: extensions/amavis/app_settings.py:125 +msgid "Enable per-user manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:128 +msgid "" +"Allow simple users to personally train Spamassassin (within a dedicated " +"database)" +msgstr "" + +#: extensions/amavis/app_settings.py:153 extensions/webmail/app_settings.py:91 msgid "Number of displayed emails per page" msgstr "Numero di e-mail mostrate in ogni pagina" -#: extensions/amavis/app_settings.py:92 +#: extensions/amavis/app_settings.py:154 msgid "Set the maximum number of messages displayed in a page" msgstr "Imposta il numero massimo di messaggi mostrati in una pagina" -#: extensions/amavis/general_callbacks.py:82 +#: extensions/amavis/general_callbacks.py:136 msgid "pending requests" msgstr "richieste in sospeso" -#: extensions/amavis/general_callbacks.py:125 +#: extensions/amavis/general_callbacks.py:179 msgid "Pending requests" msgstr "Richieste in sospeso" -#: extensions/amavis/general_callbacks.py:135 +#: extensions/amavis/general_callbacks.py:189 msgid "Content filter" msgstr "Filtro sui contenuti" -#: extensions/amavis/lib.py:56 +#: extensions/amavis/lib.py:60 #, python-format msgid "Connection to amavis failed: %s" msgstr "Connessione ad amavis fallita: %s" @@ -1642,8 +1710,8 @@ msgid "Score" msgstr "Punteggio" #: extensions/amavis/sql_listing.py:33 -#: extensions/amavis/templatetags/amavis_tags.py:75 -#: extensions/webmail/forms.py:82 +#: extensions/amavis/templatetags/amavis_tags.py:100 +#: extensions/webmail/forms.py:83 msgid "To" msgstr "A" @@ -1654,49 +1722,56 @@ msgid "From" msgstr "Da" #: extensions/amavis/sql_listing.py:40 extensions/sievefilters/forms.py:77 -#: extensions/webmail/forms.py:86 extensions/webmail/lib/imapemail.py:288 +#: extensions/webmail/forms.py:87 extensions/webmail/lib/imapemail.py:288 #: extensions/webmail/lib/listing.py:27 extensions/webmail/lib/tables.py:26 #: templates/common/email_searchbar.html:6 msgid "Subject" msgstr "Oggetto" -#: extensions/amavis/views.py:27 +#: extensions/amavis/views.py:30 msgid "Empty quarantine" msgstr "Svuota quarantena" -#: extensions/amavis/views.py:149 +#: extensions/amavis/views.py:152 msgid "Message deleted" msgstr "Messaggio eliminato" -#: extensions/amavis/views.py:168 +#: extensions/amavis/views.py:171 #, python-format msgid "%(count)d message deleted successfully" msgid_plural "%(count)d messages deleted successfully" msgstr[0] "%(count)d messaggio eliminato con successo" msgstr[1] "%(count)d messaggi eliminati con successo" -#: extensions/amavis/views.py:191 +#: extensions/amavis/views.py:194 msgid "Request sent" msgstr "Request inviata" -#: extensions/amavis/views.py:197 +#: extensions/amavis/views.py:200 msgid "Message released" msgstr "Messaggio rilasciato" -#: extensions/amavis/views.py:225 +#: extensions/amavis/views.py:228 #, python-format msgid "%(count)d request sent" msgid_plural "%(count)d requests sent" msgstr[0] "%(count)d request inviata" msgstr[1] "%(count)d request inviate" -#: extensions/amavis/views.py:246 +#: extensions/amavis/views.py:249 #, python-format msgid "%(count)d message released successfully" msgid_plural "%(count)d messages released successfully" msgstr[0] "%(count)d messaggio rilasciato con successo" msgstr[1] "%(count)d messaggi rilasciati con successo " +#: extensions/amavis/views.py:282 +#, fuzzy, python-format +msgid "%(count)d message processed successfully" +msgid_plural "%(count)d messages processed successfully" +msgstr[0] "%(count)d messaggio rilasciato con successo" +msgstr[1] "%(count)d messaggi rilasciati con successo " + #: extensions/amavis/management/commands/amnotify.py:61 msgid "[modoboa] Pending release requests" msgstr "[modoboa] Richieste di rilascio in sospeso" @@ -1742,44 +1817,55 @@ msgid "Banned" msgstr "Banditi" #: extensions/amavis/templates/amavis/main_action_bar.html:18 -#: extensions/amavis/templatetags/amavis_tags.py:19 -#: extensions/amavis/templatetags/amavis_tags.py:54 +#: extensions/amavis/templatetags/amavis_tags.py:24 +#: extensions/amavis/templatetags/amavis_tags.py:79 msgid "Release" msgstr "Rilascia" #: extensions/amavis/templates/amavis/main_action_bar.html:23 -#: extensions/amavis/templatetags/amavis_tags.py:25 -#: extensions/amavis/templatetags/amavis_tags.py:61 +#: extensions/amavis/templatetags/amavis_tags.py:30 +#: extensions/amavis/templatetags/amavis_tags.py:86 #: extensions/webmail/templatetags/webmail_tags.py:32 msgid "Delete" msgstr "Elimina" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templatetags/amavis_tags.py:44 +#, fuzzy +msgid "Mark as spam" +msgstr "Contrassegna i messaggi" + +#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templatetags/amavis_tags.py:49 +msgid "Mark as non-spam" +msgstr "" + +#: extensions/amavis/templates/amavis/main_action_bar.html:42 #: extensions/sievefilters/forms.py:64 msgid "All messages" msgstr "Tutti i messaggi" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:42 msgid "All" msgstr "Tutti" -#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templates/amavis/main_action_bar.html:43 msgid "Spam only" msgstr "Solo messaggi di spam" -#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templates/amavis/main_action_bar.html:44 msgid "Virus only" msgstr "Solo messaggi con virus" -#: extensions/amavis/templates/amavis/main_action_bar.html:34 +#: extensions/amavis/templates/amavis/main_action_bar.html:45 msgid "Bad Header only" msgstr "Solo messaggi con intestazione errata" -#: extensions/amavis/templates/amavis/main_action_bar.html:35 +#: extensions/amavis/templates/amavis/main_action_bar.html:46 msgid "Bad MIME only" msgstr "Solo messaggi con struttura MIME errata" -#: extensions/amavis/templates/amavis/main_action_bar.html:36 +#: extensions/amavis/templates/amavis/main_action_bar.html:47 msgid "Banned only" msgstr "Solo messaggi banditi" @@ -1827,7 +1913,7 @@ msgstr "Agisci su questo messaggio:" msgid "Please visit %(listingurl)s for a full listing." msgstr "Per un elenco completo prova a visitare %(listingurl)s" -#: extensions/amavis/templatetags/amavis_tags.py:28 +#: extensions/amavis/templatetags/amavis_tags.py:35 msgid "View full headers" msgstr "Visualizza tutte le intestazioni" @@ -2271,7 +2357,7 @@ msgstr "Mittente" msgid "Recipient" msgstr "Destinatario" -#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:83 +#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:84 msgid "Cc" msgstr "Cc" @@ -2528,19 +2614,19 @@ msgstr "Impostazione grafica sconosciuta" msgid "Bad custom period" msgstr "Periodo personalizzato sbagliato" -#: extensions/stats/templates/stats/index.html:33 +#: extensions/stats/templates/stats/index.html:28 msgid "Search a domain" msgstr "Ricerca un dominio" -#: extensions/stats/templates/stats/index.html:37 +#: extensions/stats/templates/stats/index.html:32 msgid "Predefined time ranges" msgstr "Intervalli di tempo predefiniti" -#: extensions/stats/templates/stats/index.html:44 +#: extensions/stats/templates/stats/index.html:39 msgid "Custom time range" msgstr "Intervallo di tempo personalizzato" -#: extensions/stats/templates/stats/index.html:57 +#: extensions/stats/templates/stats/index.html:52 msgid "Apply" msgstr "Applica" @@ -2698,7 +2784,7 @@ msgstr "Risposta del server" msgid "Unknown action" msgstr "Azione sconosciuta" -#: extensions/webmail/forms.py:84 +#: extensions/webmail/forms.py:85 msgid "Cci" msgstr "Cci" @@ -2905,15 +2991,15 @@ msgstr "No" msgid "Failed to update password: %s" msgstr "Aggiornamento della password fallito: %s" -#: lib/permissions.py:20 +#: lib/permissions.py:19 msgid "Simple user" msgstr "Utente semplice" -#: lib/permissions.py:22 +#: lib/permissions.py:21 msgid "Super administrator" msgstr "Super amministratore" -#: lib/permissions.py:28 +#: lib/permissions.py:27 msgid "Domain administrator" msgstr "Amministratore di domini" diff --git a/modoboa/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/locale/nl_NL/LC_MESSAGES/django.po index 036589bf0..c682bffd7 100644 --- a/modoboa/locale/nl_NL/LC_MESSAGES/django.po +++ b/modoboa/locale/nl_NL/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: # Andrew , 2014 # TuxBrother , 2014 @@ -9,19 +9,20 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:29+0200\n" +"POT-Creation-Date: 2014-10-29 13:25+0100\n" "PO-Revision-Date: 2014-09-13 11:49+0000\n" "Last-Translator: Andrew \n" -"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/modoboa/language/nl_NL/)\n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" +"modoboa/language/nl_NL/)\n" +"Language: nl_NL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: nl_NL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: core/__init__.py:52 core/__init__.py:53 -#: extensions/admin/forms/account.py:326 extensions/admin/forms/domain.py:256 -#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:129 +#: extensions/admin/forms/account.py:327 extensions/admin/forms/domain.py:248 +#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:133 #: extensions/postfix_autoreply/app_settings.py:11 #: extensions/postfix_relay_domains/forms.py:138 #: extensions/sievefilters/app_settings.py:50 @@ -81,7 +82,9 @@ msgstr "Rondes" msgid "" "Number of rounds to use (only used by sha256crypt and sha512crypt). Must be " "between 1000 and 999999999, inclusive." -msgstr "Nummer van te gebruiken randomizeringsrondes (alleen bij sha256crypt en sha512crypt). Moet tussen de 1000 en 999999999 liggen." +msgstr "" +"Nummer van te gebruiken randomizeringsrondes (alleen bij sha256crypt en " +"sha512crypt). Moet tussen de 1000 en 999999999 liggen." #: core/app_settings.py:73 msgid "Secret key" @@ -145,7 +148,9 @@ msgstr "Koppeling DN" msgid "" "The distinguished name to use when binding to the LDAP server. Leave empty " "for an anonymous bind" -msgstr "De gedistingeerde naam om te gebruiken bij het koppeling met de LDAP server. Laat leeg voor een anonieme koppeling." +msgstr "" +"De gedistingeerde naam om te gebruiken bij het koppeling met de LDAP server. " +"Laat leeg voor een anonieme koppeling." #: core/app_settings.py:121 msgid "Bind password" @@ -153,7 +158,9 @@ msgstr "Koppel wachtwoord" #: core/app_settings.py:124 msgid "The password to use when binding to the LDAP server (with 'Bind DN')" -msgstr "Het wachtwoord om te gebruiken tijdens het koppelen met de LDAP server (met 'koppel DN')" +msgstr "" +"Het wachtwoord om te gebruiken tijdens het koppelen met de LDAP server (met " +"'koppel DN')" #: core/app_settings.py:132 msgid "Users search base" @@ -171,7 +178,9 @@ msgstr "Zoek filter" msgid "" "An optional filter string (e.g. '(objectClass=person)'). In order to be " "valid, it must be enclosed in parentheses." -msgstr "Een optionele filter string (zoals '(objectClass=person)'). Om geldig te kunnen zijn, moet het ingesloten zijn tussen haakjes." +msgstr "" +"Een optionele filter string (zoals '(objectClass=person)'). Om geldig te " +"kunnen zijn, moet het ingesloten zijn tussen haakjes." #: core/app_settings.py:151 msgid "User DN template" @@ -182,7 +191,9 @@ msgstr "Gebruiker DN template" msgid "" "The template used to construct a user's DN. It should contain one " "placeholder (ie. %(user)s)" -msgstr "Het template dat gebruikt word om een gebruiker zijn/haar DN op te bouwen. Het moet een placeholder bevatten (bijvoorbeeld. %(user)s)" +msgstr "" +"Het template dat gebruikt word om een gebruiker zijn/haar DN op te bouwen. " +"Het moet een placeholder bevatten (bijvoorbeeld. %(user)s)" #: core/app_settings.py:161 msgid "Password attribute" @@ -206,9 +217,11 @@ msgstr "Administrator groepen" #: core/app_settings.py:177 msgid "" -"Members of those LDAP Posix groups will be created as domain administrators." -" Use ';' characters to separate groups." -msgstr "Leden van deze LDAP POSIX groepen zullen aangemaakt worden als domein administrators. Gebruik ';' karakters om groepen te scheiden." +"Members of those LDAP Posix groups will be created as domain administrators. " +"Use ';' characters to separate groups." +msgstr "" +"Leden van deze LDAP POSIX groepen zullen aangemaakt worden als domein " +"administrators. Gebruik ';' karakters om groepen te scheiden." #: core/app_settings.py:184 msgid "Groups search base" @@ -226,7 +239,9 @@ msgstr "Domein/mailbox creatie" msgid "" "Automatically create a domain and a mailbox when a new user is created just " "after the first successful authentication." -msgstr "Maak automatisch een domein en een mailbox wanneer een nieuwe gebruiker wordt aangemaakt vlak na de eerste succesvolle authenticatie." +msgstr "" +"Maak automatisch een domein en een mailbox wanneer een nieuwe gebruiker " +"wordt aangemaakt vlak na de eerste succesvolle authenticatie." #: core/app_settings.py:201 #: extensions/admin/templates/admin/editdomainform.html:7 @@ -255,7 +270,9 @@ msgstr "Standaard top omleiding" #: core/app_settings.py:220 msgid "The default redirection used when no application is specified" -msgstr "De standaard omleiding die gebruikt word als er geen andere applicatie is opgegeven" +msgstr "" +"De standaard omleiding die gebruikt word als er geen andere applicatie is " +"opgegeven" #: core/app_settings.py:249 msgid "Key must be either 16, 24, or 32 bytes long" @@ -273,8 +290,8 @@ msgstr "Ongeldig nummer van rondes" msgid "This field is required" msgstr "Dit veld is benodigd" -#: core/app_settings.py:349 extensions/amavis/app_settings.py:87 -#: extensions/amavis/templates/amavis/main_action_bar.html:29 +#: core/app_settings.py:349 extensions/amavis/app_settings.py:149 +#: extensions/amavis/templates/amavis/main_action_bar.html:40 #: extensions/webmail/app_settings.py:73 msgid "Display" msgstr "Weergeven" @@ -328,36 +345,36 @@ msgstr "laatste login" msgid "You can't delete your own account" msgstr "U kunt uw eigen account niet verwijderen" -#: core/models.py:117 +#: core/models.py:130 msgid "Failed to update password: LDAP module not installed" msgstr "Mislukt om wachtwoord aan te passen: LDAP module niet geinstalleerd" -#: core/models.py:170 +#: core/models.py:183 msgid "account" msgstr "account" -#: core/models.py:321 extensions/admin/models/domain.py:144 +#: core/models.py:334 extensions/admin/models/domain.py:144 #: extensions/admin/models/domain_alias.py:39 #: extensions/postfix_relay_domains/models.py:134 #: extensions/postfix_relay_domains/models.py:190 msgid "Invalid line" msgstr "Verkeerde regel" -#: core/models.py:325 +#: core/models.py:338 msgid "You can't import an account with a role greater than yours" msgstr "U kunt geen accounts importeren met hogere rechten dan die van uzelf." -#: core/models.py:337 +#: core/models.py:350 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "De gebruiker '%s' moet een geldig email adres hebben" -#: core/models.py:341 +#: core/models.py:354 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "gebruikersnaam en email velden moeten niet verschillen van '%s'" -#: core/models.py:410 extensions/admin/models/alias.py:35 +#: core/models.py:423 extensions/admin/models/alias.py:35 #: extensions/admin/models/domain.py:32 #: extensions/admin/models/domain_alias.py:17 #: extensions/postfix_autoreply/models.py:28 @@ -366,29 +383,29 @@ msgstr "gebruikersnaam en email velden moeten niet verschillen van '%s'" msgid "enabled" msgstr "actief" -#: core/models.py:411 +#: core/models.py:424 msgid "Check to enable this extension" msgstr "Aanvinken om deze extensie te activeren" -#: core/models.py:491 +#: core/models.py:504 msgid "added" msgstr "toegevoegd" -#: core/models.py:494 +#: core/models.py:507 msgid "modified" msgstr "veranderd" -#: core/models.py:496 core/models.py:521 +#: core/models.py:509 core/models.py:534 #, python-format msgid "%(object)s '%(name)s' %(action)s by user %(user)s" msgstr "%(object)s '%(name)s' %(action)s door gebruiker %(user)s" -#: core/models.py:523 +#: core/models.py:536 msgid "deleted" msgstr "verwijderd" #: core/tables.py:8 core/templates/core/information.html:8 -#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:187 +#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:179 #: extensions/admin/templates/admin/domains_table.html:5 #: extensions/admin/templates/admin/editdomainform.html:13 #: extensions/admin/templates/admin/identities_table.html:5 @@ -504,7 +521,7 @@ msgstr "Persoonlijke informatie aanpassen" #: core/templates/core/user_profile.html:8 #: extensions/admin/templates/admin/forward.html:8 #: extensions/admin/views/alias.py:112 extensions/admin/views/domain.py:168 -#: extensions/admin/views/identity.py:200 +#: extensions/admin/views/identity.py:204 #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9 #: extensions/postfix_relay_domains/views.py:66 #: extensions/sievefilters/views.py:166 extensions/webmail/views.py:172 @@ -535,7 +552,9 @@ msgstr "Gebruiker '%s' successvol aangemeld" #: core/views/auth.py:43 msgid "Your username and password didn't match. Please try again." -msgstr "Uw gebruikersnaam en wachtwoord komen niet overeen. Probeer het alstublief opnieuw." +msgstr "" +"Uw gebruikersnaam en wachtwoord komen niet overeen. Probeer het alstublief " +"opnieuw." #: core/views/auth.py:69 #, python-format @@ -571,15 +590,32 @@ msgid "" "\n" "

    Welcome to the online demo!

    \n" "

    Warning: the demo's concent is resetted every two hours.

    \n" -"

    To try the demo, the following users are available (username/password):

    \n" +"

    To try the demo, the following users are available (username/password):

    \n" "
      \n" "
    • A super administrator : admin/password
    • \n" "
    • A domain administrator : admin@demo.local/admin
    • \n" "
    • A simple user : user@demo.local/user
    • \n" "
    \n" "

    Please report any issue or give any suggestion to \n" -" the mailing list.

    \n" -msgstr "\n

    Welkom in de online demo!

    \n

    Waarschuwing: de content van de demo word elke 2 uur gewist.

    \n

    Om de demo te proberen, zijn de volgende gebruikers beschikbaar (gebruikersnaam/wachtwoord):

    \n
      \n
    • De hoofdbeheerder : admin/password
    • \n
    • De domein administrator : admin@demo.local/admin
    • \n
    • Een gewone gebruiker : user@demo.local/user
    • \n
    \n

    Aarzel niet om problemen of suggesties door te geven aan \nde maillijst.

    \n

    Fouten gevonden in de Nederlandse vertaling? Geef uw opmerkingen of suggesties door aan: foss at waut punt nl

    \n" +" the " +"mailing list.

    \n" +msgstr "" +"\n" +"

    Welkom in de online demo!

    \n" +"

    Waarschuwing: de content van de demo word elke 2 uur gewist.

    \n" +"

    Om de demo te proberen, zijn de volgende gebruikers beschikbaar " +"(gebruikersnaam/wachtwoord):

    \n" +"
      \n" +"
    • De hoofdbeheerder : admin/password
    • \n" +"
    • De domein administrator : admin@demo.local/admin
    • \n" +"
    • Een gewone gebruiker : user@demo.local/user
    • \n" +"
    \n" +"

    Aarzel niet om problemen of suggesties door te geven aan \n" +"de " +"maillijst.

    \n" +"

    Fouten gevonden in de Nederlandse vertaling? Geef uw opmerkingen of " +"suggesties door aan: foss at waut punt nl

    \n" #: extensions/admin/__init__.py:48 msgid "Administration console" @@ -615,7 +651,7 @@ msgstr "Doorsturen" msgid "Account import failed (%s): domain does not exist" msgstr "Accounts importeren mislukt (%s): domein bestaat niet" -#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:196 +#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:197 #, python-format msgid "Mailbox %s already exists" msgstr "Mailbox %s bestaat al" @@ -625,6 +661,12 @@ msgstr "Mailbox %s bestaat al" msgid "Account import failed (%s): wrong quota value" msgstr "Account import is mislukt (%s): verkeerd quotum waarde" +#: extensions/admin/__init__.py:212 extensions/admin/forms/domain.py:75 +#: extensions/postfix_relay_domains/forms.py:50 +#: extensions/postfix_relay_domains/forms.py:70 +msgid "domain alias" +msgstr "domein alias" + #: extensions/admin/app_settings.py:13 #: extensions/admin/templates/admin/editdomainform.html:25 #: extensions/limits/app_settings.py:31 extensions/limits/models.py:23 @@ -641,7 +683,9 @@ msgstr "Pas mailboxen op het bestandssysteem aan" msgid "" "Rename or remove mailboxes on the filesystem when they get renamed or " "removed within Modoboa" -msgstr "Hernoem of verwijder mailboxen op het bestandssysteem wanner ze hernoemd of verwijderd worden in Modoboa." +msgstr "" +"Hernoem of verwijder mailboxen op het bestandssysteem wanner ze hernoemd of " +"verwijderd worden in Modoboa." #: extensions/admin/app_settings.py:22 msgid "Mailboxes ower" @@ -649,7 +693,8 @@ msgstr "Eigenaar van mailboxen" #: extensions/admin/app_settings.py:24 msgid "The UNIX account who owns mailboxes on the filesystem" -msgstr "De UNIX account die de rechten heeft tot de mailboxen op het bestandssysteem" +msgstr "" +"De UNIX account die de rechten heeft tot de mailboxen op het bestandssysteem" #: extensions/admin/app_settings.py:28 msgid "Default domain quota" @@ -659,7 +704,9 @@ msgstr "Standaard domein quota" msgid "" "Default quota (in MB) applied to freshly created domains with no value " "specified. 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." +msgstr "" +"Standaard quota (in MB) om op nieuw aangemaakte domeinen zonder waarde toe " +"te passen. Een waarde van 0 betekend geen quota." #: extensions/admin/app_settings.py:38 msgid "Automatic account removal" @@ -667,10 +714,11 @@ msgstr "Automatish een account verwijderen" #: extensions/admin/app_settings.py:40 msgid "When a mailbox is removed, also remove the associated account" -msgstr "Als een mailbox word verwijderd, verwijder dan ook de bijbehorende account" +msgstr "" +"Als een mailbox word verwijderd, verwijder dan ook de bijbehorende account" #: extensions/admin/app_settings.py:81 extensions/admin/forms/account.py:178 -#: extensions/admin/forms/domain.py:56 +#: extensions/admin/forms/domain.py:57 msgid "Must be a positive integer" msgstr "Dit moet een positive integer zijn." @@ -682,7 +730,9 @@ msgstr "Een mailbox is benodigd" msgid "" "The user's name. Must be a valid e-mail address for simple users or " "administrators with a mailbox." -msgstr "De naam van de gebruiker. Moet een geldig e-mail adres zijn voor gebruikers of administrators met een mailbox." +msgstr "" +"De naam van de gebruiker. Moet een geldig e-mail adres zijn voor gebruikers " +"of administrators met een mailbox." #: extensions/admin/forms/account.py:26 msgid "Role" @@ -716,7 +766,7 @@ msgstr "U kunt uw eigen account niet uitschakelen" msgid "E-mail" msgstr "E-mail" -#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:17 +#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:18 msgid "Quota" msgstr "Quota" @@ -725,9 +775,12 @@ msgid "" "Quota in MB for this mailbox. Define a custom value or use domain's default " "one. Leave empty to define an unlimited value (not allowed for domain " "administrators)." -msgstr "Quota in MB voor deze mailbox. Geef een aangepaste waarde of gebruik de stanaard waarde van het domein. Laat leeg om een ongelimiteerde waarde te definieren (niet toegestaan voor domein administrators)." +msgstr "" +"Quota in MB voor deze mailbox. Geef een aangepaste waarde of gebruik de " +"stanaard waarde van het domein. Laat leeg om een ongelimiteerde waarde te " +"definieren (niet toegestaan voor domein administrators)." -#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:26 +#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:27 #: extensions/admin/templates/admin/domains_table.html:6 #: extensions/postfix_relay_domains/forms.py:12 msgid "Alias(es)" @@ -738,27 +791,30 @@ msgid "" "Alias(es) of this mailbox. Indicate only one address per input, press ENTER " "to add a new input. Use the '*' character to create a 'catchall' alias (ex: " "*@domain.tld)." -msgstr "Alias(en) van deze mailbox. Geef slechts een adres per regel op, en toets ENTER om een nieuwe regel te krijgen. Gebruik een wildcard '*' om een 'catch-all' adres te maken (bijvoorbeeld: *@domein.tld)." +msgstr "" +"Alias(en) van deze mailbox. Geef slechts een adres per regel op, en toets " +"ENTER om een nieuwe regel te krijgen. Gebruik een wildcard '*' om een 'catch-" +"all' adres te maken (bijvoorbeeld: *@domein.tld)." -#: extensions/admin/forms/account.py:187 extensions/admin/forms/account.py:217 +#: extensions/admin/forms/account.py:188 extensions/admin/forms/account.py:218 #: extensions/admin/forms/alias.py:65 msgid "Domain does not exist" msgstr "Domein bestaat niet" -#: extensions/admin/forms/account.py:284 +#: extensions/admin/forms/account.py:285 msgid "Domain(s)" msgstr "Domein(en)" -#: extensions/admin/forms/account.py:286 +#: extensions/admin/forms/account.py:287 msgid "Domain(s) that user administrates" msgstr "Domein(en) die gebruiker mag beheren" -#: extensions/admin/forms/account.py:328 -#: extensions/admin/views/identity.py:132 +#: extensions/admin/forms/account.py:329 +#: extensions/admin/views/identity.py:136 msgid "Mail" msgstr "Mail" -#: extensions/admin/forms/account.py:330 +#: extensions/admin/forms/account.py:331 msgid "Permissions" msgstr "Rechten" @@ -770,7 +826,9 @@ msgstr "Email adres" msgid "" "The distribution list address. Use the '*' character to create a 'catchall' " "address (ex: *@domain.tld)." -msgstr "Het adres van de distributielijst . Gebruik een wildcard '*' om een 'catch-all' adres te maken (bijvoorbeeld: *@domein.tld)" +msgstr "" +"Het adres van de distributielijst . Gebruik een wildcard '*' om een 'catch-" +"all' adres te maken (bijvoorbeeld: *@domein.tld)" #: extensions/admin/forms/alias.py:23 msgid "Recipients" @@ -780,7 +838,9 @@ msgstr "Ontvangers" msgid "" "Mailbox(es) this alias will point to. Indicate only one address per input, " "press ENTER to add a new input." -msgstr "Mailbox(en) waarnaar deze alias zal verwijzen. Geef slechts een adres per regel op, en toets ENTER om een nieuwe regel te krijgen." +msgstr "" +"Mailbox(en) waarnaar deze alias zal verwijzen. Geef slechts een adres per " +"regel op, en toets ENTER om een nieuwe regel te krijgen." #: extensions/admin/forms/alias.py:68 msgid "You don't have access to this domain" @@ -804,64 +864,63 @@ msgstr "Ontvanger %s is al aanwezig" msgid "No recipient defined" msgstr "Geen ontvanger opgegeven" -#: extensions/admin/forms/domain.py:20 +#: extensions/admin/forms/domain.py:21 msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." -msgstr "Standaard quota in MB toegepast op mailboxen. Laat leeg om de standaard waarde te gebruiken." +msgstr "" +"Standaard quota in MB toegepast op mailboxen. Laat leeg om de standaard " +"waarde te gebruiken." -#: extensions/admin/forms/domain.py:29 +#: extensions/admin/forms/domain.py:30 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." -msgstr "Alias(sen) van dit domein. Geef slechts een adres per regel op, en toets ENTER om een nieuwe regel te krijgen." +msgstr "" +"Alias(sen) van dit domein. Geef slechts een adres per regel op, en toets " +"ENTER om een nieuwe regel te krijgen." -#: extensions/admin/forms/domain.py:75 -#: extensions/postfix_relay_domains/forms.py:50 -#: extensions/postfix_relay_domains/forms.py:70 -msgid "domain alias" -msgstr "domein alias" - -#: extensions/admin/forms/domain.py:82 extensions/admin/forms/domain.py:98 +#: extensions/admin/forms/domain.py:78 extensions/admin/forms/domain.py:92 #: extensions/postfix_relay_domains/forms.py:58 #: extensions/postfix_relay_domains/forms.py:78 #, python-format msgid "A %s with this name already exists" msgstr "Een %s met deze naam bestaat al" -#: extensions/admin/forms/domain.py:92 +#: extensions/admin/forms/domain.py:89 #: extensions/postfix_relay_domains/forms.py:49 #: extensions/postfix_relay_domains/forms.py:71 msgid "domain" msgstr "domein" -#: extensions/admin/forms/domain.py:181 +#: extensions/admin/forms/domain.py:173 msgid "Create a domain administrator" msgstr "Maak een domein administrator aan" -#: extensions/admin/forms/domain.py:183 +#: extensions/admin/forms/domain.py:175 msgid "Automatically create an administrator for this domain" msgstr "Automatisch een administrator aanmaken voor dit domein" -#: extensions/admin/forms/domain.py:190 +#: extensions/admin/forms/domain.py:182 msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." -msgstr "De naam van de administrator. De domeinnaam word automatisch toegevoegd." +msgstr "" +"De naam van de administrator. De domeinnaam word automatisch toegevoegd." -#: extensions/admin/forms/domain.py:198 +#: extensions/admin/forms/domain.py:190 msgid "Create aliases" msgstr "Aliassen aanmaken" -#: extensions/admin/forms/domain.py:200 +#: extensions/admin/forms/domain.py:192 msgid "Automatically create standard aliases for this domain" msgstr "Automatisch een standaard alias voor dit domein aanmaken" -#: extensions/admin/forms/domain.py:216 +#: extensions/admin/forms/domain.py:208 msgid "Invalid format" msgstr "Verkeerd formaat" -#: extensions/admin/forms/domain.py:230 +#: extensions/admin/forms/domain.py:222 #, python-format msgid "User '%s' already exists" msgstr "Gebruiker '%s' bestaat al" @@ -894,9 +953,11 @@ msgstr "Stuur berichten door en sla een kopie op in uw mailbox" msgid "" "You can't define a forward to a local destination. Please ask your " "administrator to create an alias instead." -msgstr "U kunt mail niet doorsturen naar een lokaal adres. Vraag uw systeembeheerder om een alias voor u aan te maken." +msgstr "" +"U kunt mail niet doorsturen naar een lokaal adres. Vraag uw systeembeheerder " +"om een alias voor u aan te maken." -#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:198 +#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:200 msgid "Select a file" msgstr "Bestand selecteren" @@ -914,17 +975,20 @@ msgstr "Versleutel wachtwoorden" #: extensions/admin/forms/import_.py:28 msgid "Check this option if passwords contained in your file are not crypted" -msgstr "Vink deze optie aan als wachtwoorden in uw bestand niet versleuteld zijn" +msgstr "" +"Vink deze optie aan als wachtwoorden in uw bestand niet versleuteld zijn" -#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:62 +#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:74 msgid "address" msgstr "adres" #: extensions/admin/models/alias.py:20 msgid "" -"The alias address (without the domain part). For a 'catch-all' address, just" -" enter an * character." -msgstr "Het alias adres (zonder het domein deel). Voor een 'catch-all' adres, vul een * in." +"The alias address (without the domain part). For a 'catch-all' address, just " +"enter an * character." +msgstr "" +"Het alias adres (zonder het domein deel). Voor een 'catch-all' adres, vul " +"een * in." #: extensions/admin/models/alias.py:26 msgid "mailboxes" @@ -1012,21 +1076,21 @@ msgstr "De domein alias verwijst naar" msgid "Unknown domain %s" msgstr "Onbekend domein %s" -#: extensions/admin/models/mailbox.py:63 +#: extensions/admin/models/mailbox.py:75 msgid "Mailbox address (without the @domain.tld part)" msgstr "Mailbox adres (zonder het @domein.naam deel)" -#: extensions/admin/models/mailbox.py:125 +#: extensions/admin/models/mailbox.py:136 #, python-format msgid "Failed to retrieve mailbox location (%s)" msgstr "Mislukt om de mailbox locatie te verkijgen (%s)" -#: extensions/admin/models/mailbox.py:194 +#: extensions/admin/models/mailbox.py:221 #, python-format msgid "Quota is greater than the allowed domain's limit (%dM)" msgstr "Quota is groter dan de maximaal toegestane domein limiet (%dM)" -#: extensions/admin/models/mailbox.py:199 +#: extensions/admin/models/mailbox.py:227 msgid "A quota is required" msgstr "Een quota is vereist" @@ -1098,7 +1162,7 @@ msgid "Importing..." msgstr "Importeren..." #: extensions/admin/templates/admin/listing.html:14 -#: extensions/stats/templates/stats/index.html:28 +#: extensions/stats/templates/stats/index.html:23 msgid "Filter" msgstr "Filter" @@ -1200,8 +1264,8 @@ msgid "Alias with this name already exists" msgstr "Een alias met deze naam bestaat al" #: extensions/admin/views/alias.py:50 extensions/admin/views/domain.py:102 -#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:133 -#: extensions/admin/views/identity.py:160 +#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:137 +#: extensions/admin/views/identity.py:164 #: extensions/postfix_relay_domains/views.py:34 #: extensions/sievefilters/views.py:144 extensions/sievefilters/views.py:233 #: extensions/webmail/views.py:153 @@ -1244,7 +1308,7 @@ msgstr "Doorstuurregel aangepast" msgid "Alias modified" msgstr "Alias aangepast" -#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:130 +#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:134 msgid "Next" msgstr "Volgende" @@ -1252,7 +1316,7 @@ msgstr "Volgende" msgid "Options" msgstr "Opties" -#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:134 +#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:138 msgid "Previous" msgstr "Vorige" @@ -1286,11 +1350,11 @@ msgstr "Identiteiten exporteren" msgid "Export domains" msgstr "Exporteer domeinen" -#: extensions/admin/views/identity.py:104 -#: extensions/admin/views/identity.py:227 -#: extensions/admin/views/identity.py:232 extensions/amavis/views.py:144 -#: extensions/amavis/views.py:148 extensions/amavis/views.py:181 -#: extensions/amavis/views.py:186 extensions/amavis/views.py:188 +#: extensions/admin/views/identity.py:108 +#: extensions/admin/views/identity.py:231 +#: extensions/admin/views/identity.py:236 extensions/amavis/views.py:147 +#: extensions/amavis/views.py:151 extensions/amavis/views.py:184 +#: extensions/amavis/views.py:189 extensions/amavis/views.py:191 #: extensions/webmail/views.py:49 extensions/webmail/views.py:67 #: extensions/webmail/views.py:81 extensions/webmail/views.py:99 #: extensions/webmail/views.py:116 extensions/webmail/views.py:202 @@ -1301,19 +1365,19 @@ msgstr "Exporteer domeinen" msgid "Invalid request" msgstr "Ongeldig verzoek" -#: extensions/admin/views/identity.py:151 +#: extensions/admin/views/identity.py:155 msgid "Account created" msgstr "Account aangemaakt" -#: extensions/admin/views/identity.py:157 +#: extensions/admin/views/identity.py:161 msgid "New account" msgstr "Nieuwe account" -#: extensions/admin/views/identity.py:193 +#: extensions/admin/views/identity.py:197 msgid "Account updated" msgstr "Account aangepast" -#: extensions/admin/views/identity.py:217 +#: extensions/admin/views/identity.py:221 msgid "Account deleted" msgid_plural "Accounts deleted" msgstr[0] "Account verwijderd" @@ -1328,9 +1392,23 @@ msgid "" "
  • domainalias; name; targeted domain; enabled
  • \n" " %s\n" "\n" -"

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

    \n" +"

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

    \n" "

    You can use a different character as separator.

    \n" -msgstr "Lever een CSV bestand en zorg dat de regels voldoen aan een van de volgende formaten:\n
      \n
    • domain; name; quota; enabled
    • \n
    • domainalias; name; targeted domain; enabled
    • \n%s\n
    \n

    Het eerste element van elke regel is verplicht en moet gelijk zijn aan een van de vorige waarden.

    \n

    U kunt een eigen scheidingsteken gebruiken.

    \n

    Let op! Zorg dat het 'line-encoding format' Unix is - anders gaat het importeren mis

    \n\n" +msgstr "" +"Lever een CSV bestand en zorg dat de regels voldoen aan een van de volgende " +"formaten:\n" +"
      \n" +"
    • domain; name; quota; enabled
    • \n" +"
    • domainalias; name; targeted domain; enabled
    • \n" +"%s\n" +"
    \n" +"

    Het eerste element van elke regel is verplicht en moet gelijk zijn aan " +"een van de vorige waarden.

    \n" +"

    U kunt een eigen scheidingsteken gebruiken.

    \n" +"

    Let op! Zorg dat het 'line-encoding format' Unix is - anders gaat het " +"importeren mis

    \n" +"\n" #: extensions/admin/views/import.py:51 msgid "Import domains" @@ -1350,15 +1428,31 @@ msgstr "%d objecten successvol geimporteerd" msgid "" "Provide a CSV file where lines respect one of the following formats:\n" "
      \n" -"
    • account; loginname; password; first name; last name; enabled; group; address; quota; [, domain, ...]
    • \n" +"
    • account; loginname; password; first name; last name; enabled; group; " +"address; quota; [, domain, ...]
    • \n" "
    • alias; address; enabled; internal recipient
    • \n" "
    • forward; address; enabled; external recipient
    • \n" "
    • dlist; address; enabled; recipient; recipient; ...
    • \n" "
    \n" -"

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

    \n" +"

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

    \n" "\n" "

    You can use a different character as separator.

    \n" -msgstr "Lever een CSV bestand en zorg dat de regels voldoen aan een van de volgende formaten:\n
      \n
    • account; loginname; password; first name; last name; enabled; group; address; quota; [, domain, ...]
    • \n
    • alias; address; enabled; internal recipient
    • \n
    • forward; address; enabled; external recipient
    • \n
    • dlist; address; enabled; recipient; recipient; ...
    • \n
    \n

    Het eerste element van elke regel is verplicht en moet gelijk zijn aan een van de vorige waarden.

    \n

    U kunt een eigen scheidingsteken gebruiken.

    \n

    Let op! Zorg dat het 'line-encoding format' Unix is - anders gaat het importeren mis

    \n" +msgstr "" +"Lever een CSV bestand en zorg dat de regels voldoen aan een van de volgende " +"formaten:\n" +"
      \n" +"
    • account; loginname; password; first name; last name; enabled; group; " +"address; quota; [, domain, ...]
    • \n" +"
    • alias; address; enabled; internal recipient
    • \n" +"
    • forward; address; enabled; external recipient
    • \n" +"
    • dlist; address; enabled; recipient; recipient; ...
    • \n" +"
    \n" +"

    Het eerste element van elke regel is verplicht en moet gelijk zijn aan " +"een van de vorige waarden.

    \n" +"

    U kunt een eigen scheidingsteken gebruiken.

    \n" +"

    Let op! Zorg dat het 'line-encoding format' Unix is - anders gaat het " +"importeren mis

    \n" #: extensions/admin/views/import.py:167 msgid "Import identities" @@ -1372,7 +1466,7 @@ msgstr "Doorstuuradres aangepast" msgid "Simple amavis management frontend" msgstr "Gemakkelijke amavis beheertool" -#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:18 +#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:20 msgid "Quarantine" msgstr "Quarantaine" @@ -1386,7 +1480,9 @@ msgstr "Maximum bericht bewaartijd" #: extensions/amavis/app_settings.py:16 msgid "Quarantine messages maximum age (in days) before deletion" -msgstr "Maximum bewaartijd quarantaine berichten (in dagen) voordat ze verwijderd worden" +msgstr "" +"Maximum bewaartijd quarantaine berichten (in dagen) voordat ze verwijderd " +"worden" #: extensions/amavis/app_settings.py:19 msgid "Messages releasing" @@ -1398,7 +1494,9 @@ msgstr "Verwijderde vrijgegeven berichten" #: extensions/amavis/app_settings.py:24 msgid "Remove messages marked as released while cleaning up the database" -msgstr "Verwijder berichten gemarkeerd als vrijgegeven tijdens het opruimen van de database" +msgstr "" +"Verwijder berichten gemarkeerd als vrijgegeven tijdens het opruimen van de " +"database" #: extensions/amavis/app_settings.py:28 msgid "Amavis connection mode" @@ -1430,7 +1528,8 @@ msgstr "PDP server socket" #: extensions/amavis/app_settings.py:50 msgid "Path to the PDP server socket (if unix mode)" -msgstr "Locatie naar de PDP server socket (indien unix socket mode gebruikt word)" +msgstr "" +"Locatie naar de PDP server socket (indien unix socket mode gebruikt word)" #: extensions/amavis/app_settings.py:54 msgid "Check requests interval" @@ -1464,27 +1563,95 @@ msgstr "Afzender van notificaties" msgid "The e-mail address used to send notitications" msgstr "E-mail adres dat gebruikt word om notificaties te versturen" -#: extensions/amavis/app_settings.py:91 extensions/webmail/app_settings.py:91 +#: extensions/amavis/app_settings.py:77 +#: extensions/amavis/templates/amavis/main_action_bar.html:27 +msgid "Manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:80 +msgid "Enable manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:83 +msgid "Allow super administrators to manually train Spamassassin" +msgstr "" + +#: extensions/amavis/app_settings.py:88 +msgid "Is Spamassassin local?" +msgstr "" + +#: extensions/amavis/app_settings.py:91 +msgid "Tell if Spamassassin is running on the same server than modoboa" +msgstr "" + +#: extensions/amavis/app_settings.py:96 +#, fuzzy +msgid "Default user" +msgstr "Standaard editor" + +#: extensions/amavis/app_settings.py:99 +msgid "Name of the user owning the default bayesian database" +msgstr "" + +#: extensions/amavis/app_settings.py:104 +#, fuzzy +msgid "Spamd address" +msgstr "Van adres" + +#: extensions/amavis/app_settings.py:106 +msgid "The IP address where spamd can be reached" +msgstr "" + +#: extensions/amavis/app_settings.py:110 +#, fuzzy +msgid "Spamd port" +msgstr "Alleen spam" + +#: extensions/amavis/app_settings.py:112 +msgid "The TCP port spamd is listening on" +msgstr "" + +#: extensions/amavis/app_settings.py:116 +msgid "Enable per-domain manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:119 +msgid "" +"Allow domain administrators to train Spamassassin (within dedicated per-" +"domain databases)" +msgstr "" + +#: extensions/amavis/app_settings.py:125 +msgid "Enable per-user manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:128 +msgid "" +"Allow simple users to personally train Spamassassin (within a dedicated " +"database)" +msgstr "" + +#: extensions/amavis/app_settings.py:153 extensions/webmail/app_settings.py:91 msgid "Number of displayed emails per page" msgstr "Aantal weergegeven emails per pagina" -#: extensions/amavis/app_settings.py:92 +#: extensions/amavis/app_settings.py:154 msgid "Set the maximum number of messages displayed in a page" msgstr "Stelt het maximum aantal weergegeven berichten per pagina in" -#: extensions/amavis/general_callbacks.py:82 +#: extensions/amavis/general_callbacks.py:136 msgid "pending requests" msgstr "openstaande verzoeken" -#: extensions/amavis/general_callbacks.py:125 +#: extensions/amavis/general_callbacks.py:179 msgid "Pending requests" msgstr "Openstaande verzoeken" -#: extensions/amavis/general_callbacks.py:135 +#: extensions/amavis/general_callbacks.py:189 msgid "Content filter" msgstr "Content filter" -#: extensions/amavis/lib.py:56 +#: extensions/amavis/lib.py:60 #, python-format msgid "Connection to amavis failed: %s" msgstr "Verbinding met amavis mislukt: %s" @@ -1511,7 +1678,9 @@ msgstr "standaard" #: extensions/amavis/models.py:98 msgid "Bypass virus checks or not. Choose 'default' to use global settings." -msgstr "Optie om virusscans over te slaan. Kies 'default' om de systeeminstelling te gebruiken." +msgstr "" +"Optie om virusscans over te slaan. Kies 'default' om de systeeminstelling te " +"gebruiken." #: extensions/amavis/models.py:101 msgid "Spam filter" @@ -1519,7 +1688,9 @@ msgstr "Spam filter" #: extensions/amavis/models.py:106 msgid "Bypass spam checks or not. Choose 'default' to use global settings." -msgstr "Optie om spamfilter over te slaan. Kies 'default' om de systeeminstelling te gebruiken." +msgstr "" +"Optie om spamfilter over te slaan. Kies 'default' om de systeeminstelling te " +"gebruiken." #: extensions/amavis/models.py:109 msgid "Banned filter" @@ -1527,7 +1698,9 @@ msgstr "Zwarte lijst" #: extensions/amavis/models.py:114 msgid "Bypass banned checks or not. Choose 'default' to use global settings." -msgstr "Optie om zwarte lijst over te slaan. Kies 'default' om de systeeminstelling te gebruiken." +msgstr "" +"Optie om zwarte lijst over te slaan. Kies 'default' om de systeeminstelling " +"te gebruiken." #: extensions/amavis/models.py:144 msgid "Spam marker" @@ -1535,17 +1708,19 @@ msgstr "Spam indicator" #: extensions/amavis/models.py:146 msgid "" -"Modify spam subject using the specified text. Choose 'default' to use global" -" settings." -msgstr "Wijzig standaard spam voorvoegsel met de opgegeven text. Kies 'default' om de systeeminstelling te gebruiken. Geef niets op als u geen voorvoegsel wilt." +"Modify spam subject using the specified text. Choose 'default' to use global " +"settings." +msgstr "" +"Wijzig standaard spam voorvoegsel met de opgegeven text. Kies 'default' om " +"de systeeminstelling te gebruiken. Geef niets op als u geen voorvoegsel wilt." #: extensions/amavis/sql_listing.py:29 msgid "Score" msgstr "Score" #: extensions/amavis/sql_listing.py:33 -#: extensions/amavis/templatetags/amavis_tags.py:75 -#: extensions/webmail/forms.py:82 +#: extensions/amavis/templatetags/amavis_tags.py:100 +#: extensions/webmail/forms.py:83 msgid "To" msgstr "Naar" @@ -1556,49 +1731,56 @@ msgid "From" msgstr "Van" #: extensions/amavis/sql_listing.py:40 extensions/sievefilters/forms.py:77 -#: extensions/webmail/forms.py:86 extensions/webmail/lib/imapemail.py:288 +#: extensions/webmail/forms.py:87 extensions/webmail/lib/imapemail.py:288 #: extensions/webmail/lib/listing.py:27 extensions/webmail/lib/tables.py:26 #: templates/common/email_searchbar.html:6 msgid "Subject" msgstr "Onderwerp" -#: extensions/amavis/views.py:27 +#: extensions/amavis/views.py:30 msgid "Empty quarantine" msgstr "Niets in quarantaine" -#: extensions/amavis/views.py:149 +#: extensions/amavis/views.py:152 msgid "Message deleted" msgstr "Bericht verwijderd" -#: extensions/amavis/views.py:168 +#: extensions/amavis/views.py:171 #, python-format msgid "%(count)d message deleted successfully" msgid_plural "%(count)d messages deleted successfully" msgstr[0] "%(count)d berichten successvol verwijderd" msgstr[1] "%(count)d berichten successvol verwijderd" -#: extensions/amavis/views.py:191 +#: extensions/amavis/views.py:194 msgid "Request sent" msgstr "Verzoek ingediend" -#: extensions/amavis/views.py:197 +#: extensions/amavis/views.py:200 msgid "Message released" msgstr "Bericht vrijgegeven" -#: extensions/amavis/views.py:225 +#: extensions/amavis/views.py:228 #, python-format msgid "%(count)d request sent" msgid_plural "%(count)d requests sent" msgstr[0] "%(count)d verzoek ingediend" msgstr[1] "%(count)d verzoeken ingediend" -#: extensions/amavis/views.py:246 +#: extensions/amavis/views.py:249 #, python-format msgid "%(count)d message released successfully" msgid_plural "%(count)d messages released successfully" msgstr[0] "%(count)d berichten successvol vrijgegeven" msgstr[1] "%(count)d berichten successvol vrijgegeven" +#: extensions/amavis/views.py:282 +#, fuzzy, python-format +msgid "%(count)d message processed successfully" +msgid_plural "%(count)d messages processed successfully" +msgstr[0] "%(count)d berichten successvol vrijgegeven" +msgstr[1] "%(count)d berichten successvol vrijgegeven" + #: extensions/amavis/management/commands/amnotify.py:61 msgid "[modoboa] Pending release requests" msgstr "[modoboa] Openstaand quarantaine vrijgeef verzoek" @@ -1644,44 +1826,55 @@ msgid "Banned" msgstr "Geband" #: extensions/amavis/templates/amavis/main_action_bar.html:18 -#: extensions/amavis/templatetags/amavis_tags.py:19 -#: extensions/amavis/templatetags/amavis_tags.py:54 +#: extensions/amavis/templatetags/amavis_tags.py:24 +#: extensions/amavis/templatetags/amavis_tags.py:79 msgid "Release" msgstr "Vrijgeven" #: extensions/amavis/templates/amavis/main_action_bar.html:23 -#: extensions/amavis/templatetags/amavis_tags.py:25 -#: extensions/amavis/templatetags/amavis_tags.py:61 +#: extensions/amavis/templatetags/amavis_tags.py:30 +#: extensions/amavis/templatetags/amavis_tags.py:86 #: extensions/webmail/templatetags/webmail_tags.py:32 msgid "Delete" msgstr "Verwijderen" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templatetags/amavis_tags.py:44 +#, fuzzy +msgid "Mark as spam" +msgstr "Markeer berichten" + +#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templatetags/amavis_tags.py:49 +msgid "Mark as non-spam" +msgstr "" + +#: extensions/amavis/templates/amavis/main_action_bar.html:42 #: extensions/sievefilters/forms.py:64 msgid "All messages" msgstr "Alle berichten" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:42 msgid "All" msgstr "Alles" -#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templates/amavis/main_action_bar.html:43 msgid "Spam only" msgstr "Alleen spam" -#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templates/amavis/main_action_bar.html:44 msgid "Virus only" msgstr "Alleen virussen" -#: extensions/amavis/templates/amavis/main_action_bar.html:34 +#: extensions/amavis/templates/amavis/main_action_bar.html:45 msgid "Bad Header only" msgstr "Alleen ongeldige headers" -#: extensions/amavis/templates/amavis/main_action_bar.html:35 +#: extensions/amavis/templates/amavis/main_action_bar.html:46 msgid "Bad MIME only" msgstr "Alleen ongeldige MIME's" -#: extensions/amavis/templates/amavis/main_action_bar.html:36 +#: extensions/amavis/templates/amavis/main_action_bar.html:47 msgid "Banned only" msgstr "Alleen geband" @@ -1693,8 +1886,12 @@ msgid "" msgid_plural "" "\n" "%(counter)s release requests are pending for action.\n" -msgstr[0] "\n%(counter)s vrijgeef verzoek ingediend.\n" -msgstr[1] "\n%(counter)s vrijgeef verzoeken ingediend.\n" +msgstr[0] "" +"\n" +"%(counter)s vrijgeef verzoek ingediend.\n" +msgstr[1] "" +"\n" +"%(counter)s vrijgeef verzoeken ingediend.\n" #: extensions/amavis/templates/amavis/notifications/pending_requests.html:6 msgid "Sketch:" @@ -1725,14 +1922,15 @@ msgstr "Reageer op dit bericht:" msgid "Please visit %(listingurl)s for a full listing." msgstr "Bezoek %(listingurl)s voor een volledige lijst." -#: extensions/amavis/templatetags/amavis_tags.py:28 +#: extensions/amavis/templatetags/amavis_tags.py:35 msgid "View full headers" msgstr "Volledige headers weergeven" #: extensions/limits/__init__.py:25 msgid "" "Per administrator resources to limit the number of objects they can create" -msgstr "Administrators limiteren in de hoeveelheid objecten die ze kunnen aanmaken" +msgstr "" +"Administrators limiteren in de hoeveelheid objecten die ze kunnen aanmaken" #: extensions/limits/__init__.py:56 msgid "Limits" @@ -1747,9 +1945,9 @@ msgid "Domain admins" msgstr "Domein administrators" #: extensions/limits/app_settings.py:15 -msgid "" -"Maximum number of allowed domain administrators for a new administrator" -msgstr "Maximum aantal toegestane domein administrators voor een nieuwe administrator" +msgid "Maximum number of allowed domain administrators for a new administrator" +msgstr "" +"Maximum aantal toegestane domein administrators voor een nieuwe administrator" #: extensions/limits/app_settings.py:21 msgid "Maximum number of allowed domains for a new administrator" @@ -1855,7 +2053,9 @@ msgstr "Ik ben niet aanwezig" #: extensions/postfix_autoreply/app_settings.py:23 msgid "" "Default subject used when an auto-reply message is created automatically" -msgstr "Standaard onderwerp gebruikt wanneer een automatisch antwoord automatisch is aangemaakt" +msgstr "" +"Standaard onderwerp gebruikt wanneer een automatisch antwoord automatisch is " +"aangemaakt" #: extensions/postfix_autoreply/app_settings.py:28 msgid "Default content" @@ -1868,14 +2068,21 @@ msgid "" "\n" "Best regards,\n" "%(name)s\n" -msgstr "Momenteel ben ik niet aanwezig. Ik zal antwoorden zodra ik terug kom.\n\nMet vriendelijke groet,\n%(name)s\n" +msgstr "" +"Momenteel ben ik niet aanwezig. Ik zal antwoorden zodra ik terug kom.\n" +"\n" +"Met vriendelijke groet,\n" +"%(name)s\n" #: extensions/postfix_autoreply/app_settings.py:36 #, python-format msgid "" "Default content used when an auto-reply message is created automatically. " "The '%(name)s' macro will be replaced by the user's full name." -msgstr "Standaard inhoud gebruikt wanneer een automatisch antwoord bericht automatisch is aangemaakt. De '%(name)s' macro zal vervangen worden door de naam van de gebruiker." +msgstr "" +"Standaard inhoud gebruikt wanneer een automatisch antwoord bericht " +"automatisch is aangemaakt. De '%(name)s' macro zal vervangen worden door de " +"naam van de gebruiker." #: extensions/postfix_autoreply/forms.py:12 msgid "Activate your auto reply from this date" @@ -1937,7 +2144,8 @@ msgstr "Auto antwoord bericht successvol aangepast." #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:2 msgid "Define a message to automatically send when you are off" -msgstr "Maak een bericht dat automatisch verstuurd word wanneer u niet aanwezig bent" +msgstr "" +"Maak een bericht dat automatisch verstuurd word wanneer u niet aanwezig bent" #: extensions/postfix_relay_domains/__init__.py:72 msgid "Relay domains support for Postfix" @@ -1961,7 +2169,9 @@ msgstr "Locatie van Postfix's master.cf" msgid "" "Alias(es) of this relay domain. Indicate only one name per input, press " "ENTER to add a new input." -msgstr "Alias(sen) van dit doorstuur domein. Geef slechts een adres per regel op, en toets ENTER om een nieuwe regel te krijgen." +msgstr "" +"Alias(sen) van dit doorstuur domein. Geef slechts een adres per regel op, en " +"toets ENTER om een nieuwe regel te krijgen." #: extensions/postfix_relay_domains/forms.py:51 #: extensions/postfix_relay_domains/general_callbacks.py:93 @@ -1993,13 +2203,19 @@ msgstr "Maximum aantal van doorstuur domeinen die deze gebruiker aan kan maken" #: extensions/postfix_relay_domains/general_callbacks.py:111 msgid "" "\n" -"
  • relaydomain; name; target host; service; enabled; verify recipients
  • \n" +"
  • relaydomain; name; target host; service; enabled; verify recipients
  • \n" +"
  • relaydomainalias; name; target; enabled
  • \n" +msgstr "" +"\n" +"
  • relaydomain; name; target host; service; enabled; verify recipients
  • \n" "
  • relaydomainalias; name; target; enabled
  • \n" -msgstr "\n
  • relaydomain; name; target host; service; enabled; verify recipients
  • \n
  • relaydomainalias; name; target; enabled
  • \n" #: extensions/postfix_relay_domains/limits_callbacks.py:19 msgid "Maximum number of allowed relay domains for a new administrator" -msgstr "Maximum aantal toegestane doorstuur domeinen voor een nieuwe administrator" +msgstr "" +"Maximum aantal toegestane doorstuur domeinen voor een nieuwe administrator" #: extensions/postfix_relay_domains/limits_callbacks.py:27 msgid "Maximum number of allowed relay domain aliases for a new administrator" @@ -2060,7 +2276,9 @@ msgstr "Scan" #: extensions/sievefilters/__init__.py:12 msgid "Plugin to easily create server-side filters" -msgstr "Plugin om gemakkelijk filters op de server in te stellen (bijvoorbeeld om uw mail te sorteren)" +msgstr "" +"Plugin om gemakkelijk filters op de server in te stellen (bijvoorbeeld om uw " +"mail te sorteren)" #: extensions/sievefilters/__init__.py:18 msgid "Sieve filters" @@ -2144,7 +2362,7 @@ msgstr "Afzender" msgid "Recipient" msgstr "Ontvanger" -#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:83 +#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:84 msgid "Cc" msgstr "CC" @@ -2253,7 +2471,9 @@ msgstr "actief" #: extensions/sievefilters/templates/sievefilters/index.html:94 msgid "" "No filters set defined yet. You must create one in order to define filters." -msgstr "Nog geen filterset gedefinieerd. U moet een filterset aanmaken om filters in te kunnen stellen." +msgstr "" +"Nog geen filterset gedefinieerd. U moet een filterset aanmaken om filters in " +"te kunnen stellen." #: extensions/sievefilters/templatetags/sfilters_tags.py:15 msgid "New filters set" @@ -2397,19 +2617,19 @@ msgstr "Onbekende grafische set" msgid "Bad custom period" msgstr "Ongeldige aangepaste periode" -#: extensions/stats/templates/stats/index.html:33 +#: extensions/stats/templates/stats/index.html:28 msgid "Search a domain" msgstr "Zoek een domein" -#: extensions/stats/templates/stats/index.html:37 +#: extensions/stats/templates/stats/index.html:32 msgid "Predefined time ranges" msgstr "Voorgedefinieerde tijdspannes" -#: extensions/stats/templates/stats/index.html:44 +#: extensions/stats/templates/stats/index.html:39 msgid "Custom time range" msgstr "Aangepaste tijdspanne" -#: extensions/stats/templates/stats/index.html:57 +#: extensions/stats/templates/stats/index.html:52 msgid "Apply" msgstr "Toepassen" @@ -2565,7 +2785,7 @@ msgstr "Antwoord van server" msgid "Unknown action" msgstr "Onbekende actie" -#: extensions/webmail/forms.py:84 +#: extensions/webmail/forms.py:85 msgid "Cci" msgstr "BCc" @@ -2772,15 +2992,15 @@ msgstr "Nee" msgid "Failed to update password: %s" msgstr "Mislukt om wachtwoord aan te passen: %s" -#: lib/permissions.py:20 +#: lib/permissions.py:19 msgid "Simple user" msgstr "Gebruiker" -#: lib/permissions.py:22 +#: lib/permissions.py:21 msgid "Super administrator" msgstr "Hoofdbeheerder" -#: lib/permissions.py:28 +#: lib/permissions.py:27 msgid "Domain administrator" msgstr "Domein administrator" diff --git a/modoboa/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/locale/pt_PT/LC_MESSAGES/django.po index 7981685d4..d72dc227b 100644 --- a/modoboa/locale/pt_PT/LC_MESSAGES/django.po +++ b/modoboa/locale/pt_PT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:29+0200\n" +"POT-Creation-Date: 2014-10-29 13:25+0100\n" "PO-Revision-Date: 2013-12-23 11:25+0000\n" "Last-Translator: lusitan \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" @@ -25,8 +25,8 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: core/__init__.py:52 core/__init__.py:53 -#: extensions/admin/forms/account.py:326 extensions/admin/forms/domain.py:256 -#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:129 +#: extensions/admin/forms/account.py:327 extensions/admin/forms/domain.py:248 +#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:133 #: extensions/postfix_autoreply/app_settings.py:11 #: extensions/postfix_relay_domains/forms.py:138 #: extensions/sievefilters/app_settings.py:50 @@ -288,8 +288,8 @@ msgstr "" msgid "This field is required" msgstr "Este campo é obrigatório" -#: core/app_settings.py:349 extensions/amavis/app_settings.py:87 -#: extensions/amavis/templates/amavis/main_action_bar.html:29 +#: core/app_settings.py:349 extensions/amavis/app_settings.py:149 +#: extensions/amavis/templates/amavis/main_action_bar.html:40 #: extensions/webmail/app_settings.py:73 msgid "Display" msgstr "Exibir" @@ -343,38 +343,38 @@ msgstr "" msgid "You can't delete your own account" msgstr "Não pode apagar a sua própria conta" -#: core/models.py:117 +#: core/models.py:130 msgid "Failed to update password: LDAP module not installed" msgstr "Falha ao actualizar password: Modulo LDAP não instalado" -#: core/models.py:170 +#: core/models.py:183 msgid "account" msgstr "conta" -#: core/models.py:321 extensions/admin/models/domain.py:144 +#: core/models.py:334 extensions/admin/models/domain.py:144 #: extensions/admin/models/domain_alias.py:39 #: extensions/postfix_relay_domains/models.py:134 #: extensions/postfix_relay_domains/models.py:190 msgid "Invalid line" msgstr "Linha inválida" -#: core/models.py:325 +#: core/models.py:338 msgid "You can't import an account with a role greater than yours" msgstr "Não é possível importa uma conta com permissões superiores" -#: core/models.py:337 +#: core/models.py:350 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "O simple utilizador '%s' deve ter endereço de e-mail válido" -#: core/models.py:341 +#: core/models.py:354 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "" "Os campos nome de utilizador e endereço de email não deve ser diferente para " "'%s'" -#: core/models.py:410 extensions/admin/models/alias.py:35 +#: core/models.py:423 extensions/admin/models/alias.py:35 #: extensions/admin/models/domain.py:32 #: extensions/admin/models/domain_alias.py:17 #: extensions/postfix_autoreply/models.py:28 @@ -383,29 +383,29 @@ msgstr "" msgid "enabled" msgstr "ativo" -#: core/models.py:411 +#: core/models.py:424 msgid "Check to enable this extension" msgstr "Marque para ativar esta extensão" -#: core/models.py:491 +#: core/models.py:504 msgid "added" msgstr "acrescentado" -#: core/models.py:494 +#: core/models.py:507 msgid "modified" msgstr "modificado" -#: core/models.py:496 core/models.py:521 +#: core/models.py:509 core/models.py:534 #, python-format msgid "%(object)s '%(name)s' %(action)s by user %(user)s" msgstr "%(object)s '%(name)s' %(action)s pelo utilizador %(user)s" -#: core/models.py:523 +#: core/models.py:536 msgid "deleted" msgstr "apagado" #: core/tables.py:8 core/templates/core/information.html:8 -#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:187 +#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:179 #: extensions/admin/templates/admin/domains_table.html:5 #: extensions/admin/templates/admin/editdomainform.html:13 #: extensions/admin/templates/admin/identities_table.html:5 @@ -521,7 +521,7 @@ msgstr "Atualizar o sua informação pessoal" #: core/templates/core/user_profile.html:8 #: extensions/admin/templates/admin/forward.html:8 #: extensions/admin/views/alias.py:112 extensions/admin/views/domain.py:168 -#: extensions/admin/views/identity.py:200 +#: extensions/admin/views/identity.py:204 #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9 #: extensions/postfix_relay_domains/views.py:66 #: extensions/sievefilters/views.py:166 extensions/webmail/views.py:172 @@ -648,7 +648,7 @@ msgstr "Reencaminhar" msgid "Account import failed (%s): domain does not exist" msgstr "Importação da conta falhou (%s): domínio não existe" -#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:196 +#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:197 #, python-format msgid "Mailbox %s already exists" msgstr "Caixa de correio %s já existe" @@ -658,6 +658,12 @@ msgstr "Caixa de correio %s já existe" msgid "Account import failed (%s): wrong quota value" msgstr "Importação da conta falhou (%s): domínio não existe" +#: extensions/admin/__init__.py:212 extensions/admin/forms/domain.py:75 +#: extensions/postfix_relay_domains/forms.py:50 +#: extensions/postfix_relay_domains/forms.py:70 +msgid "domain alias" +msgstr "" + #: extensions/admin/app_settings.py:13 #: extensions/admin/templates/admin/editdomainform.html:25 #: extensions/limits/app_settings.py:31 extensions/limits/models.py:23 @@ -706,7 +712,7 @@ msgstr "" "Ao remover uma caixa de correio estará também a remover a conta associada" #: extensions/admin/app_settings.py:81 extensions/admin/forms/account.py:178 -#: extensions/admin/forms/domain.py:56 +#: extensions/admin/forms/domain.py:57 msgid "Must be a positive integer" msgstr "" @@ -752,7 +758,7 @@ msgstr "Não pode desativar a sua própria conta" msgid "E-mail" msgstr "E-mail" -#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:17 +#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:18 msgid "Quota" msgstr "Quota" @@ -766,7 +772,7 @@ msgstr "" "usar o valor predefinido pelo domínio. Deixar em branco para definir uma " "valor ilimitado (não permitido para administradores do domínio)." -#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:26 +#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:27 #: extensions/admin/templates/admin/domains_table.html:6 #: extensions/postfix_relay_domains/forms.py:12 msgid "Alias(es)" @@ -782,25 +788,25 @@ msgstr "" "clique ENTER para adicionar uma nova entrada. Use o '*' para criar um alias " "'catchall' (ex: *@domain.tld)." -#: extensions/admin/forms/account.py:187 extensions/admin/forms/account.py:217 +#: extensions/admin/forms/account.py:188 extensions/admin/forms/account.py:218 #: extensions/admin/forms/alias.py:65 msgid "Domain does not exist" msgstr "O domínio não existe" -#: extensions/admin/forms/account.py:284 +#: extensions/admin/forms/account.py:285 msgid "Domain(s)" msgstr "Domínio(s)" -#: extensions/admin/forms/account.py:286 +#: extensions/admin/forms/account.py:287 msgid "Domain(s) that user administrates" msgstr "Domínio(s) administrado pelo utilizador" -#: extensions/admin/forms/account.py:328 -#: extensions/admin/views/identity.py:132 +#: extensions/admin/forms/account.py:329 +#: extensions/admin/views/identity.py:136 msgid "Mail" msgstr "Correio" -#: extensions/admin/forms/account.py:330 +#: extensions/admin/forms/account.py:331 msgid "Permissions" msgstr "Permissões" @@ -850,13 +856,13 @@ msgstr "O destinatário %s já existe" msgid "No recipient defined" msgstr "Sem destinatário definido" -#: extensions/admin/forms/domain.py:20 +#: extensions/admin/forms/domain.py:21 msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." msgstr "" -#: extensions/admin/forms/domain.py:29 +#: extensions/admin/forms/domain.py:30 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." @@ -864,34 +870,28 @@ msgstr "" "Alias(es) deste domínio. Indicar apenas um nome por entrada, pressionar " "ENTER para acrescentar uma nova entrada." -#: extensions/admin/forms/domain.py:75 -#: extensions/postfix_relay_domains/forms.py:50 -#: extensions/postfix_relay_domains/forms.py:70 -msgid "domain alias" -msgstr "" - -#: extensions/admin/forms/domain.py:82 extensions/admin/forms/domain.py:98 +#: extensions/admin/forms/domain.py:78 extensions/admin/forms/domain.py:92 #: extensions/postfix_relay_domains/forms.py:58 #: extensions/postfix_relay_domains/forms.py:78 #, python-format msgid "A %s with this name already exists" msgstr "" -#: extensions/admin/forms/domain.py:92 +#: extensions/admin/forms/domain.py:89 #: extensions/postfix_relay_domains/forms.py:49 #: extensions/postfix_relay_domains/forms.py:71 msgid "domain" msgstr "" -#: extensions/admin/forms/domain.py:181 +#: extensions/admin/forms/domain.py:173 msgid "Create a domain administrator" msgstr "Criar um administrador de domínio" -#: extensions/admin/forms/domain.py:183 +#: extensions/admin/forms/domain.py:175 msgid "Automatically create an administrator for this domain" msgstr "Criar automaticamente um administrador para este domínio" -#: extensions/admin/forms/domain.py:190 +#: extensions/admin/forms/domain.py:182 msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." @@ -899,19 +899,19 @@ msgstr "" "O nome do administrador. Não inclua o nome do domínio já que este será " "automaticamente anexado." -#: extensions/admin/forms/domain.py:198 +#: extensions/admin/forms/domain.py:190 msgid "Create aliases" msgstr " Criar aliases" -#: extensions/admin/forms/domain.py:200 +#: extensions/admin/forms/domain.py:192 msgid "Automatically create standard aliases for this domain" msgstr "Criar automaticamente aliases para este domínio" -#: extensions/admin/forms/domain.py:216 +#: extensions/admin/forms/domain.py:208 msgid "Invalid format" msgstr "Formato inválido" -#: extensions/admin/forms/domain.py:230 +#: extensions/admin/forms/domain.py:222 #, python-format msgid "User '%s' already exists" msgstr "O utilizador '%s' já existe" @@ -949,7 +949,7 @@ msgstr "" "Não é possível definir um reencaminhamento para um destino local. Por favor " "informe-se junto de um administrador para criar um alias." -#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:198 +#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:200 msgid "Select a file" msgstr "Escolha um ficheiro" @@ -969,7 +969,7 @@ msgstr "Passwords encriptadas" msgid "Check this option if passwords contained in your file are not crypted" msgstr "Marque esta opção se as senhas contidas no arquivo não são encriptadas" -#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:62 +#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:74 msgid "address" msgstr "endereços" @@ -1067,21 +1067,21 @@ msgstr "O domínio para o qual este alias irá apontar" msgid "Unknown domain %s" msgstr "Domínio desconhecido: %s" -#: extensions/admin/models/mailbox.py:63 +#: extensions/admin/models/mailbox.py:75 msgid "Mailbox address (without the @domain.tld part)" msgstr "Endereços das caixas de correio (sem a parte @domain.tld)" -#: extensions/admin/models/mailbox.py:125 +#: extensions/admin/models/mailbox.py:136 #, python-format msgid "Failed to retrieve mailbox location (%s)" msgstr "Falha ao recuperar a localização da caixa de correio (%s)" -#: extensions/admin/models/mailbox.py:194 +#: extensions/admin/models/mailbox.py:221 #, python-format msgid "Quota is greater than the allowed domain's limit (%dM)" msgstr "A quota excede o limite permitido pelo domínio (%dM)" -#: extensions/admin/models/mailbox.py:199 +#: extensions/admin/models/mailbox.py:227 msgid "A quota is required" msgstr "É necessário uma quota" @@ -1153,7 +1153,7 @@ msgid "Importing..." msgstr "A importar..." #: extensions/admin/templates/admin/listing.html:14 -#: extensions/stats/templates/stats/index.html:28 +#: extensions/stats/templates/stats/index.html:23 msgid "Filter" msgstr "Filtro" @@ -1255,8 +1255,8 @@ msgid "Alias with this name already exists" msgstr "Já existe um 'alias' com este nome" #: extensions/admin/views/alias.py:50 extensions/admin/views/domain.py:102 -#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:133 -#: extensions/admin/views/identity.py:160 +#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:137 +#: extensions/admin/views/identity.py:164 #: extensions/postfix_relay_domains/views.py:34 #: extensions/sievefilters/views.py:144 extensions/sievefilters/views.py:233 #: extensions/webmail/views.py:153 @@ -1299,7 +1299,7 @@ msgstr "Reencaminhamento modificado" msgid "Alias modified" msgstr "'Alias' modificado" -#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:130 +#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:134 msgid "Next" msgstr "Seguinte" @@ -1307,7 +1307,7 @@ msgstr "Seguinte" msgid "Options" msgstr "Opções" -#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:134 +#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:138 msgid "Previous" msgstr "Anterior" @@ -1341,11 +1341,11 @@ msgstr "Exportar identidades" msgid "Export domains" msgstr "Exportar domínios" -#: extensions/admin/views/identity.py:104 -#: extensions/admin/views/identity.py:227 -#: extensions/admin/views/identity.py:232 extensions/amavis/views.py:144 -#: extensions/amavis/views.py:148 extensions/amavis/views.py:181 -#: extensions/amavis/views.py:186 extensions/amavis/views.py:188 +#: extensions/admin/views/identity.py:108 +#: extensions/admin/views/identity.py:231 +#: extensions/admin/views/identity.py:236 extensions/amavis/views.py:147 +#: extensions/amavis/views.py:151 extensions/amavis/views.py:184 +#: extensions/amavis/views.py:189 extensions/amavis/views.py:191 #: extensions/webmail/views.py:49 extensions/webmail/views.py:67 #: extensions/webmail/views.py:81 extensions/webmail/views.py:99 #: extensions/webmail/views.py:116 extensions/webmail/views.py:202 @@ -1356,19 +1356,19 @@ msgstr "Exportar domínios" msgid "Invalid request" msgstr "Pedido inválido" -#: extensions/admin/views/identity.py:151 +#: extensions/admin/views/identity.py:155 msgid "Account created" msgstr "Conta criada" -#: extensions/admin/views/identity.py:157 +#: extensions/admin/views/identity.py:161 msgid "New account" msgstr "Nova conta" -#: extensions/admin/views/identity.py:193 +#: extensions/admin/views/identity.py:197 msgid "Account updated" msgstr "Conta actualizada" -#: extensions/admin/views/identity.py:217 +#: extensions/admin/views/identity.py:221 msgid "Account deleted" msgid_plural "Accounts deleted" msgstr[0] "Conta eliminada" @@ -1430,7 +1430,7 @@ msgstr "Reencaminhamento atualizado" msgid "Simple amavis management frontend" msgstr "Interface de gestão básica do amavis" -#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:18 +#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:20 msgid "Quarantine" msgstr "Quarentena" @@ -1526,27 +1526,95 @@ msgstr "Notificações de remetente" msgid "The e-mail address used to send notitications" msgstr "O endereço de e-mail usado para enviar notificações" -#: extensions/amavis/app_settings.py:91 extensions/webmail/app_settings.py:91 +#: extensions/amavis/app_settings.py:77 +#: extensions/amavis/templates/amavis/main_action_bar.html:27 +msgid "Manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:80 +msgid "Enable manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:83 +msgid "Allow super administrators to manually train Spamassassin" +msgstr "" + +#: extensions/amavis/app_settings.py:88 +msgid "Is Spamassassin local?" +msgstr "" + +#: extensions/amavis/app_settings.py:91 +msgid "Tell if Spamassassin is running on the same server than modoboa" +msgstr "" + +#: extensions/amavis/app_settings.py:96 +#, fuzzy +msgid "Default user" +msgstr "Editor predefinido" + +#: extensions/amavis/app_settings.py:99 +msgid "Name of the user owning the default bayesian database" +msgstr "" + +#: extensions/amavis/app_settings.py:104 +#, fuzzy +msgid "Spamd address" +msgstr "Do endereço" + +#: extensions/amavis/app_settings.py:106 +msgid "The IP address where spamd can be reached" +msgstr "" + +#: extensions/amavis/app_settings.py:110 +#, fuzzy +msgid "Spamd port" +msgstr "Importar" + +#: extensions/amavis/app_settings.py:112 +msgid "The TCP port spamd is listening on" +msgstr "" + +#: extensions/amavis/app_settings.py:116 +msgid "Enable per-domain manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:119 +msgid "" +"Allow domain administrators to train Spamassassin (within dedicated per-" +"domain databases)" +msgstr "" + +#: extensions/amavis/app_settings.py:125 +msgid "Enable per-user manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:128 +msgid "" +"Allow simple users to personally train Spamassassin (within a dedicated " +"database)" +msgstr "" + +#: extensions/amavis/app_settings.py:153 extensions/webmail/app_settings.py:91 msgid "Number of displayed emails per page" msgstr "Número de e-mails a visíveis por página" -#: extensions/amavis/app_settings.py:92 +#: extensions/amavis/app_settings.py:154 msgid "Set the maximum number of messages displayed in a page" msgstr "Definir o número máximo de mensagens apresentadas por página" -#: extensions/amavis/general_callbacks.py:82 +#: extensions/amavis/general_callbacks.py:136 msgid "pending requests" msgstr "pedidos pendentes" -#: extensions/amavis/general_callbacks.py:125 +#: extensions/amavis/general_callbacks.py:179 msgid "Pending requests" msgstr "" -#: extensions/amavis/general_callbacks.py:135 +#: extensions/amavis/general_callbacks.py:189 msgid "Content filter" msgstr "Filtro de conteúdo" -#: extensions/amavis/lib.py:56 +#: extensions/amavis/lib.py:60 #, python-format msgid "Connection to amavis failed: %s" msgstr "Não foi possível estabelecer ligação com o amavis: %s" @@ -1614,8 +1682,8 @@ msgid "Score" msgstr "" #: extensions/amavis/sql_listing.py:33 -#: extensions/amavis/templatetags/amavis_tags.py:75 -#: extensions/webmail/forms.py:82 +#: extensions/amavis/templatetags/amavis_tags.py:100 +#: extensions/webmail/forms.py:83 msgid "To" msgstr "Para" @@ -1626,49 +1694,56 @@ msgid "From" msgstr "De" #: extensions/amavis/sql_listing.py:40 extensions/sievefilters/forms.py:77 -#: extensions/webmail/forms.py:86 extensions/webmail/lib/imapemail.py:288 +#: extensions/webmail/forms.py:87 extensions/webmail/lib/imapemail.py:288 #: extensions/webmail/lib/listing.py:27 extensions/webmail/lib/tables.py:26 #: templates/common/email_searchbar.html:6 msgid "Subject" msgstr "Assunto" -#: extensions/amavis/views.py:27 +#: extensions/amavis/views.py:30 msgid "Empty quarantine" msgstr "Quarentena vazia" -#: extensions/amavis/views.py:149 +#: extensions/amavis/views.py:152 msgid "Message deleted" msgstr "Mensagem apagada" -#: extensions/amavis/views.py:168 +#: extensions/amavis/views.py:171 #, python-format msgid "%(count)d message deleted successfully" msgid_plural "%(count)d messages deleted successfully" msgstr[0] "%(count)d mensagem eliminada com sucesso" msgstr[1] "%(count)d mensagens eliminadas com sucesso" -#: extensions/amavis/views.py:191 +#: extensions/amavis/views.py:194 msgid "Request sent" msgstr "Pedido enviado" -#: extensions/amavis/views.py:197 +#: extensions/amavis/views.py:200 msgid "Message released" msgstr "Mensagem libertada" -#: extensions/amavis/views.py:225 +#: extensions/amavis/views.py:228 #, python-format msgid "%(count)d request sent" msgid_plural "%(count)d requests sent" msgstr[0] "%(count)d pedido enviado" msgstr[1] "%(count)d pedidos enviados" -#: extensions/amavis/views.py:246 +#: extensions/amavis/views.py:249 #, python-format msgid "%(count)d message released successfully" msgid_plural "%(count)d messages released successfully" msgstr[0] "%(count)d mensagem libertada com sucesso" msgstr[1] "%(count)d mensagens libertadas com sucesso" +#: extensions/amavis/views.py:282 +#, fuzzy, python-format +msgid "%(count)d message processed successfully" +msgid_plural "%(count)d messages processed successfully" +msgstr[0] "%(count)d mensagem libertada com sucesso" +msgstr[1] "%(count)d mensagens libertadas com sucesso" + #: extensions/amavis/management/commands/amnotify.py:61 msgid "[modoboa] Pending release requests" msgstr "[modoboa] Pedidos de laçamento pendentes" @@ -1714,44 +1789,55 @@ msgid "Banned" msgstr "" #: extensions/amavis/templates/amavis/main_action_bar.html:18 -#: extensions/amavis/templatetags/amavis_tags.py:19 -#: extensions/amavis/templatetags/amavis_tags.py:54 +#: extensions/amavis/templatetags/amavis_tags.py:24 +#: extensions/amavis/templatetags/amavis_tags.py:79 msgid "Release" msgstr "Libertar" #: extensions/amavis/templates/amavis/main_action_bar.html:23 -#: extensions/amavis/templatetags/amavis_tags.py:25 -#: extensions/amavis/templatetags/amavis_tags.py:61 +#: extensions/amavis/templatetags/amavis_tags.py:30 +#: extensions/amavis/templatetags/amavis_tags.py:86 #: extensions/webmail/templatetags/webmail_tags.py:32 msgid "Delete" msgstr "Eliminar" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templatetags/amavis_tags.py:44 +#, fuzzy +msgid "Mark as spam" +msgstr "Marcar mensagens" + +#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templatetags/amavis_tags.py:49 +msgid "Mark as non-spam" +msgstr "" + +#: extensions/amavis/templates/amavis/main_action_bar.html:42 #: extensions/sievefilters/forms.py:64 msgid "All messages" msgstr "Todas as mensagens" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:42 msgid "All" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templates/amavis/main_action_bar.html:43 msgid "Spam only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templates/amavis/main_action_bar.html:44 msgid "Virus only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:34 +#: extensions/amavis/templates/amavis/main_action_bar.html:45 msgid "Bad Header only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:35 +#: extensions/amavis/templates/amavis/main_action_bar.html:46 msgid "Bad MIME only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:36 +#: extensions/amavis/templates/amavis/main_action_bar.html:47 msgid "Banned only" msgstr "" @@ -1799,7 +1885,7 @@ msgstr "Atuar nesta mensagem:" msgid "Please visit %(listingurl)s for a full listing." msgstr "Por favor visitar %(listingurl)s para uma listagem completa." -#: extensions/amavis/templatetags/amavis_tags.py:28 +#: extensions/amavis/templatetags/amavis_tags.py:35 msgid "View full headers" msgstr "Ver todos os cabeçalhos" @@ -2225,7 +2311,7 @@ msgstr "Remetente" msgid "Recipient" msgstr "Destinatário" -#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:83 +#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:84 msgid "Cc" msgstr "Cc" @@ -2480,19 +2566,19 @@ msgstr "Conjunto de gráficos desconhecido" msgid "Bad custom period" msgstr "Período personalizado inválido" -#: extensions/stats/templates/stats/index.html:33 +#: extensions/stats/templates/stats/index.html:28 msgid "Search a domain" msgstr "Procurar um domínio" -#: extensions/stats/templates/stats/index.html:37 +#: extensions/stats/templates/stats/index.html:32 msgid "Predefined time ranges" msgstr "Intervalos de tempo pré-definidos" -#: extensions/stats/templates/stats/index.html:44 +#: extensions/stats/templates/stats/index.html:39 msgid "Custom time range" msgstr "Intervalo de tempo personalizado" -#: extensions/stats/templates/stats/index.html:57 +#: extensions/stats/templates/stats/index.html:52 msgid "Apply" msgstr "Aplicar" @@ -2648,7 +2734,7 @@ msgstr "Resposta do servidor" msgid "Unknown action" msgstr "Acção desconhecida" -#: extensions/webmail/forms.py:84 +#: extensions/webmail/forms.py:85 msgid "Cci" msgstr "Cci" @@ -2855,15 +2941,15 @@ msgstr "Não" msgid "Failed to update password: %s" msgstr "Falha ao actualizar a password: %s" -#: lib/permissions.py:20 +#: lib/permissions.py:19 msgid "Simple user" msgstr "Utilizador simples" -#: lib/permissions.py:22 +#: lib/permissions.py:21 msgid "Super administrator" msgstr "Super Administrador" -#: lib/permissions.py:28 +#: lib/permissions.py:27 msgid "Domain administrator" msgstr "Administrador de domínio" diff --git a/modoboa/locale/ru/LC_MESSAGES/django.po b/modoboa/locale/ru/LC_MESSAGES/django.po index 4ec234c0b..870084ab1 100644 --- a/modoboa/locale/ru/LC_MESSAGES/django.po +++ b/modoboa/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:28+0200\n" +"POT-Creation-Date: 2014-10-29 13:25+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/" @@ -20,8 +20,8 @@ msgstr "" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: core/__init__.py:52 core/__init__.py:53 -#: extensions/admin/forms/account.py:326 extensions/admin/forms/domain.py:256 -#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:129 +#: extensions/admin/forms/account.py:327 extensions/admin/forms/domain.py:248 +#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:133 #: extensions/postfix_autoreply/app_settings.py:11 #: extensions/postfix_relay_domains/forms.py:138 #: extensions/sievefilters/app_settings.py:50 @@ -280,8 +280,8 @@ msgstr "" msgid "This field is required" msgstr "Это поле обязательно для заполнеия" -#: core/app_settings.py:349 extensions/amavis/app_settings.py:87 -#: extensions/amavis/templates/amavis/main_action_bar.html:29 +#: core/app_settings.py:349 extensions/amavis/app_settings.py:149 +#: extensions/amavis/templates/amavis/main_action_bar.html:40 #: extensions/webmail/app_settings.py:73 msgid "Display" msgstr "Отображение" @@ -335,36 +335,36 @@ msgstr "" msgid "You can't delete your own account" msgstr "Вы не можете удалить собственный аккаунт" -#: core/models.py:117 +#: core/models.py:130 msgid "Failed to update password: LDAP module not installed" msgstr "Ошибка обновления пароля: модуль LDAP не установлен" -#: core/models.py:170 +#: core/models.py:183 msgid "account" msgstr "Аккаунт" -#: core/models.py:321 extensions/admin/models/domain.py:144 +#: core/models.py:334 extensions/admin/models/domain.py:144 #: extensions/admin/models/domain_alias.py:39 #: extensions/postfix_relay_domains/models.py:134 #: extensions/postfix_relay_domains/models.py:190 msgid "Invalid line" msgstr "Ошибочная строка" -#: core/models.py:325 +#: core/models.py:338 msgid "You can't import an account with a role greater than yours" msgstr "Вы не можете импортировать аккаунт с ролью старше чем у вас" -#: core/models.py:337 +#: core/models.py:350 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Пользователь '%s' должен иметь действительный почтовый адрес" -#: core/models.py:341 +#: core/models.py:354 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "Имя пользователя и адрес не должны отличатся для пользователя '%s'" -#: core/models.py:410 extensions/admin/models/alias.py:35 +#: core/models.py:423 extensions/admin/models/alias.py:35 #: extensions/admin/models/domain.py:32 #: extensions/admin/models/domain_alias.py:17 #: extensions/postfix_autoreply/models.py:28 @@ -373,29 +373,29 @@ msgstr "Имя пользователя и адрес не должны отли msgid "enabled" msgstr "Разрешен" -#: core/models.py:411 +#: core/models.py:424 msgid "Check to enable this extension" msgstr "Отметить для разрешения этого расширения" -#: core/models.py:491 +#: core/models.py:504 msgid "added" msgstr "добавлено" -#: core/models.py:494 +#: core/models.py:507 msgid "modified" msgstr "изменено" -#: core/models.py:496 core/models.py:521 +#: core/models.py:509 core/models.py:534 #, python-format msgid "%(object)s '%(name)s' %(action)s by user %(user)s" msgstr "%(object)s '%(name)s' %(action)s пользователем %(user)s" -#: core/models.py:523 +#: core/models.py:536 msgid "deleted" msgstr "удалено" #: core/tables.py:8 core/templates/core/information.html:8 -#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:187 +#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:179 #: extensions/admin/templates/admin/domains_table.html:5 #: extensions/admin/templates/admin/editdomainform.html:13 #: extensions/admin/templates/admin/identities_table.html:5 @@ -511,7 +511,7 @@ msgstr "Обновить личную информацию" #: core/templates/core/user_profile.html:8 #: extensions/admin/templates/admin/forward.html:8 #: extensions/admin/views/alias.py:112 extensions/admin/views/domain.py:168 -#: extensions/admin/views/identity.py:200 +#: extensions/admin/views/identity.py:204 #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9 #: extensions/postfix_relay_domains/views.py:66 #: extensions/sievefilters/views.py:166 extensions/webmail/views.py:172 @@ -637,7 +637,7 @@ msgstr "Перенаправленые" msgid "Account import failed (%s): domain does not exist" msgstr "Ошибка импорта аккаунта (%s): домен должен существовать " -#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:196 +#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:197 #, python-format msgid "Mailbox %s already exists" msgstr "Почтовый ящик %s существует" @@ -647,6 +647,12 @@ msgstr "Почтовый ящик %s существует" msgid "Account import failed (%s): wrong quota value" msgstr "Ошибка импорта аккаунта (%s): домен должен существовать " +#: extensions/admin/__init__.py:212 extensions/admin/forms/domain.py:75 +#: extensions/postfix_relay_domains/forms.py:50 +#: extensions/postfix_relay_domains/forms.py:70 +msgid "domain alias" +msgstr "" + #: extensions/admin/app_settings.py:13 #: extensions/admin/templates/admin/editdomainform.html:25 #: extensions/limits/app_settings.py:31 extensions/limits/models.py:23 @@ -694,7 +700,7 @@ msgid "When a mailbox is removed, also remove the associated account" msgstr "При удалении почтового ящика, так же удалять и аккаунт владельца" #: extensions/admin/app_settings.py:81 extensions/admin/forms/account.py:178 -#: extensions/admin/forms/domain.py:56 +#: extensions/admin/forms/domain.py:57 msgid "Must be a positive integer" msgstr "" @@ -740,7 +746,7 @@ msgstr "Вы не можете запретить собственный акк msgid "E-mail" msgstr "Е-майл" -#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:17 +#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:18 msgid "Quota" msgstr "Квота" @@ -755,7 +761,7 @@ msgstr "" "Оставьте пустым для неограниченного значения. (Не разрешено администраторам " "домена)" -#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:26 +#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:27 #: extensions/admin/templates/admin/domains_table.html:6 #: extensions/postfix_relay_domains/forms.py:12 msgid "Alias(es)" @@ -770,25 +776,25 @@ msgstr "" "Синонимы этого почтового ящика. Вводите один адрес за раз. Нажмите ENTER для " "добавления. Используйте '*' для создания синонима 'для всех' (*@domain.tld)" -#: extensions/admin/forms/account.py:187 extensions/admin/forms/account.py:217 +#: extensions/admin/forms/account.py:188 extensions/admin/forms/account.py:218 #: extensions/admin/forms/alias.py:65 msgid "Domain does not exist" msgstr "Домен не существует" -#: extensions/admin/forms/account.py:284 +#: extensions/admin/forms/account.py:285 msgid "Domain(s)" msgstr "Домен(ы)" -#: extensions/admin/forms/account.py:286 +#: extensions/admin/forms/account.py:287 msgid "Domain(s) that user administrates" msgstr "Домен(ы) администрируемые пользователем" -#: extensions/admin/forms/account.py:328 -#: extensions/admin/views/identity.py:132 +#: extensions/admin/forms/account.py:329 +#: extensions/admin/views/identity.py:136 msgid "Mail" msgstr "Почта" -#: extensions/admin/forms/account.py:330 +#: extensions/admin/forms/account.py:331 msgid "Permissions" msgstr "Права" @@ -838,13 +844,13 @@ msgstr "Получатель %s уже присутвует" msgid "No recipient defined" msgstr "Получатель не определен" -#: extensions/admin/forms/domain.py:20 +#: extensions/admin/forms/domain.py:21 msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." msgstr "" -#: extensions/admin/forms/domain.py:29 +#: extensions/admin/forms/domain.py:30 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." @@ -852,34 +858,28 @@ msgstr "" "Синоним(ы) этого домена. Вводите одно имя за раз. Нажмите ENTER для " "добавления." -#: extensions/admin/forms/domain.py:75 -#: extensions/postfix_relay_domains/forms.py:50 -#: extensions/postfix_relay_domains/forms.py:70 -msgid "domain alias" -msgstr "" - -#: extensions/admin/forms/domain.py:82 extensions/admin/forms/domain.py:98 +#: extensions/admin/forms/domain.py:78 extensions/admin/forms/domain.py:92 #: extensions/postfix_relay_domains/forms.py:58 #: extensions/postfix_relay_domains/forms.py:78 #, python-format msgid "A %s with this name already exists" msgstr "" -#: extensions/admin/forms/domain.py:92 +#: extensions/admin/forms/domain.py:89 #: extensions/postfix_relay_domains/forms.py:49 #: extensions/postfix_relay_domains/forms.py:71 msgid "domain" msgstr "" -#: extensions/admin/forms/domain.py:181 +#: extensions/admin/forms/domain.py:173 msgid "Create a domain administrator" msgstr "Создание администратора домена" -#: extensions/admin/forms/domain.py:183 +#: extensions/admin/forms/domain.py:175 msgid "Automatically create an administrator for this domain" msgstr "Автоматически создаст администратора для этого домена" -#: extensions/admin/forms/domain.py:190 +#: extensions/admin/forms/domain.py:182 msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." @@ -887,19 +887,19 @@ msgstr "" "Имя администратора. Не включайте имя домена оно будет добавлено " "автоматически." -#: extensions/admin/forms/domain.py:198 +#: extensions/admin/forms/domain.py:190 msgid "Create aliases" msgstr "Создание синонимов" -#: extensions/admin/forms/domain.py:200 +#: extensions/admin/forms/domain.py:192 msgid "Automatically create standard aliases for this domain" msgstr "Автоматически создает стандартные синонимы для этого домена" -#: extensions/admin/forms/domain.py:216 +#: extensions/admin/forms/domain.py:208 msgid "Invalid format" msgstr "Неверный формат" -#: extensions/admin/forms/domain.py:230 +#: extensions/admin/forms/domain.py:222 #, python-format msgid "User '%s' already exists" msgstr "Пользователь '%s' уже существует" @@ -938,7 +938,7 @@ msgstr "" "Вы не можете определить перенаправление на локальный адрес. Пожалуйста, " "попросите администратора создать синоним" -#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:198 +#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:200 msgid "Select a file" msgstr "Выберите файл" @@ -958,7 +958,7 @@ msgstr "Шифровать пароль" msgid "Check this option if passwords contained in your file are not crypted" msgstr "Выберите эту опцию если пароль в вашем файле не зашифрован " -#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:62 +#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:74 msgid "address" msgstr "адрес" @@ -1056,21 +1056,21 @@ msgstr "Домен этого синонима указывает на" msgid "Unknown domain %s" msgstr "Неизвестный домен %s" -#: extensions/admin/models/mailbox.py:63 +#: extensions/admin/models/mailbox.py:75 msgid "Mailbox address (without the @domain.tld part)" msgstr "Адрес почтового ящика (без @domain.tld)" -#: extensions/admin/models/mailbox.py:125 +#: extensions/admin/models/mailbox.py:136 #, python-format msgid "Failed to retrieve mailbox location (%s)" msgstr "Ошибка получения места находжения почтового ящика (%s)" -#: extensions/admin/models/mailbox.py:194 +#: extensions/admin/models/mailbox.py:221 #, python-format msgid "Quota is greater than the allowed domain's limit (%dM)" msgstr "Квота больше чем разрешено на уровне домена (%dM)" -#: extensions/admin/models/mailbox.py:199 +#: extensions/admin/models/mailbox.py:227 msgid "A quota is required" msgstr "Требуется квота" @@ -1142,7 +1142,7 @@ msgid "Importing..." msgstr "Импорт..." #: extensions/admin/templates/admin/listing.html:14 -#: extensions/stats/templates/stats/index.html:28 +#: extensions/stats/templates/stats/index.html:23 msgid "Filter" msgstr "Фильтр" @@ -1244,8 +1244,8 @@ msgid "Alias with this name already exists" msgstr "Синоним с таким именем уже есть" #: extensions/admin/views/alias.py:50 extensions/admin/views/domain.py:102 -#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:133 -#: extensions/admin/views/identity.py:160 +#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:137 +#: extensions/admin/views/identity.py:164 #: extensions/postfix_relay_domains/views.py:34 #: extensions/sievefilters/views.py:144 extensions/sievefilters/views.py:233 #: extensions/webmail/views.py:153 @@ -1288,7 +1288,7 @@ msgstr "Пересылка изменена" msgid "Alias modified" msgstr "Синоним изменен" -#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:130 +#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:134 msgid "Next" msgstr "Следующая" @@ -1296,7 +1296,7 @@ msgstr "Следующая" msgid "Options" msgstr "Опции" -#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:134 +#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:138 msgid "Previous" msgstr "Предыдущая" @@ -1331,11 +1331,11 @@ msgstr "Экспорт пользователя" msgid "Export domains" msgstr "Экспорт доменов" -#: extensions/admin/views/identity.py:104 -#: extensions/admin/views/identity.py:227 -#: extensions/admin/views/identity.py:232 extensions/amavis/views.py:144 -#: extensions/amavis/views.py:148 extensions/amavis/views.py:181 -#: extensions/amavis/views.py:186 extensions/amavis/views.py:188 +#: extensions/admin/views/identity.py:108 +#: extensions/admin/views/identity.py:231 +#: extensions/admin/views/identity.py:236 extensions/amavis/views.py:147 +#: extensions/amavis/views.py:151 extensions/amavis/views.py:184 +#: extensions/amavis/views.py:189 extensions/amavis/views.py:191 #: extensions/webmail/views.py:49 extensions/webmail/views.py:67 #: extensions/webmail/views.py:81 extensions/webmail/views.py:99 #: extensions/webmail/views.py:116 extensions/webmail/views.py:202 @@ -1346,19 +1346,19 @@ msgstr "Экспорт доменов" msgid "Invalid request" msgstr "Ошибочный запрос" -#: extensions/admin/views/identity.py:151 +#: extensions/admin/views/identity.py:155 msgid "Account created" msgstr "Аккаунт создан" -#: extensions/admin/views/identity.py:157 +#: extensions/admin/views/identity.py:161 msgid "New account" msgstr "Новый аккаунт" -#: extensions/admin/views/identity.py:193 +#: extensions/admin/views/identity.py:197 msgid "Account updated" msgstr "аккаунт изменен" -#: extensions/admin/views/identity.py:217 +#: extensions/admin/views/identity.py:221 msgid "Account deleted" msgid_plural "Accounts deleted" msgstr[0] "Аккаунт удален" @@ -1421,7 +1421,7 @@ msgstr "Перенаправление обновлено" msgid "Simple amavis management frontend" msgstr "Простой интерфейс управления AMaViS" -#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:18 +#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:20 msgid "Quarantine" msgstr "Карантин" @@ -1515,27 +1515,95 @@ msgstr "Уведомления отправителю" msgid "The e-mail address used to send notitications" msgstr "Адрес для отправки уведомлений" -#: extensions/amavis/app_settings.py:91 extensions/webmail/app_settings.py:91 +#: extensions/amavis/app_settings.py:77 +#: extensions/amavis/templates/amavis/main_action_bar.html:27 +msgid "Manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:80 +msgid "Enable manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:83 +msgid "Allow super administrators to manually train Spamassassin" +msgstr "" + +#: extensions/amavis/app_settings.py:88 +msgid "Is Spamassassin local?" +msgstr "" + +#: extensions/amavis/app_settings.py:91 +msgid "Tell if Spamassassin is running on the same server than modoboa" +msgstr "" + +#: extensions/amavis/app_settings.py:96 +#, fuzzy +msgid "Default user" +msgstr "Редактор по умолчанию" + +#: extensions/amavis/app_settings.py:99 +msgid "Name of the user owning the default bayesian database" +msgstr "" + +#: extensions/amavis/app_settings.py:104 +#, fuzzy +msgid "Spamd address" +msgstr "Адрес отправителя" + +#: extensions/amavis/app_settings.py:106 +msgid "The IP address where spamd can be reached" +msgstr "" + +#: extensions/amavis/app_settings.py:110 +#, fuzzy +msgid "Spamd port" +msgstr "Импорт" + +#: extensions/amavis/app_settings.py:112 +msgid "The TCP port spamd is listening on" +msgstr "" + +#: extensions/amavis/app_settings.py:116 +msgid "Enable per-domain manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:119 +msgid "" +"Allow domain administrators to train Spamassassin (within dedicated per-" +"domain databases)" +msgstr "" + +#: extensions/amavis/app_settings.py:125 +msgid "Enable per-user manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:128 +msgid "" +"Allow simple users to personally train Spamassassin (within a dedicated " +"database)" +msgstr "" + +#: extensions/amavis/app_settings.py:153 extensions/webmail/app_settings.py:91 msgid "Number of displayed emails per page" msgstr "Количество отображаемых сообщений на странице" -#: extensions/amavis/app_settings.py:92 +#: extensions/amavis/app_settings.py:154 msgid "Set the maximum number of messages displayed in a page" msgstr "Установить максимальное количество сообщений показываемых на странице" -#: extensions/amavis/general_callbacks.py:82 +#: extensions/amavis/general_callbacks.py:136 msgid "pending requests" msgstr "ожидающие запросы" -#: extensions/amavis/general_callbacks.py:125 +#: extensions/amavis/general_callbacks.py:179 msgid "Pending requests" msgstr "" -#: extensions/amavis/general_callbacks.py:135 +#: extensions/amavis/general_callbacks.py:189 msgid "Content filter" msgstr "Фильтр содержания" -#: extensions/amavis/lib.py:56 +#: extensions/amavis/lib.py:60 #, python-format msgid "Connection to amavis failed: %s" msgstr "Ошибка соединания с Amavis %s" @@ -1603,8 +1671,8 @@ msgid "Score" msgstr "" #: extensions/amavis/sql_listing.py:33 -#: extensions/amavis/templatetags/amavis_tags.py:75 -#: extensions/webmail/forms.py:82 +#: extensions/amavis/templatetags/amavis_tags.py:100 +#: extensions/webmail/forms.py:83 msgid "To" msgstr "Кому" @@ -1615,21 +1683,21 @@ msgid "From" msgstr "От кого" #: extensions/amavis/sql_listing.py:40 extensions/sievefilters/forms.py:77 -#: extensions/webmail/forms.py:86 extensions/webmail/lib/imapemail.py:288 +#: extensions/webmail/forms.py:87 extensions/webmail/lib/imapemail.py:288 #: extensions/webmail/lib/listing.py:27 extensions/webmail/lib/tables.py:26 #: templates/common/email_searchbar.html:6 msgid "Subject" msgstr "Тема" -#: extensions/amavis/views.py:27 +#: extensions/amavis/views.py:30 msgid "Empty quarantine" msgstr "очистить карантин" -#: extensions/amavis/views.py:149 +#: extensions/amavis/views.py:152 msgid "Message deleted" msgstr "Сообщение удалено" -#: extensions/amavis/views.py:168 +#: extensions/amavis/views.py:171 #, python-format msgid "%(count)d message deleted successfully" msgid_plural "%(count)d messages deleted successfully" @@ -1637,15 +1705,15 @@ msgstr[0] "%(count)d сообщение успешно удалено" msgstr[1] "%(count)d сообщения успешно удалено" msgstr[2] "%(count)d сообщений успешно удалено" -#: extensions/amavis/views.py:191 +#: extensions/amavis/views.py:194 msgid "Request sent" msgstr "Запрос послан" -#: extensions/amavis/views.py:197 +#: extensions/amavis/views.py:200 msgid "Message released" msgstr "Сообщение деблокировано" -#: extensions/amavis/views.py:225 +#: extensions/amavis/views.py:228 #, python-format msgid "%(count)d request sent" msgid_plural "%(count)d requests sent" @@ -1653,7 +1721,7 @@ msgstr[0] "%(count)d запрос послан" msgstr[1] "%(count)d запроса полано" msgstr[2] "%(count)d запросов послано" -#: extensions/amavis/views.py:246 +#: extensions/amavis/views.py:249 #, python-format msgid "%(count)d message released successfully" msgid_plural "%(count)d messages released successfully" @@ -1661,6 +1729,14 @@ msgstr[0] "%(count)d сообщение успешно деблокирован msgstr[1] "%(count)d сообщения успешно деблокировано" msgstr[2] "%(count)d сообщений успешно деблокировано" +#: extensions/amavis/views.py:282 +#, fuzzy, python-format +msgid "%(count)d message processed successfully" +msgid_plural "%(count)d messages processed successfully" +msgstr[0] "%(count)d сообщение успешно деблокировано" +msgstr[1] "%(count)d сообщения успешно деблокировано" +msgstr[2] "%(count)d сообщений успешно деблокировано" + #: extensions/amavis/management/commands/amnotify.py:61 msgid "[modoboa] Pending release requests" msgstr "[modoboa] Заявки для включения в следующий релиз" @@ -1706,44 +1782,55 @@ msgid "Banned" msgstr "" #: extensions/amavis/templates/amavis/main_action_bar.html:18 -#: extensions/amavis/templatetags/amavis_tags.py:19 -#: extensions/amavis/templatetags/amavis_tags.py:54 +#: extensions/amavis/templatetags/amavis_tags.py:24 +#: extensions/amavis/templatetags/amavis_tags.py:79 msgid "Release" msgstr "Деблокировать" #: extensions/amavis/templates/amavis/main_action_bar.html:23 -#: extensions/amavis/templatetags/amavis_tags.py:25 -#: extensions/amavis/templatetags/amavis_tags.py:61 +#: extensions/amavis/templatetags/amavis_tags.py:30 +#: extensions/amavis/templatetags/amavis_tags.py:86 #: extensions/webmail/templatetags/webmail_tags.py:32 msgid "Delete" msgstr "Удалить" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templatetags/amavis_tags.py:44 +#, fuzzy +msgid "Mark as spam" +msgstr "Пометить сообщение" + +#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templatetags/amavis_tags.py:49 +msgid "Mark as non-spam" +msgstr "" + +#: extensions/amavis/templates/amavis/main_action_bar.html:42 #: extensions/sievefilters/forms.py:64 msgid "All messages" msgstr "Все сообщения" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:42 msgid "All" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templates/amavis/main_action_bar.html:43 msgid "Spam only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templates/amavis/main_action_bar.html:44 msgid "Virus only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:34 +#: extensions/amavis/templates/amavis/main_action_bar.html:45 msgid "Bad Header only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:35 +#: extensions/amavis/templates/amavis/main_action_bar.html:46 msgid "Bad MIME only" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:36 +#: extensions/amavis/templates/amavis/main_action_bar.html:47 msgid "Banned only" msgstr "" @@ -1794,7 +1881,7 @@ msgstr "Действуйте согласно этого сообщения" msgid "Please visit %(listingurl)s for a full listing." msgstr "Для просмотра листинга посетите %(listingurl)s" -#: extensions/amavis/templatetags/amavis_tags.py:28 +#: extensions/amavis/templatetags/amavis_tags.py:35 msgid "View full headers" msgstr "Просмотр заголовков" @@ -2221,7 +2308,7 @@ msgstr "Отправитель" msgid "Recipient" msgstr "Получатель" -#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:83 +#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:84 msgid "Cc" msgstr "Копия" @@ -2475,19 +2562,19 @@ msgstr "Неизвестный графический набор " msgid "Bad custom period" msgstr "Не верный выбор периода" -#: extensions/stats/templates/stats/index.html:33 +#: extensions/stats/templates/stats/index.html:28 msgid "Search a domain" msgstr "Искать домен" -#: extensions/stats/templates/stats/index.html:37 +#: extensions/stats/templates/stats/index.html:32 msgid "Predefined time ranges" msgstr "Предопределенные временные диапазоны" -#: extensions/stats/templates/stats/index.html:44 +#: extensions/stats/templates/stats/index.html:39 msgid "Custom time range" msgstr "Пользовательские временные диапазоны" -#: extensions/stats/templates/stats/index.html:57 +#: extensions/stats/templates/stats/index.html:52 msgid "Apply" msgstr "Применить" @@ -2644,7 +2731,7 @@ msgstr "Ответ сервера" msgid "Unknown action" msgstr "Неизвестное действие" -#: extensions/webmail/forms.py:84 +#: extensions/webmail/forms.py:85 msgid "Cci" msgstr "Скрытая копия" @@ -2853,15 +2940,15 @@ msgstr "Нет" msgid "Failed to update password: %s" msgstr "Ошибка обновления пароля: %s" -#: lib/permissions.py:20 +#: lib/permissions.py:19 msgid "Simple user" msgstr "Обычный пользователь" -#: lib/permissions.py:22 +#: lib/permissions.py:21 msgid "Super administrator" msgstr "Супер администратор" -#: lib/permissions.py:28 +#: lib/permissions.py:27 msgid "Domain administrator" msgstr "Администратор домена" diff --git a/modoboa/locale/sv/LC_MESSAGES/django.po b/modoboa/locale/sv/LC_MESSAGES/django.po index 775c322ed..a38ca26f7 100644 --- a/modoboa/locale/sv/LC_MESSAGES/django.po +++ b/modoboa/locale/sv/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:28+0200\n" +"POT-Creation-Date: 2014-10-29 13:25+0100\n" "PO-Revision-Date: 2013-09-27 08:19+0000\n" "Last-Translator: ogg1980 \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/modoboa/language/" @@ -21,8 +21,8 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: core/__init__.py:52 core/__init__.py:53 -#: extensions/admin/forms/account.py:326 extensions/admin/forms/domain.py:256 -#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:129 +#: extensions/admin/forms/account.py:327 extensions/admin/forms/domain.py:248 +#: extensions/admin/views/domain.py:97 extensions/admin/views/identity.py:133 #: extensions/postfix_autoreply/app_settings.py:11 #: extensions/postfix_relay_domains/forms.py:138 #: extensions/sievefilters/app_settings.py:50 @@ -288,8 +288,8 @@ msgstr "Ogiltig förfrågan" msgid "This field is required" msgstr "Detta fält är obligatoriskt" -#: core/app_settings.py:349 extensions/amavis/app_settings.py:87 -#: extensions/amavis/templates/amavis/main_action_bar.html:29 +#: core/app_settings.py:349 extensions/amavis/app_settings.py:149 +#: extensions/amavis/templates/amavis/main_action_bar.html:40 #: extensions/webmail/app_settings.py:73 msgid "Display" msgstr "Visning" @@ -345,36 +345,36 @@ msgstr "Senaste inloggad" msgid "You can't delete your own account" msgstr "Du kan inte radera ditt eget konto" -#: core/models.py:117 +#: core/models.py:130 msgid "Failed to update password: LDAP module not installed" msgstr "Misslyckades med att uppdatera lösenord: LDAP modul ej installerad" -#: core/models.py:170 +#: core/models.py:183 msgid "account" msgstr "konto" -#: core/models.py:321 extensions/admin/models/domain.py:144 +#: core/models.py:334 extensions/admin/models/domain.py:144 #: extensions/admin/models/domain_alias.py:39 #: extensions/postfix_relay_domains/models.py:134 #: extensions/postfix_relay_domains/models.py:190 msgid "Invalid line" msgstr "Ogiltig rad" -#: core/models.py:325 +#: core/models.py:338 msgid "You can't import an account with a role greater than yours" msgstr "Du kan inte importera konto med en roll större än din" -#: core/models.py:337 +#: core/models.py:350 #, python-format msgid "The simple user '%s' must have a valid email address" msgstr "Den enkla användaren '%s' måste ha en gällande e-postadress" -#: core/models.py:341 +#: core/models.py:354 #, python-format msgid "username and email fields must not differ for '%s'" msgstr "användarnamn och e-post fält får inte avvika för '%s'" -#: core/models.py:410 extensions/admin/models/alias.py:35 +#: core/models.py:423 extensions/admin/models/alias.py:35 #: extensions/admin/models/domain.py:32 #: extensions/admin/models/domain_alias.py:17 #: extensions/postfix_autoreply/models.py:28 @@ -383,29 +383,29 @@ msgstr "användarnamn och e-post fält får inte avvika för '%s'" msgid "enabled" msgstr "aktiverad" -#: core/models.py:411 +#: core/models.py:424 msgid "Check to enable this extension" msgstr "Markera för att aktivera detta tillägg" -#: core/models.py:491 +#: core/models.py:504 msgid "added" msgstr "tillagd" -#: core/models.py:494 +#: core/models.py:507 msgid "modified" msgstr "ändrad" -#: core/models.py:496 core/models.py:521 +#: core/models.py:509 core/models.py:534 #, python-format msgid "%(object)s '%(name)s' %(action)s by user %(user)s" msgstr "%(object)s '%(name)s' %(action)s av användare %(user)s" -#: core/models.py:523 +#: core/models.py:536 msgid "deleted" msgstr "raderad" #: core/tables.py:8 core/templates/core/information.html:8 -#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:187 +#: extensions/admin/tables.py:9 extensions/admin/forms/domain.py:179 #: extensions/admin/templates/admin/domains_table.html:5 #: extensions/admin/templates/admin/editdomainform.html:13 #: extensions/admin/templates/admin/identities_table.html:5 @@ -521,7 +521,7 @@ msgstr "Uppdatera personlig information" #: core/templates/core/user_profile.html:8 #: extensions/admin/templates/admin/forward.html:8 #: extensions/admin/views/alias.py:112 extensions/admin/views/domain.py:168 -#: extensions/admin/views/identity.py:200 +#: extensions/admin/views/identity.py:204 #: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9 #: extensions/postfix_relay_domains/views.py:66 #: extensions/sievefilters/views.py:166 extensions/webmail/views.py:172 @@ -648,7 +648,7 @@ msgstr "Vidarebefordra" msgid "Account import failed (%s): domain does not exist" msgstr "Konto import misslyckades (%s): domänen existerar inte" -#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:196 +#: extensions/admin/__init__.py:172 extensions/admin/forms/account.py:197 #, python-format msgid "Mailbox %s already exists" msgstr "Brevlåda %s finns redan" @@ -658,6 +658,13 @@ msgstr "Brevlåda %s finns redan" msgid "Account import failed (%s): wrong quota value" msgstr "Konto import misslyckades (%s): domänen existerar inte" +#: extensions/admin/__init__.py:212 extensions/admin/forms/domain.py:75 +#: extensions/postfix_relay_domains/forms.py:50 +#: extensions/postfix_relay_domains/forms.py:70 +#, fuzzy +msgid "domain alias" +msgstr "Domän alias" + #: extensions/admin/app_settings.py:13 #: extensions/admin/templates/admin/editdomainform.html:25 #: extensions/limits/app_settings.py:31 extensions/limits/models.py:23 @@ -706,7 +713,7 @@ msgid "When a mailbox is removed, also remove the associated account" msgstr "När en brevlåda raderas, radera också tillhörande konto" #: extensions/admin/app_settings.py:81 extensions/admin/forms/account.py:178 -#: extensions/admin/forms/domain.py:56 +#: extensions/admin/forms/domain.py:57 msgid "Must be a positive integer" msgstr "" @@ -754,7 +761,7 @@ msgstr "Du kan inte inaktivera ditt eget konto" msgid "E-mail" msgstr "E-post" -#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:17 +#: extensions/admin/forms/account.py:113 extensions/admin/forms/domain.py:18 msgid "Quota" msgstr "Kvota" @@ -768,7 +775,7 @@ msgstr "" "domänens förvalda. Lämna tomt för att definiera ett obegränsat värde (ej " "tillåtet för domänadministratörer)." -#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:26 +#: extensions/admin/forms/account.py:123 extensions/admin/forms/domain.py:27 #: extensions/admin/templates/admin/domains_table.html:6 #: extensions/postfix_relay_domains/forms.py:12 msgid "Alias(es)" @@ -784,25 +791,25 @@ msgstr "" "lägga till ny rad. Använd '*' för att skapa ett 'catchall' alias (ex: " "*@domain.tld)." -#: extensions/admin/forms/account.py:187 extensions/admin/forms/account.py:217 +#: extensions/admin/forms/account.py:188 extensions/admin/forms/account.py:218 #: extensions/admin/forms/alias.py:65 msgid "Domain does not exist" msgstr "Domän existerar inte" -#: extensions/admin/forms/account.py:284 +#: extensions/admin/forms/account.py:285 msgid "Domain(s)" msgstr "Domän(er)" -#: extensions/admin/forms/account.py:286 +#: extensions/admin/forms/account.py:287 msgid "Domain(s) that user administrates" msgstr "Domän(er) användaren administrerar" -#: extensions/admin/forms/account.py:328 -#: extensions/admin/views/identity.py:132 +#: extensions/admin/forms/account.py:329 +#: extensions/admin/views/identity.py:136 msgid "Mail" msgstr "Post" -#: extensions/admin/forms/account.py:330 +#: extensions/admin/forms/account.py:331 msgid "Permissions" msgstr "Rättigheter" @@ -852,14 +859,14 @@ msgstr "Mottagare %s finns redan" msgid "No recipient defined" msgstr "Ingen mottagare definierad" -#: extensions/admin/forms/domain.py:20 +#: extensions/admin/forms/domain.py:21 #, fuzzy msgid "" "Default quota in MB applied to mailboxes. Leave empty to use the default " "value." msgstr "Standard kvota i MB applicerad för brevlådor" -#: extensions/admin/forms/domain.py:29 +#: extensions/admin/forms/domain.py:30 msgid "" "Alias(es) of this domain. Indicate only one name per input, press ENTER to " "add a new input." @@ -867,36 +874,29 @@ msgstr "" "Alias för denna domän. Ange endast ett namn per rad, tryck ENTER för att " "lägga till en rad." -#: extensions/admin/forms/domain.py:75 -#: extensions/postfix_relay_domains/forms.py:50 -#: extensions/postfix_relay_domains/forms.py:70 -#, fuzzy -msgid "domain alias" -msgstr "Domän alias" - -#: extensions/admin/forms/domain.py:82 extensions/admin/forms/domain.py:98 +#: extensions/admin/forms/domain.py:78 extensions/admin/forms/domain.py:92 #: extensions/postfix_relay_domains/forms.py:58 #: extensions/postfix_relay_domains/forms.py:78 #, fuzzy, python-format msgid "A %s with this name already exists" msgstr "Alias med detta namn existerar redan" -#: extensions/admin/forms/domain.py:92 +#: extensions/admin/forms/domain.py:89 #: extensions/postfix_relay_domains/forms.py:49 #: extensions/postfix_relay_domains/forms.py:71 #, fuzzy msgid "domain" msgstr "Domäner" -#: extensions/admin/forms/domain.py:181 +#: extensions/admin/forms/domain.py:173 msgid "Create a domain administrator" msgstr "Skapa en domän administratör" -#: extensions/admin/forms/domain.py:183 +#: extensions/admin/forms/domain.py:175 msgid "Automatically create an administrator for this domain" msgstr "Skapa en domän administratör automatiskt för denna domän" -#: extensions/admin/forms/domain.py:190 +#: extensions/admin/forms/domain.py:182 msgid "" "The administrator's name. Don't include the domain's name here, it will be " "automatically appended." @@ -904,19 +904,19 @@ msgstr "" "Administratörens namn. Inkludera inte domänens namn här, den kommer att " "läggas till automatiskt." -#: extensions/admin/forms/domain.py:198 +#: extensions/admin/forms/domain.py:190 msgid "Create aliases" msgstr "Skapa alias." -#: extensions/admin/forms/domain.py:200 +#: extensions/admin/forms/domain.py:192 msgid "Automatically create standard aliases for this domain" msgstr "Skapa automatiskt standard alias för den här domänen" -#: extensions/admin/forms/domain.py:216 +#: extensions/admin/forms/domain.py:208 msgid "Invalid format" msgstr "Ogiltigt format" -#: extensions/admin/forms/domain.py:230 +#: extensions/admin/forms/domain.py:222 #, python-format msgid "User '%s' already exists" msgstr "Användare '%s' finns redan" @@ -953,7 +953,7 @@ msgstr "" "Du kan inte definiera en vidarebefordring till en lokal destination. Be din " "administratör att skapa ett alias istället." -#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:198 +#: extensions/admin/forms/import_.py:6 extensions/webmail/forms.py:200 msgid "Select a file" msgstr "Välj en fil" @@ -973,7 +973,7 @@ msgstr "Krypterade lösenord" msgid "Check this option if passwords contained in your file are not crypted" msgstr "Markera det här alternativet om lösenord i filen inte är krypterad" -#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:62 +#: extensions/admin/models/alias.py:18 extensions/admin/models/mailbox.py:74 msgid "address" msgstr "adress" @@ -1072,21 +1072,21 @@ msgstr "Domän dit detta alias pekar mot" msgid "Unknown domain %s" msgstr "Okänt kommando %s" -#: extensions/admin/models/mailbox.py:63 +#: extensions/admin/models/mailbox.py:75 msgid "Mailbox address (without the @domain.tld part)" msgstr "Brevlåde adress (utan @domain.tld)" -#: extensions/admin/models/mailbox.py:125 +#: extensions/admin/models/mailbox.py:136 #, python-format msgid "Failed to retrieve mailbox location (%s)" msgstr "Kunde inte hitta brevlådans sökväg (%s)" -#: extensions/admin/models/mailbox.py:194 +#: extensions/admin/models/mailbox.py:221 #, python-format msgid "Quota is greater than the allowed domain's limit (%dM)" msgstr "Kvotan är större än domänens gräns (%dM)" -#: extensions/admin/models/mailbox.py:199 +#: extensions/admin/models/mailbox.py:227 msgid "A quota is required" msgstr "En kvota krävs" @@ -1159,7 +1159,7 @@ msgid "Importing..." msgstr "Importerar..." #: extensions/admin/templates/admin/listing.html:14 -#: extensions/stats/templates/stats/index.html:28 +#: extensions/stats/templates/stats/index.html:23 msgid "Filter" msgstr "Filter" @@ -1261,8 +1261,8 @@ msgid "Alias with this name already exists" msgstr "Alias med detta namn existerar redan" #: extensions/admin/views/alias.py:50 extensions/admin/views/domain.py:102 -#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:133 -#: extensions/admin/views/identity.py:160 +#: extensions/admin/views/domain.py:131 extensions/admin/views/identity.py:137 +#: extensions/admin/views/identity.py:164 #: extensions/postfix_relay_domains/views.py:34 #: extensions/sievefilters/views.py:144 extensions/sievefilters/views.py:233 #: extensions/webmail/views.py:153 @@ -1305,7 +1305,7 @@ msgstr "Vidarebefodring ändrad" msgid "Alias modified" msgstr "Alias ändrat" -#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:130 +#: extensions/admin/views/domain.py:98 extensions/admin/views/identity.py:134 msgid "Next" msgstr "Nästa" @@ -1313,7 +1313,7 @@ msgstr "Nästa" msgid "Options" msgstr "Inställningar" -#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:134 +#: extensions/admin/views/domain.py:103 extensions/admin/views/identity.py:138 msgid "Previous" msgstr "Föregående" @@ -1347,11 +1347,11 @@ msgstr "Exportera konton" msgid "Export domains" msgstr "Exportera domäner" -#: extensions/admin/views/identity.py:104 -#: extensions/admin/views/identity.py:227 -#: extensions/admin/views/identity.py:232 extensions/amavis/views.py:144 -#: extensions/amavis/views.py:148 extensions/amavis/views.py:181 -#: extensions/amavis/views.py:186 extensions/amavis/views.py:188 +#: extensions/admin/views/identity.py:108 +#: extensions/admin/views/identity.py:231 +#: extensions/admin/views/identity.py:236 extensions/amavis/views.py:147 +#: extensions/amavis/views.py:151 extensions/amavis/views.py:184 +#: extensions/amavis/views.py:189 extensions/amavis/views.py:191 #: extensions/webmail/views.py:49 extensions/webmail/views.py:67 #: extensions/webmail/views.py:81 extensions/webmail/views.py:99 #: extensions/webmail/views.py:116 extensions/webmail/views.py:202 @@ -1362,19 +1362,19 @@ msgstr "Exportera domäner" msgid "Invalid request" msgstr "Ogiltig förfrågan" -#: extensions/admin/views/identity.py:151 +#: extensions/admin/views/identity.py:155 msgid "Account created" msgstr "Konto skapat" -#: extensions/admin/views/identity.py:157 +#: extensions/admin/views/identity.py:161 msgid "New account" msgstr "Nytt konto" -#: extensions/admin/views/identity.py:193 +#: extensions/admin/views/identity.py:197 msgid "Account updated" msgstr "Konto uppdaterat" -#: extensions/admin/views/identity.py:217 +#: extensions/admin/views/identity.py:221 msgid "Account deleted" msgid_plural "Accounts deleted" msgstr[0] "Konto raderat" @@ -1457,7 +1457,7 @@ msgstr "Vidarebefordring uppdaterad" msgid "Simple amavis management frontend" msgstr "Enkel amavis hantering frontend" -#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:18 +#: extensions/amavis/__init__.py:52 extensions/amavis/general_callbacks.py:20 msgid "Quarantine" msgstr "Karantän" @@ -1549,28 +1549,96 @@ msgstr "Notifierings avsändare" msgid "The e-mail address used to send notitications" msgstr "E-postadress att använda för att skicka notifikationer" -#: extensions/amavis/app_settings.py:91 extensions/webmail/app_settings.py:91 +#: extensions/amavis/app_settings.py:77 +#: extensions/amavis/templates/amavis/main_action_bar.html:27 +msgid "Manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:80 +msgid "Enable manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:83 +msgid "Allow super administrators to manually train Spamassassin" +msgstr "" + +#: extensions/amavis/app_settings.py:88 +msgid "Is Spamassassin local?" +msgstr "" + +#: extensions/amavis/app_settings.py:91 +msgid "Tell if Spamassassin is running on the same server than modoboa" +msgstr "" + +#: extensions/amavis/app_settings.py:96 +#, fuzzy +msgid "Default user" +msgstr "Standard editor" + +#: extensions/amavis/app_settings.py:99 +msgid "Name of the user owning the default bayesian database" +msgstr "" + +#: extensions/amavis/app_settings.py:104 +#, fuzzy +msgid "Spamd address" +msgstr "Från adress" + +#: extensions/amavis/app_settings.py:106 +msgid "The IP address where spamd can be reached" +msgstr "" + +#: extensions/amavis/app_settings.py:110 +#, fuzzy +msgid "Spamd port" +msgstr "Skräp" + +#: extensions/amavis/app_settings.py:112 +msgid "The TCP port spamd is listening on" +msgstr "" + +#: extensions/amavis/app_settings.py:116 +msgid "Enable per-domain manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:119 +msgid "" +"Allow domain administrators to train Spamassassin (within dedicated per-" +"domain databases)" +msgstr "" + +#: extensions/amavis/app_settings.py:125 +msgid "Enable per-user manual learning" +msgstr "" + +#: extensions/amavis/app_settings.py:128 +msgid "" +"Allow simple users to personally train Spamassassin (within a dedicated " +"database)" +msgstr "" + +#: extensions/amavis/app_settings.py:153 extensions/webmail/app_settings.py:91 msgid "Number of displayed emails per page" msgstr "Antalet visade e-postmeddelanden per sida" -#: extensions/amavis/app_settings.py:92 +#: extensions/amavis/app_settings.py:154 msgid "Set the maximum number of messages displayed in a page" msgstr "Anger det maximala antalet meddelanden som visas på en sida" -#: extensions/amavis/general_callbacks.py:82 +#: extensions/amavis/general_callbacks.py:136 msgid "pending requests" msgstr "väntande förfrågningar" -#: extensions/amavis/general_callbacks.py:125 +#: extensions/amavis/general_callbacks.py:179 #, fuzzy msgid "Pending requests" msgstr "väntande förfrågningar" -#: extensions/amavis/general_callbacks.py:135 +#: extensions/amavis/general_callbacks.py:189 msgid "Content filter" msgstr "Innehålls filter" -#: extensions/amavis/lib.py:56 +#: extensions/amavis/lib.py:60 #, python-format msgid "Connection to amavis failed: %s" msgstr "Anslutning till amavis misslyckades: %s" @@ -1638,8 +1706,8 @@ msgid "Score" msgstr "" #: extensions/amavis/sql_listing.py:33 -#: extensions/amavis/templatetags/amavis_tags.py:75 -#: extensions/webmail/forms.py:82 +#: extensions/amavis/templatetags/amavis_tags.py:100 +#: extensions/webmail/forms.py:83 msgid "To" msgstr "Till" @@ -1650,49 +1718,56 @@ msgid "From" msgstr "Från" #: extensions/amavis/sql_listing.py:40 extensions/sievefilters/forms.py:77 -#: extensions/webmail/forms.py:86 extensions/webmail/lib/imapemail.py:288 +#: extensions/webmail/forms.py:87 extensions/webmail/lib/imapemail.py:288 #: extensions/webmail/lib/listing.py:27 extensions/webmail/lib/tables.py:26 #: templates/common/email_searchbar.html:6 msgid "Subject" msgstr "Ämne" -#: extensions/amavis/views.py:27 +#: extensions/amavis/views.py:30 msgid "Empty quarantine" msgstr "Karantän tom" -#: extensions/amavis/views.py:149 +#: extensions/amavis/views.py:152 msgid "Message deleted" msgstr "Meddelande raderat" -#: extensions/amavis/views.py:168 +#: extensions/amavis/views.py:171 #, python-format msgid "%(count)d message deleted successfully" msgid_plural "%(count)d messages deleted successfully" msgstr[0] "%(count)d meddelande raderadat" msgstr[1] "%(count)d meddelanden raderade" -#: extensions/amavis/views.py:191 +#: extensions/amavis/views.py:194 msgid "Request sent" msgstr "Begäran skickad" -#: extensions/amavis/views.py:197 +#: extensions/amavis/views.py:200 msgid "Message released" msgstr "Meddelande släppt" -#: extensions/amavis/views.py:225 +#: extensions/amavis/views.py:228 #, python-format msgid "%(count)d request sent" msgid_plural "%(count)d requests sent" msgstr[0] "%(count)d förfrågning skickad" msgstr[1] "%(count)d förfrågningar skickadade" -#: extensions/amavis/views.py:246 +#: extensions/amavis/views.py:249 #, python-format msgid "%(count)d message released successfully" msgid_plural "%(count)d messages released successfully" msgstr[0] "%(count)d meddelande frisläppt" msgstr[1] "%(count)d meddelanden frisläppta" +#: extensions/amavis/views.py:282 +#, fuzzy, python-format +msgid "%(count)d message processed successfully" +msgid_plural "%(count)d messages processed successfully" +msgstr[0] "%(count)d meddelande frisläppt" +msgstr[1] "%(count)d meddelanden frisläppta" + #: extensions/amavis/management/commands/amnotify.py:61 msgid "[modoboa] Pending release requests" msgstr "[modoboa] Väntande release förfrågningar" @@ -1741,48 +1816,59 @@ msgid "Banned" msgstr "Förbjudna filter" #: extensions/amavis/templates/amavis/main_action_bar.html:18 -#: extensions/amavis/templatetags/amavis_tags.py:19 -#: extensions/amavis/templatetags/amavis_tags.py:54 +#: extensions/amavis/templatetags/amavis_tags.py:24 +#: extensions/amavis/templatetags/amavis_tags.py:79 msgid "Release" msgstr "Släpp" #: extensions/amavis/templates/amavis/main_action_bar.html:23 -#: extensions/amavis/templatetags/amavis_tags.py:25 -#: extensions/amavis/templatetags/amavis_tags.py:61 +#: extensions/amavis/templatetags/amavis_tags.py:30 +#: extensions/amavis/templatetags/amavis_tags.py:86 #: extensions/webmail/templatetags/webmail_tags.py:32 msgid "Delete" msgstr "Radera" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templatetags/amavis_tags.py:44 +#, fuzzy +msgid "Mark as spam" +msgstr "Markera meddelande" + +#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templatetags/amavis_tags.py:49 +msgid "Mark as non-spam" +msgstr "" + +#: extensions/amavis/templates/amavis/main_action_bar.html:42 #: extensions/sievefilters/forms.py:64 msgid "All messages" msgstr "Alla meddelanden" -#: extensions/amavis/templates/amavis/main_action_bar.html:31 +#: extensions/amavis/templates/amavis/main_action_bar.html:42 msgid "All" msgstr "" -#: extensions/amavis/templates/amavis/main_action_bar.html:32 +#: extensions/amavis/templates/amavis/main_action_bar.html:43 #, fuzzy msgid "Spam only" msgstr "Skräp" -#: extensions/amavis/templates/amavis/main_action_bar.html:33 +#: extensions/amavis/templates/amavis/main_action_bar.html:44 #, fuzzy msgid "Virus only" msgstr "Virus" -#: extensions/amavis/templates/amavis/main_action_bar.html:34 +#: extensions/amavis/templates/amavis/main_action_bar.html:45 #, fuzzy msgid "Bad Header only" msgstr "Dålig rubrik" -#: extensions/amavis/templates/amavis/main_action_bar.html:35 +#: extensions/amavis/templates/amavis/main_action_bar.html:46 #, fuzzy msgid "Bad MIME only" msgstr "Dålig MIME" -#: extensions/amavis/templates/amavis/main_action_bar.html:36 +#: extensions/amavis/templates/amavis/main_action_bar.html:47 #, fuzzy msgid "Banned only" msgstr "Förbjudna filter" @@ -1831,7 +1917,7 @@ msgstr "Agera på detta meddelande:" msgid "Please visit %(listingurl)s for a full listing." msgstr "Besök %(listingurl)s för full lista." -#: extensions/amavis/templatetags/amavis_tags.py:28 +#: extensions/amavis/templatetags/amavis_tags.py:35 msgid "View full headers" msgstr "Visa meddelandehuvuden" @@ -2278,7 +2364,7 @@ msgstr "Avsändare" msgid "Recipient" msgstr "Mottagare" -#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:83 +#: extensions/sievefilters/forms.py:80 extensions/webmail/forms.py:84 msgid "Cc" msgstr "Cc" @@ -2536,19 +2622,19 @@ msgstr "Okänt grafisk uppsättning" msgid "Bad custom period" msgstr "Ogiltig anpassad tid" -#: extensions/stats/templates/stats/index.html:33 +#: extensions/stats/templates/stats/index.html:28 msgid "Search a domain" msgstr "Sök en domän" -#: extensions/stats/templates/stats/index.html:37 +#: extensions/stats/templates/stats/index.html:32 msgid "Predefined time ranges" msgstr "Fördefinierade tidsområden" -#: extensions/stats/templates/stats/index.html:44 +#: extensions/stats/templates/stats/index.html:39 msgid "Custom time range" msgstr "Anpassat tidsintervall" -#: extensions/stats/templates/stats/index.html:57 +#: extensions/stats/templates/stats/index.html:52 msgid "Apply" msgstr "Applicera" @@ -2705,7 +2791,7 @@ msgstr "Server svar" msgid "Unknown action" msgstr "Okänd åtgärd" -#: extensions/webmail/forms.py:84 +#: extensions/webmail/forms.py:85 msgid "Cci" msgstr "BCC" @@ -2912,15 +2998,15 @@ msgstr "Nej" msgid "Failed to update password: %s" msgstr "Misslyckades med att uppdatera lösenord: %s" -#: lib/permissions.py:20 +#: lib/permissions.py:19 msgid "Simple user" msgstr "Enkel användare" -#: lib/permissions.py:22 +#: lib/permissions.py:21 msgid "Super administrator" msgstr "Super administratör" -#: lib/permissions.py:28 +#: lib/permissions.py:27 msgid "Domain administrator" msgstr "Domän administratör" From 11601b535823f8b94c3ee0812fb7c10414cb34f5 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 29 Oct 2014 20:20:48 +0100 Subject: [PATCH 05/27] Documentation. see #622 --- doc/getting_started/plugins.rst | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/doc/getting_started/plugins.rst b/doc/getting_started/plugins.rst index 21334ce6c..6b7394c3f 100644 --- a/doc/getting_started/plugins.rst +++ b/doc/getting_started/plugins.rst @@ -353,16 +353,19 @@ learning levels: #. Global: available to administrators only. A single (global) bayes database is shared between everyone. +#. Per domain: available to administrators and domain + administrators. Each domain can have a dedicated database. + #. Per user: each user can create its own database to customize the way SpamAssassin will detect spam. -The per-user level is not activated by default, a dedicated parameter -is available through the panel. +The domain and user levels are not activated by default, dedicated +parameters are available through the panel. .. note:: - A user database is only created the first time that user calls the - learning feature through the quarantine. + Domain and user databases are only created the first time someone + calls the learning feature through the quarantine. .. warning:: From 7508f13beb6286a89af12f9b4ca8c239e4d26738 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 29 Oct 2014 20:24:50 +0100 Subject: [PATCH 06/27] Translation update. --- modoboa/locale/cs_CZ/LC_MESSAGES/djangojs.po | 36 ++++++++++---- modoboa/locale/de/LC_MESSAGES/djangojs.po | 47 +++++++++++++----- modoboa/locale/en/LC_MESSAGES/djangojs.po | 34 +++++++++---- modoboa/locale/es/LC_MESSAGES/djangojs.po | 36 ++++++++++---- modoboa/locale/fr/LC_MESSAGES/djangojs.po | 34 +++++++++---- modoboa/locale/it/LC_MESSAGES/djangojs.po | 36 ++++++++++---- modoboa/locale/nl_NL/LC_MESSAGES/djangojs.po | 51 ++++++++++++++------ modoboa/locale/pt_PT/LC_MESSAGES/djangojs.po | 36 ++++++++++---- modoboa/locale/ru/LC_MESSAGES/djangojs.po | 36 ++++++++++---- modoboa/locale/sv/LC_MESSAGES/djangojs.po | 36 ++++++++++---- 10 files changed, 283 insertions(+), 99 deletions(-) diff --git a/modoboa/locale/cs_CZ/LC_MESSAGES/djangojs.po b/modoboa/locale/cs_CZ/LC_MESSAGES/djangojs.po index 8908fccfb..a157061c8 100644 --- a/modoboa/locale/cs_CZ/LC_MESSAGES/djangojs.po +++ b/modoboa/locale/cs_CZ/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: modoboa-1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:33+0200\n" +"POT-Creation-Date: 2014-10-29 20:22+0100\n" "PO-Revision-Date: 2013-09-29 22:13+0100\n" "Last-Translator: Miroslav Abrahám \n" "Language-Team: CS \n" @@ -41,33 +41,51 @@ msgstr "" msgid "No domain administrator defined" msgstr "Není určen správce domény" -#: extensions/admin/static/admin/js/admin.js:291 +#: extensions/admin/static/admin/js/admin.js:292 msgid "Do not delete mailbox directory" msgstr "Nemazat adresář schránky" -#: extensions/amavis/static/amavis/js/quarantine.js:180 +#: extensions/amavis/static/amavis/js/quarantine.js:211 msgid "Release this selection?" msgstr "Odblokovat tento výběr?" -#: extensions/amavis/static/amavis/js/quarantine.js:184 +#: extensions/amavis/static/amavis/js/quarantine.js:215 msgid "Delete this selection?" msgstr "Smazat tento výběr?" -#: extensions/amavis/static/amavis/js/quarantine.js:203 +#: extensions/amavis/static/amavis/js/quarantine.js:255 +#, fuzzy +msgid "Mark this selection as spam?" +msgstr "Odblokovat tento výběr?" + +#: extensions/amavis/static/amavis/js/quarantine.js:270 +#, fuzzy +msgid "Mark this selection as non-spam?" +msgstr "Odblokovat tento výběr?" + +#: extensions/amavis/static/amavis/js/quarantine.js:295 #: extensions/amavis/static/amavis/js/selfservice.js:17 msgid "Release this message?" msgstr "Odblokovat tuto zprávu?" -#: extensions/amavis/static/amavis/js/quarantine.js:207 +#: extensions/amavis/static/amavis/js/quarantine.js:299 #: extensions/amavis/static/amavis/js/selfservice.js:21 msgid "Delete this message?" msgstr "Smazat tuto zprávu?" -#: extensions/amavis/static/amavis/js/quarantine.js:224 +#: extensions/amavis/static/amavis/js/quarantine.js:314 +msgid "Mark as spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:330 +msgid "Mark as non-spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:348 msgid "View full headers" msgstr "Zobrazit úplné záhlaví" -#: extensions/amavis/static/amavis/js/quarantine.js:229 +#: extensions/amavis/static/amavis/js/quarantine.js:353 msgid "Hide full headers" msgstr "Skrýt záhlaví" @@ -96,7 +114,7 @@ msgstr "Aktivovat tuto sadu filtrů?" msgid "active" msgstr "aktivní" -#: extensions/stats/static/stats/js/stats.js:37 +#: extensions/stats/static/stats/js/stats.js:38 msgid "Search a domain" msgstr "Vyhledat doménu" diff --git a/modoboa/locale/de/LC_MESSAGES/djangojs.po b/modoboa/locale/de/LC_MESSAGES/djangojs.po index ff8b53848..4aabff323 100644 --- a/modoboa/locale/de/LC_MESSAGES/djangojs.po +++ b/modoboa/locale/de/LC_MESSAGES/djangojs.po @@ -1,21 +1,22 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Patrick Koetter , 2010 msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:32+0200\n" +"POT-Creation-Date: 2014-10-29 20:22+0100\n" "PO-Revision-Date: 2013-12-15 09:23+0000\n" "Last-Translator: Antoine Nguyen \n" -"Language-Team: German (http://www.transifex.com/projects/p/modoboa/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/modoboa/language/" +"de/)\n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: extensions/admin/static/admin/js/admin.js:32 @@ -34,39 +35,59 @@ msgstr "Diese Aktion wird ALLE mit der Domain verbundenen Daten löschen." msgid "" "This operation will remove all data associated to this domain, excepting " "accounts." -msgstr "Diese Aktion wird ALLE mit der Domain verbundenen Daten löschen - ausser Mailkonten." +msgstr "" +"Diese Aktion wird ALLE mit der Domain verbundenen Daten löschen - ausser " +"Mailkonten." #: extensions/admin/static/admin/js/admin.js:222 msgid "No domain administrator defined" msgstr "Domain-Administrator fehlt" -#: extensions/admin/static/admin/js/admin.js:291 +#: extensions/admin/static/admin/js/admin.js:292 msgid "Do not delete mailbox directory" msgstr "Verzeichnis der Mailbox nicht löschen" -#: extensions/amavis/static/amavis/js/quarantine.js:180 +#: extensions/amavis/static/amavis/js/quarantine.js:211 msgid "Release this selection?" msgstr "Diese Auswahl freilassen?" -#: extensions/amavis/static/amavis/js/quarantine.js:184 +#: extensions/amavis/static/amavis/js/quarantine.js:215 msgid "Delete this selection?" msgstr "Diese Auswahl löschen?" -#: extensions/amavis/static/amavis/js/quarantine.js:203 +#: extensions/amavis/static/amavis/js/quarantine.js:255 +#, fuzzy +msgid "Mark this selection as spam?" +msgstr "Diese Auswahl freilassen?" + +#: extensions/amavis/static/amavis/js/quarantine.js:270 +#, fuzzy +msgid "Mark this selection as non-spam?" +msgstr "Diese Auswahl freilassen?" + +#: extensions/amavis/static/amavis/js/quarantine.js:295 #: extensions/amavis/static/amavis/js/selfservice.js:17 msgid "Release this message?" msgstr "Diese Nachricht freilassen?" -#: extensions/amavis/static/amavis/js/quarantine.js:207 +#: extensions/amavis/static/amavis/js/quarantine.js:299 #: extensions/amavis/static/amavis/js/selfservice.js:21 msgid "Delete this message?" msgstr "Diese Nachricht löschen?" -#: extensions/amavis/static/amavis/js/quarantine.js:224 +#: extensions/amavis/static/amavis/js/quarantine.js:314 +msgid "Mark as spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:330 +msgid "Mark as non-spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:348 msgid "View full headers" msgstr "Vollansicht Header anzeigen" -#: extensions/amavis/static/amavis/js/quarantine.js:229 +#: extensions/amavis/static/amavis/js/quarantine.js:353 msgid "Hide full headers" msgstr "Vollansicht Header ausblenden" @@ -95,7 +116,7 @@ msgstr "Diesen Filter aktivieren?" msgid "active" msgstr "aktiv" -#: extensions/stats/static/stats/js/stats.js:37 +#: extensions/stats/static/stats/js/stats.js:38 msgid "Search a domain" msgstr "Domain suchen" diff --git a/modoboa/locale/en/LC_MESSAGES/djangojs.po b/modoboa/locale/en/LC_MESSAGES/djangojs.po index 530dd8b34..225d3f316 100644 --- a/modoboa/locale/en/LC_MESSAGES/djangojs.po +++ b/modoboa/locale/en/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:32+0200\n" +"POT-Creation-Date: 2014-10-29 20:22+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -39,33 +39,49 @@ msgstr "" msgid "No domain administrator defined" msgstr "" -#: extensions/admin/static/admin/js/admin.js:291 +#: extensions/admin/static/admin/js/admin.js:292 msgid "Do not delete mailbox directory" msgstr "" -#: extensions/amavis/static/amavis/js/quarantine.js:180 +#: extensions/amavis/static/amavis/js/quarantine.js:211 msgid "Release this selection?" msgstr "" -#: extensions/amavis/static/amavis/js/quarantine.js:184 +#: extensions/amavis/static/amavis/js/quarantine.js:215 msgid "Delete this selection?" msgstr "" -#: extensions/amavis/static/amavis/js/quarantine.js:203 +#: extensions/amavis/static/amavis/js/quarantine.js:255 +msgid "Mark this selection as spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:270 +msgid "Mark this selection as non-spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:295 #: extensions/amavis/static/amavis/js/selfservice.js:17 msgid "Release this message?" msgstr "" -#: extensions/amavis/static/amavis/js/quarantine.js:207 +#: extensions/amavis/static/amavis/js/quarantine.js:299 #: extensions/amavis/static/amavis/js/selfservice.js:21 msgid "Delete this message?" msgstr "" -#: extensions/amavis/static/amavis/js/quarantine.js:224 +#: extensions/amavis/static/amavis/js/quarantine.js:314 +msgid "Mark as spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:330 +msgid "Mark as non-spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:348 msgid "View full headers" msgstr "" -#: extensions/amavis/static/amavis/js/quarantine.js:229 +#: extensions/amavis/static/amavis/js/quarantine.js:353 msgid "Hide full headers" msgstr "" @@ -94,7 +110,7 @@ msgstr "" msgid "active" msgstr "" -#: extensions/stats/static/stats/js/stats.js:37 +#: extensions/stats/static/stats/js/stats.js:38 msgid "Search a domain" msgstr "" diff --git a/modoboa/locale/es/LC_MESSAGES/djangojs.po b/modoboa/locale/es/LC_MESSAGES/djangojs.po index 861ac1cb4..07e2924ad 100644 --- a/modoboa/locale/es/LC_MESSAGES/djangojs.po +++ b/modoboa/locale/es/LC_MESSAGES/djangojs.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:32+0200\n" +"POT-Creation-Date: 2014-10-29 20:22+0100\n" "PO-Revision-Date: 2013-06-03 16:32+0000\n" "Last-Translator: Pedro Gracia \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/modoboa/language/" @@ -44,33 +44,51 @@ msgstr "" msgid "No domain administrator defined" msgstr "No hay un administrador de dominio definido" -#: extensions/admin/static/admin/js/admin.js:291 +#: extensions/admin/static/admin/js/admin.js:292 msgid "Do not delete mailbox directory" msgstr "No eliminar el directorio del mailbox" -#: extensions/amavis/static/amavis/js/quarantine.js:180 +#: extensions/amavis/static/amavis/js/quarantine.js:211 msgid "Release this selection?" msgstr "¿Publicar esta selección?" -#: extensions/amavis/static/amavis/js/quarantine.js:184 +#: extensions/amavis/static/amavis/js/quarantine.js:215 msgid "Delete this selection?" msgstr "¿Eliminar esta selección?" -#: extensions/amavis/static/amavis/js/quarantine.js:203 +#: extensions/amavis/static/amavis/js/quarantine.js:255 +#, fuzzy +msgid "Mark this selection as spam?" +msgstr "¿Publicar esta selección?" + +#: extensions/amavis/static/amavis/js/quarantine.js:270 +#, fuzzy +msgid "Mark this selection as non-spam?" +msgstr "¿Publicar esta selección?" + +#: extensions/amavis/static/amavis/js/quarantine.js:295 #: extensions/amavis/static/amavis/js/selfservice.js:17 msgid "Release this message?" msgstr "¿Publicar este mensaje?" -#: extensions/amavis/static/amavis/js/quarantine.js:207 +#: extensions/amavis/static/amavis/js/quarantine.js:299 #: extensions/amavis/static/amavis/js/selfservice.js:21 msgid "Delete this message?" msgstr "¿Eliminar este mensaje?" -#: extensions/amavis/static/amavis/js/quarantine.js:224 +#: extensions/amavis/static/amavis/js/quarantine.js:314 +msgid "Mark as spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:330 +msgid "Mark as non-spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:348 msgid "View full headers" msgstr "Ver todas las cabeceras" -#: extensions/amavis/static/amavis/js/quarantine.js:229 +#: extensions/amavis/static/amavis/js/quarantine.js:353 msgid "Hide full headers" msgstr "Esconder todas las cabeceras" @@ -99,7 +117,7 @@ msgstr "¿Activar este conjunto de filtros?" msgid "active" msgstr "activo" -#: extensions/stats/static/stats/js/stats.js:37 +#: extensions/stats/static/stats/js/stats.js:38 msgid "Search a domain" msgstr "Buscar un dominio" diff --git a/modoboa/locale/fr/LC_MESSAGES/djangojs.po b/modoboa/locale/fr/LC_MESSAGES/djangojs.po index ee11efc9e..30783e92b 100644 --- a/modoboa/locale/fr/LC_MESSAGES/djangojs.po +++ b/modoboa/locale/fr/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: modoboa-1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:33+0200\n" +"POT-Creation-Date: 2014-10-29 20:22+0100\n" "PO-Revision-Date: 2011-01-07 10:00+0100\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: FR \n" @@ -41,33 +41,49 @@ msgstr "" msgid "No domain administrator defined" msgstr "Aucun administrateur de domaine défini" -#: extensions/admin/static/admin/js/admin.js:291 +#: extensions/admin/static/admin/js/admin.js:292 msgid "Do not delete mailbox directory" msgstr "Ne pas supprimer le répertoire de la boite aux lettres" -#: extensions/amavis/static/amavis/js/quarantine.js:180 +#: extensions/amavis/static/amavis/js/quarantine.js:211 msgid "Release this selection?" msgstr "Relâcher cette sélection?" -#: extensions/amavis/static/amavis/js/quarantine.js:184 +#: extensions/amavis/static/amavis/js/quarantine.js:215 msgid "Delete this selection?" msgstr "Supprimer cette sélection?" -#: extensions/amavis/static/amavis/js/quarantine.js:203 +#: extensions/amavis/static/amavis/js/quarantine.js:255 +msgid "Mark this selection as spam?" +msgstr "Marquer cette sélection comme étant du spam?" + +#: extensions/amavis/static/amavis/js/quarantine.js:270 +msgid "Mark this selection as non-spam?" +msgstr "Marquer cette sélection comme n'étant pas du spam?" + +#: extensions/amavis/static/amavis/js/quarantine.js:295 #: extensions/amavis/static/amavis/js/selfservice.js:17 msgid "Release this message?" msgstr "Relâcher cette message?" -#: extensions/amavis/static/amavis/js/quarantine.js:207 +#: extensions/amavis/static/amavis/js/quarantine.js:299 #: extensions/amavis/static/amavis/js/selfservice.js:21 msgid "Delete this message?" msgstr "Supprimer ce message?" -#: extensions/amavis/static/amavis/js/quarantine.js:224 +#: extensions/amavis/static/amavis/js/quarantine.js:314 +msgid "Mark as spam?" +msgstr "Marquer comme spam?" + +#: extensions/amavis/static/amavis/js/quarantine.js:330 +msgid "Mark as non-spam?" +msgstr "Marquer comme non-spam?" + +#: extensions/amavis/static/amavis/js/quarantine.js:348 msgid "View full headers" msgstr "Voir les entêtes complets" -#: extensions/amavis/static/amavis/js/quarantine.js:229 +#: extensions/amavis/static/amavis/js/quarantine.js:353 msgid "Hide full headers" msgstr "Cacher les entêtes complets" @@ -96,7 +112,7 @@ msgstr "Activer ce jeu de filtres?" msgid "active" msgstr "actif" -#: extensions/stats/static/stats/js/stats.js:37 +#: extensions/stats/static/stats/js/stats.js:38 msgid "Search a domain" msgstr "Checher un domaine" diff --git a/modoboa/locale/it/LC_MESSAGES/djangojs.po b/modoboa/locale/it/LC_MESSAGES/djangojs.po index bf8c313fd..0cbcc4fe4 100644 --- a/modoboa/locale/it/LC_MESSAGES/djangojs.po +++ b/modoboa/locale/it/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:32+0200\n" +"POT-Creation-Date: 2014-10-29 20:22+0100\n" "PO-Revision-Date: 2013-12-23 00:58+0100\n" "Last-Translator: Alberto Berti \n" "Language-Team: Italiano \n" @@ -41,33 +41,51 @@ msgstr "" msgid "No domain administrator defined" msgstr "Non è stato definito un amministratore di dominio" -#: extensions/admin/static/admin/js/admin.js:291 +#: extensions/admin/static/admin/js/admin.js:292 msgid "Do not delete mailbox directory" msgstr "Non eliminare la cartella della casella posta" -#: extensions/amavis/static/amavis/js/quarantine.js:180 +#: extensions/amavis/static/amavis/js/quarantine.js:211 msgid "Release this selection?" msgstr "Rilasciare questa selezione?" -#: extensions/amavis/static/amavis/js/quarantine.js:184 +#: extensions/amavis/static/amavis/js/quarantine.js:215 msgid "Delete this selection?" msgstr "Eliminare questa selezione?" -#: extensions/amavis/static/amavis/js/quarantine.js:203 +#: extensions/amavis/static/amavis/js/quarantine.js:255 +#, fuzzy +msgid "Mark this selection as spam?" +msgstr "Rilasciare questa selezione?" + +#: extensions/amavis/static/amavis/js/quarantine.js:270 +#, fuzzy +msgid "Mark this selection as non-spam?" +msgstr "Rilasciare questa selezione?" + +#: extensions/amavis/static/amavis/js/quarantine.js:295 #: extensions/amavis/static/amavis/js/selfservice.js:17 msgid "Release this message?" msgstr "Rilasciare questo messaggio?" -#: extensions/amavis/static/amavis/js/quarantine.js:207 +#: extensions/amavis/static/amavis/js/quarantine.js:299 #: extensions/amavis/static/amavis/js/selfservice.js:21 msgid "Delete this message?" msgstr "Eliminare questo messaggio?" -#: extensions/amavis/static/amavis/js/quarantine.js:224 +#: extensions/amavis/static/amavis/js/quarantine.js:314 +msgid "Mark as spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:330 +msgid "Mark as non-spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:348 msgid "View full headers" msgstr "Visualizza tutte le intestazioni" -#: extensions/amavis/static/amavis/js/quarantine.js:229 +#: extensions/amavis/static/amavis/js/quarantine.js:353 msgid "Hide full headers" msgstr "Nascondi le intestazioni" @@ -96,7 +114,7 @@ msgstr "Attivare il gruppo di filtri?" msgid "active" msgstr "attivo" -#: extensions/stats/static/stats/js/stats.js:37 +#: extensions/stats/static/stats/js/stats.js:38 msgid "Search a domain" msgstr "Cerca un dominio" diff --git a/modoboa/locale/nl_NL/LC_MESSAGES/djangojs.po b/modoboa/locale/nl_NL/LC_MESSAGES/djangojs.po index 1aaef7574..588049ea0 100644 --- a/modoboa/locale/nl_NL/LC_MESSAGES/djangojs.po +++ b/modoboa/locale/nl_NL/LC_MESSAGES/djangojs.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: # TuxBrother , 2014 # TuxBrother , 2014 @@ -9,14 +9,15 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:32+0200\n" +"POT-Creation-Date: 2014-10-29 20:22+0100\n" "PO-Revision-Date: 2014-04-16 12:58+0000\n" "Last-Translator: TuxBrother \n" -"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/modoboa/language/nl_NL/)\n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" +"modoboa/language/nl_NL/)\n" +"Language: nl_NL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: nl_NL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: extensions/admin/static/admin/js/admin.js:32 @@ -29,45 +30,67 @@ msgstr "De map van dit domein niet verwijderen (Zal de data ervan behouden)" #: extensions/admin/static/admin/js/admin.js:173 msgid "This operation will remove ALL data associated to this domain." -msgstr "Deze actie zal ALLE data verwijderen die bij dit domein hoort. Wilt u doorgaan?" +msgstr "" +"Deze actie zal ALLE data verwijderen die bij dit domein hoort. Wilt u " +"doorgaan?" #: extensions/admin/static/admin/js/admin.js:174 msgid "" "This operation will remove all data associated to this domain, excepting " "accounts." -msgstr "Deze actie zal alle data die bij dit domein hoort verwijderen, behalve de gebruikers." +msgstr "" +"Deze actie zal alle data die bij dit domein hoort verwijderen, behalve de " +"gebruikers." #: extensions/admin/static/admin/js/admin.js:222 msgid "No domain administrator defined" msgstr "Geen administrator toegewezen" -#: extensions/admin/static/admin/js/admin.js:291 +#: extensions/admin/static/admin/js/admin.js:292 msgid "Do not delete mailbox directory" msgstr "Verwijder de map van deze mailbox niet (zal de data ervan behouden)" -#: extensions/amavis/static/amavis/js/quarantine.js:180 +#: extensions/amavis/static/amavis/js/quarantine.js:211 msgid "Release this selection?" msgstr "Wilt u deze selectie loslaten?" -#: extensions/amavis/static/amavis/js/quarantine.js:184 +#: extensions/amavis/static/amavis/js/quarantine.js:215 msgid "Delete this selection?" msgstr "Selectie verwijderen?" -#: extensions/amavis/static/amavis/js/quarantine.js:203 +#: extensions/amavis/static/amavis/js/quarantine.js:255 +#, fuzzy +msgid "Mark this selection as spam?" +msgstr "Wilt u deze selectie loslaten?" + +#: extensions/amavis/static/amavis/js/quarantine.js:270 +#, fuzzy +msgid "Mark this selection as non-spam?" +msgstr "Wilt u deze selectie loslaten?" + +#: extensions/amavis/static/amavis/js/quarantine.js:295 #: extensions/amavis/static/amavis/js/selfservice.js:17 msgid "Release this message?" msgstr "Dit bericht loslaten?" -#: extensions/amavis/static/amavis/js/quarantine.js:207 +#: extensions/amavis/static/amavis/js/quarantine.js:299 #: extensions/amavis/static/amavis/js/selfservice.js:21 msgid "Delete this message?" msgstr "Dit bericht verwijderen?" -#: extensions/amavis/static/amavis/js/quarantine.js:224 +#: extensions/amavis/static/amavis/js/quarantine.js:314 +msgid "Mark as spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:330 +msgid "Mark as non-spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:348 msgid "View full headers" msgstr "Volledige headers weergeven" -#: extensions/amavis/static/amavis/js/quarantine.js:229 +#: extensions/amavis/static/amavis/js/quarantine.js:353 msgid "Hide full headers" msgstr "Volledige headers verbergen" @@ -96,7 +119,7 @@ msgstr "Wilt u deze filterset activeren?" msgid "active" msgstr "activeren" -#: extensions/stats/static/stats/js/stats.js:37 +#: extensions/stats/static/stats/js/stats.js:38 msgid "Search a domain" msgstr "Zoek een domein" diff --git a/modoboa/locale/pt_PT/LC_MESSAGES/djangojs.po b/modoboa/locale/pt_PT/LC_MESSAGES/djangojs.po index b89b1754d..752cea653 100644 --- a/modoboa/locale/pt_PT/LC_MESSAGES/djangojs.po +++ b/modoboa/locale/pt_PT/LC_MESSAGES/djangojs.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:33+0200\n" +"POT-Creation-Date: 2014-10-29 20:23+0100\n" "PO-Revision-Date: 2013-12-23 11:22+0000\n" "Last-Translator: lusitan \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" @@ -45,33 +45,51 @@ msgstr "" msgid "No domain administrator defined" msgstr "Não está definido nenhum administrador para o domínio" -#: extensions/admin/static/admin/js/admin.js:291 +#: extensions/admin/static/admin/js/admin.js:292 msgid "Do not delete mailbox directory" msgstr "Não excluir o diretório da caixa de correio" -#: extensions/amavis/static/amavis/js/quarantine.js:180 +#: extensions/amavis/static/amavis/js/quarantine.js:211 msgid "Release this selection?" msgstr "Libertar itens seleccionados?" -#: extensions/amavis/static/amavis/js/quarantine.js:184 +#: extensions/amavis/static/amavis/js/quarantine.js:215 msgid "Delete this selection?" msgstr "Eliminar itens seleccionados?" -#: extensions/amavis/static/amavis/js/quarantine.js:203 +#: extensions/amavis/static/amavis/js/quarantine.js:255 +#, fuzzy +msgid "Mark this selection as spam?" +msgstr "Libertar itens seleccionados?" + +#: extensions/amavis/static/amavis/js/quarantine.js:270 +#, fuzzy +msgid "Mark this selection as non-spam?" +msgstr "Libertar itens seleccionados?" + +#: extensions/amavis/static/amavis/js/quarantine.js:295 #: extensions/amavis/static/amavis/js/selfservice.js:17 msgid "Release this message?" msgstr "Libertar esta mensagem?" -#: extensions/amavis/static/amavis/js/quarantine.js:207 +#: extensions/amavis/static/amavis/js/quarantine.js:299 #: extensions/amavis/static/amavis/js/selfservice.js:21 msgid "Delete this message?" msgstr "Eliminar esta mensagem?" -#: extensions/amavis/static/amavis/js/quarantine.js:224 +#: extensions/amavis/static/amavis/js/quarantine.js:314 +msgid "Mark as spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:330 +msgid "Mark as non-spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:348 msgid "View full headers" msgstr "Ver cabeçalho completo" -#: extensions/amavis/static/amavis/js/quarantine.js:229 +#: extensions/amavis/static/amavis/js/quarantine.js:353 msgid "Hide full headers" msgstr "Esconder cabeçalho completo" @@ -100,7 +118,7 @@ msgstr "Activar estes filtros?" msgid "active" msgstr "activo" -#: extensions/stats/static/stats/js/stats.js:37 +#: extensions/stats/static/stats/js/stats.js:38 msgid "Search a domain" msgstr "Pesquisar domínio" diff --git a/modoboa/locale/ru/LC_MESSAGES/djangojs.po b/modoboa/locale/ru/LC_MESSAGES/djangojs.po index 90547c2ab..9b548b0b9 100644 --- a/modoboa/locale/ru/LC_MESSAGES/djangojs.po +++ b/modoboa/locale/ru/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:32+0200\n" +"POT-Creation-Date: 2014-10-29 20:22+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/" @@ -43,33 +43,51 @@ msgstr "" msgid "No domain administrator defined" msgstr "Не указан администратор домена" -#: extensions/admin/static/admin/js/admin.js:291 +#: extensions/admin/static/admin/js/admin.js:292 msgid "Do not delete mailbox directory" msgstr "Не удаляйте каталог почтовых ящиков" -#: extensions/amavis/static/amavis/js/quarantine.js:180 +#: extensions/amavis/static/amavis/js/quarantine.js:211 msgid "Release this selection?" msgstr "Деблокировать отмеченные?" -#: extensions/amavis/static/amavis/js/quarantine.js:184 +#: extensions/amavis/static/amavis/js/quarantine.js:215 msgid "Delete this selection?" msgstr "Удалить отмеченные?" -#: extensions/amavis/static/amavis/js/quarantine.js:203 +#: extensions/amavis/static/amavis/js/quarantine.js:255 +#, fuzzy +msgid "Mark this selection as spam?" +msgstr "Деблокировать отмеченные?" + +#: extensions/amavis/static/amavis/js/quarantine.js:270 +#, fuzzy +msgid "Mark this selection as non-spam?" +msgstr "Деблокировать отмеченные?" + +#: extensions/amavis/static/amavis/js/quarantine.js:295 #: extensions/amavis/static/amavis/js/selfservice.js:17 msgid "Release this message?" msgstr "Деблокировать сообщение?" -#: extensions/amavis/static/amavis/js/quarantine.js:207 +#: extensions/amavis/static/amavis/js/quarantine.js:299 #: extensions/amavis/static/amavis/js/selfservice.js:21 msgid "Delete this message?" msgstr "Удалить сообщение?" -#: extensions/amavis/static/amavis/js/quarantine.js:224 +#: extensions/amavis/static/amavis/js/quarantine.js:314 +msgid "Mark as spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:330 +msgid "Mark as non-spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:348 msgid "View full headers" msgstr "Просмотр всех заголовков" -#: extensions/amavis/static/amavis/js/quarantine.js:229 +#: extensions/amavis/static/amavis/js/quarantine.js:353 msgid "Hide full headers" msgstr "Скрыть все заголовки" @@ -98,7 +116,7 @@ msgstr "Активировать набор фильтров?" msgid "active" msgstr "активно" -#: extensions/stats/static/stats/js/stats.js:37 +#: extensions/stats/static/stats/js/stats.js:38 msgid "Search a domain" msgstr "Найти домен" diff --git a/modoboa/locale/sv/LC_MESSAGES/djangojs.po b/modoboa/locale/sv/LC_MESSAGES/djangojs.po index 006d844cd..893a81066 100644 --- a/modoboa/locale/sv/LC_MESSAGES/djangojs.po +++ b/modoboa/locale/sv/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Modoboa\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-24 12:32+0200\n" +"POT-Creation-Date: 2014-10-29 20:22+0100\n" "PO-Revision-Date: 2013-05-23 08:22+0000\n" "Last-Translator: ogg1980 \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/modoboa/language/" @@ -43,33 +43,51 @@ msgstr "" msgid "No domain administrator defined" msgstr "Ingen domänadministratör definierad" -#: extensions/admin/static/admin/js/admin.js:291 +#: extensions/admin/static/admin/js/admin.js:292 msgid "Do not delete mailbox directory" msgstr "Radera inte brevlådans katalog" -#: extensions/amavis/static/amavis/js/quarantine.js:180 +#: extensions/amavis/static/amavis/js/quarantine.js:211 msgid "Release this selection?" msgstr "Släpp markerat urval?" -#: extensions/amavis/static/amavis/js/quarantine.js:184 +#: extensions/amavis/static/amavis/js/quarantine.js:215 msgid "Delete this selection?" msgstr "Radera markerat urval?" -#: extensions/amavis/static/amavis/js/quarantine.js:203 +#: extensions/amavis/static/amavis/js/quarantine.js:255 +#, fuzzy +msgid "Mark this selection as spam?" +msgstr "Släpp markerat urval?" + +#: extensions/amavis/static/amavis/js/quarantine.js:270 +#, fuzzy +msgid "Mark this selection as non-spam?" +msgstr "Släpp markerat urval?" + +#: extensions/amavis/static/amavis/js/quarantine.js:295 #: extensions/amavis/static/amavis/js/selfservice.js:17 msgid "Release this message?" msgstr "Släpp detta meddelande?" -#: extensions/amavis/static/amavis/js/quarantine.js:207 +#: extensions/amavis/static/amavis/js/quarantine.js:299 #: extensions/amavis/static/amavis/js/selfservice.js:21 msgid "Delete this message?" msgstr "Radera detta meddelande?" -#: extensions/amavis/static/amavis/js/quarantine.js:224 +#: extensions/amavis/static/amavis/js/quarantine.js:314 +msgid "Mark as spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:330 +msgid "Mark as non-spam?" +msgstr "" + +#: extensions/amavis/static/amavis/js/quarantine.js:348 msgid "View full headers" msgstr "Visa meddelandehuvud" -#: extensions/amavis/static/amavis/js/quarantine.js:229 +#: extensions/amavis/static/amavis/js/quarantine.js:353 msgid "Hide full headers" msgstr "Göm meddelandehuvud" @@ -98,7 +116,7 @@ msgstr "Aktivera filteruppsättning?" msgid "active" msgstr "aktivera" -#: extensions/stats/static/stats/js/stats.js:37 +#: extensions/stats/static/stats/js/stats.js:38 msgid "Search a domain" msgstr "Sök domän" From b5932f1e55b169e0c6c3bcacf76ae5118e7f4429 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 3 Nov 2014 14:09:12 +0100 Subject: [PATCH 07/27] Don't check sub levels for super admins. see #622 --- modoboa/extensions/amavis/lib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/extensions/amavis/lib.py b/modoboa/extensions/amavis/lib.py index 9233fa94f..4ba308b1a 100644 --- a/modoboa/extensions/amavis/lib.py +++ b/modoboa/extensions/amavis/lib.py @@ -286,7 +286,7 @@ def manual_learning_enabled(user): :return: True if learning is enabled, False otherwise. """ manual_learning = parameters.get_admin("MANUAL_LEARNING") == "yes" - if manual_learning: + if manual_learning and user.group != 'SuperAdmins': domain_level_learning = parameters.get_admin( "DOMAIN_LEVEL_LEARNING") == "yes" user_level_learning = parameters.get_admin( From 8224c03ff009d6b01e6c8d0c30a8f44b459a8210 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 3 Nov 2014 16:43:34 +0100 Subject: [PATCH 08/27] Possibility to filter clean messages. see #622 --- modoboa/extensions/amavis/sql_listing.py | 7 ++++++- .../amavis/templates/amavis/main_action_bar.html | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/modoboa/extensions/amavis/sql_listing.py b/modoboa/extensions/amavis/sql_listing.py index c8cbaf122..97936b33b 100644 --- a/modoboa/extensions/amavis/sql_listing.py +++ b/modoboa/extensions/amavis/sql_listing.py @@ -51,7 +51,12 @@ class Qtable(tables.Table): ] def parse_type(self, value): - color = 'important' if value in ['S', 'V'] else 'warning' + if value in ['S', 'V']: + color = 'important' + elif value == 'C': + color = 'success' + else: + color = 'warning' return '%s' % (color, value) def parse_date(self, value): diff --git a/modoboa/extensions/amavis/templates/amavis/main_action_bar.html b/modoboa/extensions/amavis/templates/amavis/main_action_bar.html index 36b607005..a56ccccd3 100644 --- a/modoboa/extensions/amavis/templates/amavis/main_action_bar.html +++ b/modoboa/extensions/amavis/templates/amavis/main_action_bar.html @@ -6,6 +6,7 @@