mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
Merge
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2009-2011, Antoine Nguyen <tonio@ngyn.org>
|
||||
Copyright (c) 2009-2012, Antoine Nguyen <tonio@ngyn.org>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
|
||||
@@ -186,8 +186,10 @@ Then, all you have to do is to modify the `settings.py` file:
|
||||
|
||||
AUTH_LDAP_BIND_DN = ""
|
||||
AUTH_LDAP_BIND_PASSWORD = ""
|
||||
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",
|
||||
ldap.SCOPE_SUBTREE, "(uid=%(user)s)")
|
||||
LDAP_USER_BASE = "ou=users,dc=example,dc=com"
|
||||
LDAP_USER_FILTER = "(mail=%(user)s)"
|
||||
AUTH_LDAP_USER_SEARCH = LDAPSearch(LDAP_USER_BASE,
|
||||
ldap.SCOPE_SUBTREE, LDAP_USER_FILTER)
|
||||
|
||||
You will find a detailled documentation `here
|
||||
<http://packages.python.org/django-auth-ldap/>`_.
|
||||
@@ -196,6 +198,28 @@ Once the authentication is properly configured, the users defined in
|
||||
your LDAP directory will be able to connect to *Modoboa*, the associated
|
||||
domain and mailboxes will be automatically created if needed.
|
||||
|
||||
Users will also be able to update their LDAP password directly from
|
||||
Modoboa.
|
||||
|
||||
.. note::
|
||||
|
||||
Modoboa doesn't provide any synchronization mechanism once a user
|
||||
is registered into the database. Any modification done from the
|
||||
directory to a user account will not be reported to Modoboa (an
|
||||
email address change for example). Currently, the only solution is
|
||||
to manually delete the Modoboa record, it will be recreated on the
|
||||
next user login.
|
||||
|
||||
Available settings
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* ``LDAP_USER_BASE`` : the distinguish name of the search base
|
||||
* ``LDAP_USER_FILTER`` : the filter used to retrieve users distinguish name
|
||||
* ``LDAP_PASSWORD_ATTR`` : the attribute used to store the password
|
||||
(default: ``userPassword``)
|
||||
* ``LDAP_ACTIVE_DIRECTORY`` : used to indicate if your directory is an
|
||||
Active Directory one (default: ``False``)
|
||||
|
||||
|
||||
How to upgrade
|
||||
==============
|
||||
@@ -208,6 +232,30 @@ requires a migration.
|
||||
Before executing a schema/data migration, I recommend that you make
|
||||
a copy of your existing database.
|
||||
|
||||
0.8.8: CSV import feature and minor fixes
|
||||
-----------------------------------------
|
||||
|
||||
#. Edit the *settings.py* file and
|
||||
``'modoboa.lib.middleware.AjaxLoginRedirect'`` to the
|
||||
``MIDDLEWARE_CLASSES`` variable like this::
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.locale.LocaleMiddleware',
|
||||
'modoboa.lib.middleware.AjaxLoginRedirect',
|
||||
'modoboa.lib.middleware.ExtControlMiddleware',
|
||||
'modoboa.extensions.webmail.middleware.WebmailErrorMiddleware',
|
||||
)
|
||||
|
||||
#. Still inside *settings.py*, modify the ``DATABASE_ROUTERS``
|
||||
variable like this::
|
||||
|
||||
DATABASE_ROUTERS = ["modoboa.extensions.amavis_quarantine.dbrouter.AmavisRouter"]
|
||||
|
||||
|
||||
0.8.7: per-user language selection
|
||||
----------------------------------
|
||||
|
||||
|
||||
@@ -5,6 +5,10 @@ from django.utils.translation import ugettext as _
|
||||
from django.db.utils import DatabaseError
|
||||
from models import Extension
|
||||
|
||||
parameters.register_admin("AUTHENTICATION_TYPE", type="list", deflt="local",
|
||||
values=[('local', _("Local")),
|
||||
('ldap', "LDAP")],
|
||||
help=_("The backend used for authentication"))
|
||||
parameters.register_admin("CREATE_DIRECTORIES", type="list_yesno", deflt="yes",
|
||||
help=_("Modoboa will handle mailbox creation on filesystem"))
|
||||
parameters.register_admin("STORAGE_PATH", type="string", deflt="/var/vmail",
|
||||
|
||||
+61
-32
@@ -6,6 +6,7 @@ from django.conf import settings
|
||||
from modoboa.lib import parameters, events
|
||||
from modoboa.lib.sysutils import exec_cmd, exec_as_vuser
|
||||
from modoboa.lib.emailutils import split_mailbox
|
||||
from modoboa.lib.ldaputils import *
|
||||
from modoboa.auth.lib import crypt_password
|
||||
import os
|
||||
import pwd
|
||||
@@ -291,6 +292,26 @@ class Mailbox(DatesAware):
|
||||
pass
|
||||
super(Mailbox, self).save(*args, **kwargs)
|
||||
|
||||
def set_password(self, curvalue, newvalue):
|
||||
"""Password update
|
||||
|
||||
Update the current mailbox's password with the given clear
|
||||
value. This value is encrypted according to the defined method
|
||||
before it is saved.
|
||||
|
||||
:param value: the new password's value
|
||||
"""
|
||||
if parameters.get_admin("AUTHENTICATION_TYPE") == "local":
|
||||
self.password = crypt_password(newvalue)
|
||||
self.save()
|
||||
return
|
||||
|
||||
ab = LDAPAuthBackend()
|
||||
try:
|
||||
ab.update_user_password(self.user.username, curvalue, newvalue)
|
||||
except LDAPException, e:
|
||||
raise AdminError(_("Failed to update password: %s" % str(e)))
|
||||
|
||||
def save_from_user(self, localpart, domain, user):
|
||||
"""Simple save method called for automatic creations
|
||||
|
||||
@@ -307,16 +328,16 @@ class Mailbox(DatesAware):
|
||||
# If we ever had numerical uid, don't resolve it
|
||||
v_uid = parameters.get_admin("VIRTUAL_UID");
|
||||
if v_uid.isdigit():
|
||||
self.uid = v_uid
|
||||
self.uid = v_uid
|
||||
else:
|
||||
self.uid = pwd.getpwnam(parameters.get_admin("VIRTUAL_UID")).pw_uid
|
||||
self.uid = pwd.getpwnam(parameters.get_admin("VIRTUAL_UID")).pw_uid
|
||||
# Just the same for gid
|
||||
v_gid = parameters.get_admin("VIRTUAL_GID")
|
||||
if v_gid.isdigit:
|
||||
self.gid = v_gid
|
||||
if v_gid.isdigit():
|
||||
self.gid = v_gid
|
||||
else:
|
||||
self.gid = pwd.getpwnam(parameters.get_admin("VIRTUAL_GID")).pw_gid
|
||||
self.quota = self.domain.quota
|
||||
self.gid = pwd.getpwnam(parameters.get_admin("VIRTUAL_GID")).pw_gid
|
||||
self.quota = self.domain.quota
|
||||
super(Mailbox, self).save()
|
||||
|
||||
def create_from_csv(self, line):
|
||||
@@ -328,9 +349,9 @@ class Mailbox(DatesAware):
|
||||
|
||||
:param line: a list containing the expected information
|
||||
"""
|
||||
if len(line) < 5:
|
||||
if len(line) < 4:
|
||||
raise AdminError(_("Invalid line"))
|
||||
mailbox, domname = split_mailbox(line[4])
|
||||
mailbox, domname = split_mailbox(line[0])
|
||||
self.address = mailbox
|
||||
try:
|
||||
self.domain = Domain.objects.get(name=domname)
|
||||
@@ -489,31 +510,39 @@ class Extension(models.Model):
|
||||
|
||||
events.raiseEvent("ExtDisabled", ext=self)
|
||||
|
||||
#
|
||||
# Optional callback to execute if django-auth-ldap is enabled.
|
||||
#
|
||||
def populate_callback(sender, user=None, **kwargs):
|
||||
"""Populate signal callback
|
||||
|
||||
If the LDAP authentication backend is in use, this callback will
|
||||
be called each time a new user authenticates succesfuly to
|
||||
Modoboa. This function is in charge of creating the mailbox
|
||||
associated to the provided ``User`` object.
|
||||
|
||||
:param sender: ??
|
||||
:param user: a ``User`` instance
|
||||
"""
|
||||
if parameters.get_admin("AUTHENTICATION_TYPE") != "ldap":
|
||||
return
|
||||
if user is None:
|
||||
return
|
||||
localpart, domname = split_mailbox(user.username)
|
||||
try:
|
||||
domain = Domain.objects.get(name=domname)
|
||||
except Domain.DoesNotExist:
|
||||
domain = Domain()
|
||||
domain.name = domname
|
||||
domain.enabled = True
|
||||
domain.quota = 0
|
||||
domain.save()
|
||||
try:
|
||||
mb = Mailbox.objects.get(domain=domain, address=localpart)
|
||||
except Mailbox.DoesNotExist:
|
||||
mb = Mailbox()
|
||||
mb.save_from_user(localpart, domain, user)
|
||||
|
||||
try:
|
||||
from django_auth_ldap.backend import populate_user
|
||||
|
||||
def populate_callback(sender, user=None, **kwargs):
|
||||
if user is None:
|
||||
return
|
||||
localpart, domname = split_mailbox(user.username)
|
||||
try:
|
||||
domain = Domain.objects.get(name=domname)
|
||||
except Domain.DoesNotExist:
|
||||
domain = Domain()
|
||||
domain.name = domname
|
||||
domain.enabled = True
|
||||
domain.quota = 0
|
||||
domain.save()
|
||||
try:
|
||||
mb = Mailbox.objects.get(domain=domain, address=localpart)
|
||||
except Mailbox.DoesNotExist:
|
||||
mb = Mailbox()
|
||||
mb.save_from_user(localpart, domain, user)
|
||||
|
||||
populate_user.connect(populate_callback, dispatch_uid="myuid")
|
||||
|
||||
except ImportError, inst:
|
||||
pass
|
||||
else:
|
||||
populate_user.connect(populate_callback, dispatch_uid="myuid")
|
||||
|
||||
+1
-1
@@ -79,7 +79,7 @@ class MailboxTestCase(TestCase):
|
||||
|
||||
Two cases:
|
||||
* The default admin changes his password (no associated Mailbox)
|
||||
* A normal user changes hist password
|
||||
* A normal user changes his password
|
||||
"""
|
||||
clt = Client()
|
||||
self.assertEqual(clt.login(username="admin", password="toto"), True)
|
||||
|
||||
+8
-6
@@ -8,10 +8,11 @@ import base64
|
||||
from modoboa.lib import parameters
|
||||
|
||||
def encrypt(clear):
|
||||
obj = AES.new(parameters.get_admin("SECRET_KEY"),
|
||||
AES.MODE_ECB)
|
||||
key = parameters.get_admin("SECRET_KEY")
|
||||
obj = AES.new(key, AES.MODE_ECB)
|
||||
clear = str(clear)
|
||||
if len(clear) % AES.block_size:
|
||||
clear += "\0" * (AES.block_size - len(clear) % AES.block_size)
|
||||
clear += " " * (AES.block_size - len(clear) % AES.block_size)
|
||||
ciph = obj.encrypt(clear)
|
||||
ciph = base64.b64encode(ciph)
|
||||
return ciph
|
||||
@@ -20,7 +21,7 @@ def decrypt(ciph):
|
||||
obj = AES.new(parameters.get_admin("SECRET_KEY"), AES.MODE_ECB)
|
||||
ciph = base64.b64decode(ciph)
|
||||
clear = obj.decrypt(ciph)
|
||||
return clear.rstrip('\0')
|
||||
return clear.rstrip(' ')
|
||||
|
||||
def get_password(request):
|
||||
return decrypt(request.session["password"])
|
||||
@@ -33,11 +34,12 @@ def _check_password(password, crypted):
|
||||
return hashlib.md5(password).hexdigest() == crypted
|
||||
return password
|
||||
|
||||
def crypt_password(password):
|
||||
def crypt_password(password, hexdigest=True):
|
||||
scheme = parameters.get_admin("PASSWORD_SCHEME", app="admin")
|
||||
if scheme == "crypt":
|
||||
salt = ''.join(Random().sample(string.letters + string.digits, 2))
|
||||
return crypt.crypt(password, salt)
|
||||
if scheme == "md5":
|
||||
return hashlib.md5(password).hexdigest()
|
||||
obj = hashlib.md5(password)
|
||||
return obj.hexdigest() if hexdigest else obj.digest()
|
||||
return password
|
||||
|
||||
+2
-2
@@ -6,7 +6,7 @@ from django.shortcuts import render_to_response
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils.translation import ugettext as _
|
||||
from modoboa.lib import events
|
||||
import modoboa.admin
|
||||
from modoboa.admin import views as admviews
|
||||
from forms import LoginForm
|
||||
from modoboa.auth.lib import *
|
||||
|
||||
@@ -32,7 +32,7 @@ def dologin(request):
|
||||
|
||||
next = request.POST["next"]
|
||||
if next.strip() in ["", "None"]:
|
||||
next = reverse(modoboa.admin.views.domains)
|
||||
next = reverse(admviews.domains)
|
||||
return HttpResponseRedirect(next)
|
||||
else:
|
||||
error = _("Account is disabled.")
|
||||
|
||||
+3
-3
@@ -41,16 +41,16 @@ master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = u'Modoboa'
|
||||
copyright = u'2011, Antoine Nguyen'
|
||||
copyright = u'2012, Antoine Nguyen'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '0.8.7'
|
||||
version = '0.8.8'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '0.8.7'
|
||||
release = '0.8.8'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -30,7 +30,7 @@ function actioncallback(resp) {
|
||||
}
|
||||
|
||||
function actionclick(evt) {
|
||||
new Request.JSON({
|
||||
new Request.JSON.mdb({
|
||||
url: evt.target.get("href"),
|
||||
onSuccess: actioncallback
|
||||
}).get();
|
||||
|
||||
@@ -14,7 +14,7 @@ function removefilter(evt) {
|
||||
if (!confirm(gettext("Remove this filter?"))) {
|
||||
return;
|
||||
}
|
||||
new Request.JSON({
|
||||
new Request.JSON.mdb({
|
||||
url: this.get("href"),
|
||||
onSuccess: function(response) {
|
||||
if (response.status == "ok") {
|
||||
@@ -72,7 +72,7 @@ function loadfs(response) {
|
||||
* (remove, activate)
|
||||
*/
|
||||
function send_command(cmd, extracb) {
|
||||
new Request.JSON({
|
||||
new Request.JSON.mdb({
|
||||
url: cmd,
|
||||
onSuccess: function(response) {
|
||||
if (response.status == "ko") {
|
||||
@@ -116,7 +116,7 @@ function savefs(evt) {
|
||||
if (!check_prereqs(evt, gettext("Save changes?"))) {
|
||||
return;
|
||||
}
|
||||
new Request.JSON({
|
||||
new Request.JSON.mdb({
|
||||
url: $("feditor").get("action"),
|
||||
method: $("feditor").get("method"),
|
||||
data: $("feditor").toQueryString(),
|
||||
@@ -177,7 +177,7 @@ function activatefs(evt) {
|
||||
|
||||
function toggle_filter_state(event) {
|
||||
event.stop();
|
||||
new Request.JSON({
|
||||
new Request.JSON.mdb({
|
||||
url: this.get("href"),
|
||||
onSuccess: function(response) {
|
||||
if (response.status == "ok") {
|
||||
@@ -193,7 +193,7 @@ function toggle_filter_state(event) {
|
||||
|
||||
function move_filter(event) {
|
||||
event.stop();
|
||||
new Request.JSON({
|
||||
new Request.JSON.mdb({
|
||||
url: this.get("href"),
|
||||
onSuccess: function(response) {
|
||||
$("filters_list").set("html", response.content);
|
||||
|
||||
@@ -68,8 +68,8 @@ window.addEvent("domready", function() {
|
||||
if (p == "") {
|
||||
return;
|
||||
}
|
||||
new Request.JSON({url : url + "?" + p, noCache: true,
|
||||
onSuccess : getgraph_callback}).get();
|
||||
new Request.JSON.mdb({url : url + "?" + p, noCache: true,
|
||||
onSuccess : getgraph_callback}).get();
|
||||
};
|
||||
|
||||
{% if user.is_superuser %}
|
||||
|
||||
@@ -409,6 +409,9 @@ def html2plaintext(content):
|
||||
return plaintext
|
||||
|
||||
def get_current_url(request):
|
||||
if not request.session.has_key("folder"):
|
||||
return ""
|
||||
|
||||
res = "%s?page=%s" % (request.session["folder"], request.session["page"])
|
||||
for p in ["criteria", "pattern", "order"]:
|
||||
if p in request.session.keys():
|
||||
|
||||
@@ -46,7 +46,7 @@ var FdMenu = new Class({
|
||||
if (!confirm(gettext("Delete folder?"))) {
|
||||
return;
|
||||
}
|
||||
new Request.JSON({
|
||||
new Request.JSON.mdb({
|
||||
url: evt.target.get("href"),
|
||||
method: "GET",
|
||||
onSuccess: function(resp) {
|
||||
|
||||
@@ -876,13 +876,17 @@ function refreshFolder() {
|
||||
profile : "gray",
|
||||
spinner : true
|
||||
});
|
||||
new Request.JSON({url: query, noCache : true, onSuccess: function(resp) {
|
||||
var callback = ($defined(resp.callback)) ? resp.callback : "default";
|
||||
new Request.JSON.mdb({
|
||||
url: query,
|
||||
noCache : true,
|
||||
onSuccess: function(resp) {
|
||||
var callback = ($defined(resp.callback)) ? resp.callback : "default";
|
||||
|
||||
current_anchor.get_callback(callback)(resp);
|
||||
infobox.info(gettext("Done"));
|
||||
infobox.hide(1);
|
||||
}}).get();
|
||||
current_anchor.get_callback(callback)(resp);
|
||||
infobox.info(gettext("Done"));
|
||||
infobox.hide(1);
|
||||
}
|
||||
}).get();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -897,7 +901,7 @@ function simple_request(url, params) {
|
||||
profile: "gray",
|
||||
spinner: true
|
||||
});
|
||||
new Request.JSON({
|
||||
new Request.JSON.mdb({
|
||||
url : url,
|
||||
onSuccess : function(response) {
|
||||
if (response.status == "ok") {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<script type="text/javascript">
|
||||
function del_attachment(evt) {
|
||||
evt.stop();
|
||||
new Request.JSON({
|
||||
new Request.JSON.mdb({
|
||||
url: this.get("href"),
|
||||
onSuccess: function(resp) {
|
||||
this.getParent().dispose();
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
# coding: utf-8
|
||||
|
||||
"""
|
||||
:mod:`ldaputils` --- a collection of LDAP based classes/functions
|
||||
-----------------------------------------------------------------
|
||||
|
||||
For a first version, the LDAP support offered by Modoboa only supports
|
||||
one global server definition : the one the django-auth-ldap uses.
|
||||
|
||||
Extra information about Active Directory
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Extracted from `this blog
|
||||
<http://www.dirmgr.com/blog/2010/8/26/ldap-password-changes-in-active-directory.html>`_:
|
||||
|
||||
- Active Directory doesn't appear to support the password modify
|
||||
extended operation, so you must change passwords using a normal LDAP
|
||||
modify operation.
|
||||
|
||||
- Active Directory stores passwords in the unicodePwd attribute,
|
||||
rather than userPassword.
|
||||
|
||||
- Active Directory will only accept password changes over secure
|
||||
connections. I have only ever used SSL. It may be that you can also
|
||||
use StartTLS, or perhaps SASL with confidentiality, but I'm not sure
|
||||
about that.
|
||||
|
||||
- The new password must be enclosed in quotation marks, and it must
|
||||
use a UTF-16 little-endian encoding.
|
||||
|
||||
- Active Directory may impose some strength requirements on the
|
||||
password, although exactly what those requirements are may vary from
|
||||
one instance to another.
|
||||
|
||||
"""
|
||||
import ldap
|
||||
import re
|
||||
import base64
|
||||
from django.conf import settings
|
||||
from modoboa.auth.lib import crypt_password
|
||||
from modoboa.lib import parameters
|
||||
|
||||
class LDAPException(Exception): pass
|
||||
|
||||
class LDAPAuthBackend(object):
|
||||
def __init__(self):
|
||||
self.server_uri = self._setting("AUTH_LDAP_SERVER_URI", "ldap://localhost")
|
||||
self.user_base = self._setting("LDAP_USER_BASE", "")
|
||||
self.user_filter = self._setting("LDAP_USER_FILTER", "")
|
||||
self.bind_dn = self._setting("AUTH_LDAP_BIND_DN", "")
|
||||
self.bind_pwd = self._setting("AUTH_LDAP_BIND_PASSWORD", "")
|
||||
self.pwd_attr = self._setting("LDAP_PASSWORD_ATTR", "userPassword")
|
||||
self.ldap_ad = self._setting("LDAP_ACTIVE_DIRECTORY", False)
|
||||
|
||||
self.conn = self._get_conn(self.bind_dn, self.bind_pwd)
|
||||
|
||||
def _setting(self, name, default):
|
||||
try:
|
||||
value = getattr(settings, name)
|
||||
except AttributeError:
|
||||
value = default
|
||||
return value
|
||||
|
||||
def _get_conn(self, bind_dn, bind_pwd):
|
||||
conn = ldap.initialize(self.server_uri)
|
||||
conn.set_option(ldap.OPT_X_TLS_DEMAND, True)
|
||||
conn.set_option(ldap.OPT_DEBUG_LEVEL, 255)
|
||||
conn.simple_bind_s(bind_dn, bind_pwd)
|
||||
return conn
|
||||
|
||||
def _expand_filter(self, rawvalue, **kwargs):
|
||||
return rawvalue % kwargs
|
||||
|
||||
def _find_user_dn(self, user):
|
||||
filtr = self._expand_filter(self.user_filter, user=user)
|
||||
res = self.conn.search_s(self.user_base, ldap.SCOPE_SUBTREE, filtr)
|
||||
try:
|
||||
dn = res[0][0]
|
||||
except IndexError:
|
||||
return None
|
||||
return dn
|
||||
|
||||
def _crypt_password(self, clearpassword):
|
||||
"""Overidding of the crypt_password function (LDAP compliant)
|
||||
|
||||
The crypted password in base64 encoded and we prepend the used
|
||||
algorithm to the returned value. (between {})
|
||||
|
||||
:param clearpassword: the clear password
|
||||
:return: the encrypted password
|
||||
"""
|
||||
scheme = parameters.get_admin("PASSWORD_SCHEME", app="admin")
|
||||
if scheme == "clear":
|
||||
return str(clearpassword)
|
||||
crypted = crypt_password(clearpassword, False)
|
||||
return str("{%s}%s" % (scheme.upper(), base64.encodestring(crypted)))
|
||||
|
||||
def update_user_password(self, user, password, newpassword):
|
||||
try:
|
||||
dn = self._find_user_dn(user)
|
||||
conn = self._get_conn(dn, password)
|
||||
if self.ldap_ad:
|
||||
newpassword = ('"%s"' % newpassword).encode('utf-16').lstrip('\377\376')
|
||||
ldif = [(ldap.MOD_REPLACE,
|
||||
self.pwd_attr,
|
||||
self._crypt_password(newpassword))]
|
||||
conn.modify_s(dn, ldif)
|
||||
except ldap.LDAPError, e:
|
||||
raise LDAPException(str(e))
|
||||
|
||||
|
||||
+8
-1
@@ -1,7 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import re
|
||||
from django.http import Http404
|
||||
from django.http import Http404, HttpResponseRedirect
|
||||
from modoboa.admin.models import Extension
|
||||
|
||||
class ExtControlMiddleware(object):
|
||||
@@ -15,3 +15,10 @@ class ExtControlMiddleware(object):
|
||||
if ext.enabled:
|
||||
return None
|
||||
raise Http404
|
||||
|
||||
class AjaxLoginRedirect(object):
|
||||
def process_response(self, request, response):
|
||||
if request.is_ajax():
|
||||
if type(response) == HttpResponseRedirect:
|
||||
response.status_code = 278
|
||||
return response
|
||||
|
||||
+1
-2
@@ -39,8 +39,7 @@ def render_actions(actions):
|
||||
{% for a in actions %}
|
||||
<a href="{{ a.url }}" name="{{ a.name }}" class="{{ a.class }}" rel="{{ a.rel }}"
|
||||
{% if a.confirm %}onclick="return confirm('{{ a.confirm }}')"{% endif %}>
|
||||
<img src="{{ a.img }}" border="0" title="{{ a.title }}" />
|
||||
</a>
|
||||
<img src="{{ a.img }}" border="0" title="{{ a.title }}" /></a>
|
||||
{% endfor %}
|
||||
""")
|
||||
return t.render(template.Context({
|
||||
|
||||
+167
-93
@@ -1,14 +1,14 @@
|
||||
# Modoboa German translation.
|
||||
# Copyright (C) 2011
|
||||
# Copyright (C) 2012
|
||||
# This file is distributed under the same license as the Modoboa package.
|
||||
#
|
||||
# Patrick Ben Koetter <p@state-of-mind.de>, 2010-2011.
|
||||
# Patrick Ben Koetter <p@state-of-mind.de>, 2010-2012.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Modoboa-0.8.7\n"
|
||||
"Report-Msgid-Bugs-To: http://dev.modoboa.org/\n"
|
||||
"POT-Creation-Date: 2011-09-30 15:25+0200\n"
|
||||
"PO-Revision-Date: 2011-10-09 00:24+0100\n"
|
||||
"Project-Id-Version: Modoboa-0.8.8\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-01-10 11:09+0100\n"
|
||||
"PO-Revision-Date: 2012-01-10 22:49+0100\n"
|
||||
"Last-Translator: Patrick Ben Koetter <p@state-of-mind.de>\n"
|
||||
"Language-Team: DE <p@state-of-mind.de>\n"
|
||||
"Language: de\n"
|
||||
@@ -17,39 +17,47 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: admin/__init__.py:8
|
||||
#: admin/__init__.py:9
|
||||
msgid "Local"
|
||||
msgstr "Lokal"
|
||||
|
||||
#: admin/__init__.py:11
|
||||
msgid "The backend used for authentication"
|
||||
msgstr "Das backend, das zur Authentifizierung genutzt wird"
|
||||
|
||||
#: admin/__init__.py:13
|
||||
msgid "Modoboa will handle mailbox creation on filesystem"
|
||||
msgstr "Modoboa wird die Erstellung der Mailbox im Dateisystem übernehmen"
|
||||
|
||||
#: admin/__init__.py:10
|
||||
#: admin/__init__.py:15
|
||||
msgid "Path to the root directory where messages are stored"
|
||||
msgstr "Pfad zum root-Verzeichnis unterhalb dessen E-Mails abgelegt werden"
|
||||
|
||||
#: admin/__init__.py:12
|
||||
#: admin/__init__.py:17
|
||||
msgid "UID of the virtual user which owns domains/mailboxes/messages on the filesystem"
|
||||
msgstr "UID des virtuellen Benutzers, der Besitzer der Domains, Mailboxen und Nachrichten im Dateisystem ist."
|
||||
|
||||
#: admin/__init__.py:14
|
||||
#: admin/__init__.py:19
|
||||
msgid "GID of the virtual user which owns domains/mailboxes/messages on the filesystem"
|
||||
msgstr "GID des virtuellen Benutzers, der Besitzer der Domains, Mailboxen und Nachrichten im Dateisystem ist."
|
||||
|
||||
#: admin/__init__.py:17
|
||||
#: admin/__init__.py:22
|
||||
msgid "Mailboxes storage format"
|
||||
msgstr "Mailbox erstellt."
|
||||
|
||||
#: admin/__init__.py:19
|
||||
#: admin/__init__.py:24
|
||||
msgid "Sub-directory (inside the mailbox) where messages are stored when using the maildir format"
|
||||
msgstr "Unterverzeichnis (innerhalb der Mailbox) in dem Nachrichten abgelegt werden wenn Maildir-Format eingesetzt wird."
|
||||
|
||||
#: admin/__init__.py:22
|
||||
#: admin/__init__.py:27
|
||||
msgid "Scheme used to crypt mailbox passwords"
|
||||
msgstr "Verschlüsselungsschema der Mailbox-Passworte"
|
||||
|
||||
#: admin/__init__.py:24
|
||||
#: admin/__init__.py:29
|
||||
msgid "Number of displayed items per page"
|
||||
msgstr "Anzahl dargestellter Einträge pro Seite"
|
||||
|
||||
#: admin/__init__.py:31
|
||||
#: admin/__init__.py:52
|
||||
msgid "The default redirection used when no application is specified"
|
||||
msgstr "Die Standardumleitung wenn kein Programm angegeben wurde"
|
||||
|
||||
@@ -77,7 +85,7 @@ msgid "Password used to log in"
|
||||
msgstr "Login-Passwort"
|
||||
|
||||
#: admin/forms.py:56
|
||||
#: userprefs/forms.py:16
|
||||
#: userprefs/forms.py:17
|
||||
msgid "Confirmation"
|
||||
msgstr "Bestätigung"
|
||||
|
||||
@@ -90,7 +98,7 @@ msgid "Check to activate this mailbox"
|
||||
msgstr "Markieren, um die Mailbox zu aktivieren"
|
||||
|
||||
#: admin/forms.py:88
|
||||
#: userprefs/forms.py:35
|
||||
#: userprefs/forms.py:39
|
||||
msgid "Passwords mismatch"
|
||||
msgstr "Passwörter stimmen nicht überein"
|
||||
|
||||
@@ -146,97 +154,119 @@ msgstr "Wählen Sie eine Domäne aus der Liste"
|
||||
msgid "Empty"
|
||||
msgstr "Leer"
|
||||
|
||||
#: admin/forms.py:204
|
||||
#: extensions/webmail/forms.py:14
|
||||
msgid "Select a file"
|
||||
msgstr "Wählen Sie eine Datei"
|
||||
|
||||
#: admin/forms.py:205
|
||||
msgid "Separator"
|
||||
msgstr "Separator"
|
||||
|
||||
#: admin/lib.py:13
|
||||
#, python-format
|
||||
msgid "Invalid action, %(user)s is a local user"
|
||||
msgstr "Unzulässige Aktion, %(user)s ist ein lokaler Benutzer"
|
||||
|
||||
#: admin/models.py:77
|
||||
#: admin/models.py:141
|
||||
#: admin/models.py:154
|
||||
#: admin/models.py:78
|
||||
#: admin/models.py:142
|
||||
#: admin/models.py:155
|
||||
msgid "name"
|
||||
msgstr "Name"
|
||||
|
||||
#: admin/models.py:78
|
||||
#: admin/models.py:79
|
||||
msgid "The domain name"
|
||||
msgstr "Name der Domäne"
|
||||
|
||||
#: admin/models.py:79
|
||||
#: admin/models.py:80
|
||||
msgid "Default quota in MB applied to mailboxes"
|
||||
msgstr "Standard-Quota für Mailboxen (in MB)"
|
||||
|
||||
#: admin/models.py:80
|
||||
#: admin/models.py:145
|
||||
#: admin/models.py:352
|
||||
#: admin/models.py:428
|
||||
#: admin/models.py:81
|
||||
#: admin/models.py:146
|
||||
#: admin/models.py:393
|
||||
#: admin/models.py:469
|
||||
#: extensions/postfix_autoreply/models.py:19
|
||||
msgid "enabled"
|
||||
msgstr "aktiviert"
|
||||
|
||||
#: admin/models.py:81
|
||||
#: admin/models.py:82
|
||||
msgid "Check to activate this domain"
|
||||
msgstr "Auswählen, um diese Domäne zu aktivieren"
|
||||
|
||||
#: admin/models.py:134
|
||||
#: admin/models.py:135
|
||||
msgid "Failed to initialise domain, check permissions"
|
||||
msgstr "Domäne konnte nicht initialisiert werden. Prüfen Sie die Berechtigungen."
|
||||
|
||||
#: admin/models.py:142
|
||||
#: admin/models.py:143
|
||||
msgid "The alias name"
|
||||
msgstr "Der Alias-Name"
|
||||
|
||||
#: admin/models.py:143
|
||||
#: admin/models.py:144
|
||||
msgid "target"
|
||||
msgstr "Ziel"
|
||||
|
||||
#: admin/models.py:144
|
||||
#: admin/models.py:145
|
||||
msgid "The domain this alias points to"
|
||||
msgstr "Domäne auf die dieser Alias verweist"
|
||||
|
||||
#: admin/models.py:146
|
||||
#: admin/models.py:353
|
||||
#: admin/models.py:147
|
||||
#: admin/models.py:394
|
||||
msgid "Check to activate this alias"
|
||||
msgstr "Auswählen um den Alias zu aktivieren"
|
||||
|
||||
#: admin/models.py:155
|
||||
#: admin/models.py:156
|
||||
msgid "First name and last name of mailbox owner"
|
||||
msgstr "Vor- und Nachname des Mailbox-Besitzers"
|
||||
|
||||
#: admin/models.py:156
|
||||
#: admin/models.py:346
|
||||
#: admin/models.py:157
|
||||
#: admin/models.py:387
|
||||
msgid "address"
|
||||
msgstr "Adresse"
|
||||
|
||||
#: admin/models.py:157
|
||||
#: admin/models.py:158
|
||||
msgid "Mailbox address (without the @domain.tld part)"
|
||||
msgstr "Mailbox-Adresse (ohne den @domain.tld-Anteil)"
|
||||
|
||||
#: admin/models.py:158
|
||||
#: admin/models.py:159
|
||||
msgid "password"
|
||||
msgstr "Passwort"
|
||||
|
||||
#: admin/models.py:245
|
||||
#: admin/models.py:306
|
||||
#: admin/models.py:246
|
||||
#: admin/models.py:327
|
||||
msgid "Failed to initialise mailbox, check permissions"
|
||||
msgstr "Mailbox konnte nicht initialisiert werden. Prüfen Sie die Berechtigungen."
|
||||
|
||||
#: admin/models.py:264
|
||||
#: admin/models.py:265
|
||||
msgid "Mailbox with this address already exists"
|
||||
msgstr "Eine Mailbox mit dieser Adresse existiert bereits."
|
||||
|
||||
#: admin/models.py:347
|
||||
#: admin/models.py:313
|
||||
#, python-format
|
||||
msgid "Failed to update password: %s"
|
||||
msgstr "Konnte Kennwort nicht aktualisieren: %s"
|
||||
|
||||
#: admin/models.py:353
|
||||
msgid "Invalid line"
|
||||
msgstr "Ungültige Zeile"
|
||||
|
||||
#: admin/models.py:359
|
||||
msgid "Cannot import this mailbox because the associated domain does not exist"
|
||||
msgstr "Kann Mailbox nicht importieren, weil die dazugehörende Domain nicht existiert"
|
||||
|
||||
#: admin/models.py:388
|
||||
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."
|
||||
|
||||
#: admin/models.py:349
|
||||
#: admin/models.py:390
|
||||
msgid "mailboxes"
|
||||
msgstr "Mailboxen"
|
||||
|
||||
#: admin/models.py:350
|
||||
#: admin/models.py:391
|
||||
msgid "The mailboxes this alias points to"
|
||||
msgstr "Mailbox auf den dieser Alias verweist"
|
||||
|
||||
#: admin/models.py:429
|
||||
#: admin/models.py:470
|
||||
msgid "Check to enable this extension"
|
||||
msgstr "Auswählen, um diese Erweiterung zu aktivieren"
|
||||
|
||||
@@ -273,19 +303,19 @@ msgstr "Zuletzt verändert"
|
||||
|
||||
#: admin/tables.py:14
|
||||
#: admin/views.py:164
|
||||
#: admin/templatetags/admin_extras.py:113
|
||||
#: admin/templatetags/admin_extras.py:128
|
||||
msgid "Domain aliases"
|
||||
msgstr "Domänen-Aliase"
|
||||
|
||||
#: admin/tables.py:16
|
||||
#: admin/templatetags/admin_extras.py:36
|
||||
#: admin/templatetags/admin_extras.py:116
|
||||
#: admin/templatetags/admin_extras.py:131
|
||||
msgid "Mailboxes"
|
||||
msgstr "Mailboxen"
|
||||
|
||||
#: admin/tables.py:18
|
||||
#: admin/views.py:394
|
||||
#: admin/templatetags/admin_extras.py:119
|
||||
#: admin/templatetags/admin_extras.py:134
|
||||
msgid "Mailbox aliases"
|
||||
msgstr "Mailboxen-Aliase"
|
||||
|
||||
@@ -293,6 +323,7 @@ msgstr "Mailboxen-Aliase"
|
||||
#: admin/tables.py:52
|
||||
#: admin/tables.py:82
|
||||
#: admin/tables.py:109
|
||||
#: admin/templatetags/admin_extras.py:98
|
||||
#: extensions/sievefilters/templates/sievefilters/filter.html:86
|
||||
#: extensions/sievefilters/templates/sievefilters/filters.html:7
|
||||
#: extensions/sievefilters/templates/sievefilters/guieditor.html:3
|
||||
@@ -541,6 +572,22 @@ msgstr "Berechtigungen entfernt"
|
||||
msgid "Modifications applied."
|
||||
msgstr "Änderungen übernommen."
|
||||
|
||||
#: admin/views.py:631
|
||||
#, python-format
|
||||
msgid "%d mailboxes imported successfully"
|
||||
msgstr "%d Mailboxen erfolgreich importiert"
|
||||
|
||||
#: admin/views.py:641
|
||||
#: admin/templatetags/admin_extras.py:112
|
||||
#: templates/admin/import.html:48
|
||||
msgid "Import data"
|
||||
msgstr "Daten importieren"
|
||||
|
||||
#: admin/views.py:642
|
||||
#: templates/admin/import.html:56
|
||||
msgid "Import"
|
||||
msgstr "Importiere"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:12
|
||||
msgid "enabled_m"
|
||||
msgstr "aktiviert_m"
|
||||
@@ -554,7 +601,7 @@ msgid "Admin"
|
||||
msgstr "Admin"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:29
|
||||
#: admin/templatetags/admin_extras.py:108
|
||||
#: admin/templatetags/admin_extras.py:123
|
||||
msgid "Domains"
|
||||
msgstr "Domänen"
|
||||
|
||||
@@ -576,55 +623,55 @@ msgstr "Parameter"
|
||||
msgid "Extensions"
|
||||
msgstr "Erweiterungen"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:97
|
||||
#: admin/templatetags/admin_extras.py:103
|
||||
msgid "New"
|
||||
msgstr "Neu"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:101
|
||||
#: admin/templatetags/admin_extras.py:107
|
||||
msgid "Remove"
|
||||
msgstr "Entfernen"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:134
|
||||
#: admin/templatetags/admin_extras.py:149
|
||||
msgid "Add permission"
|
||||
msgstr "Berechtigung hinzufügen"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:138
|
||||
#: admin/templatetags/admin_extras.py:153
|
||||
msgid "Remove permissions"
|
||||
msgstr "Berechtigung entziehen"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:151
|
||||
#: admin/templatetags/admin_extras.py:166
|
||||
msgid "Edit domain"
|
||||
msgstr "Domäne bearbeiten"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:157
|
||||
#: admin/templatetags/admin_extras.py:172
|
||||
msgid "View aliases of this domain"
|
||||
msgstr "Aliase dieser Domäne ansehen"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:167
|
||||
#: admin/templatetags/admin_extras.py:182
|
||||
msgid "Edit alias"
|
||||
msgstr "Alias bearbeiten"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:179
|
||||
#: admin/templatetags/admin_extras.py:194
|
||||
msgid "Edit mailbox"
|
||||
msgstr "Mailbox bearbeiten"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:185
|
||||
#: admin/templatetags/admin_extras.py:200
|
||||
msgid "View this mailbox aliases"
|
||||
msgstr "Aliase dieser Mailbox ansehen"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:200
|
||||
#: admin/templatetags/admin_extras.py:215
|
||||
msgid "Edit mailbox alias"
|
||||
msgstr "Mailbox-Alias bearbeiten"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:235
|
||||
#: admin/templatetags/admin_extras.py:250
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:235
|
||||
#: admin/templatetags/admin_extras.py:250
|
||||
msgid "No"
|
||||
msgstr "Nein"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:252
|
||||
#: admin/templatetags/admin_extras.py:267
|
||||
#: templates/common/genericform.html:6
|
||||
msgid "Help"
|
||||
msgstr "Hilfe"
|
||||
@@ -649,6 +696,36 @@ msgstr "Konto ist deaktiviert"
|
||||
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."
|
||||
|
||||
#: demo/__init__.py:16
|
||||
msgid "Test messages"
|
||||
msgstr "Test-Nachrichten"
|
||||
|
||||
#: demo/__init__.py:21
|
||||
msgid "Send virus"
|
||||
msgstr "Virus senden"
|
||||
|
||||
#: demo/__init__.py:25
|
||||
msgid "Send spam"
|
||||
msgstr "Spam senden"
|
||||
|
||||
#: demo/templates/demo/login_announcement.html:2
|
||||
msgid ""
|
||||
"\n"
|
||||
"<h1>Welcome to the online demo!</h1>\n"
|
||||
"<p><b>Warning:</b> the demo's concent is resetted every two hours.</p>\n"
|
||||
"<p>To try the demo, the following users are available (<i>username/password</i>): </p>\n"
|
||||
"<ul>\n"
|
||||
" <li>A super administrator : <b>admin/password</b></li>\n"
|
||||
" <li>A domain administrator : <b>admin@demo.local/admin</b></li>\n"
|
||||
" <li>A simple user : <b>user@demo.local/user</b></li>\n"
|
||||
"</ul>\n"
|
||||
"<p>Please report any issue of give any suggestion to \n"
|
||||
" <a href=\"https://groups.google.com/forum/#!forum/modoboa-users\">the mailing list</a>.</p>\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"<h1>Willkommen zur Online Demo!</h1>\n"
|
||||
"<p><b>Warnung:</b> die Inhalte der Demo werden alle zwei Stunden gelöscht.</p>\n"
|
||||
|
||||
#: extensions/amavis_quarantine/main.py:15
|
||||
msgid "Simple amavis quarantine management tool"
|
||||
msgstr "Einfaches amavis Quarantäne-Management Werkzeug"
|
||||
@@ -699,13 +776,13 @@ msgstr "Von"
|
||||
#: extensions/amavis_quarantine/sql_listing.py:22
|
||||
#: extensions/sievefilters/forms.py:29
|
||||
#: extensions/webmail/forms.py:8
|
||||
#: extensions/webmail/lib.py:521
|
||||
#: extensions/webmail/lib.py:525
|
||||
#: templates/common/email_searchbar.html:7
|
||||
msgid "Subject"
|
||||
msgstr "Betreff"
|
||||
|
||||
#: extensions/amavis_quarantine/sql_listing.py:23
|
||||
#: extensions/webmail/lib.py:523
|
||||
#: extensions/webmail/lib.py:527
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
@@ -1008,7 +1085,8 @@ msgid "Match type"
|
||||
msgstr "Übereinstimmung"
|
||||
|
||||
#: extensions/sievefilters/templates/sievefilters/filter.html:92
|
||||
#: templates/common/parameters.html:4
|
||||
#: templates/admin/parameters.html:14
|
||||
#: templates/userprefs/preferences.html:18
|
||||
msgid "Save"
|
||||
msgstr "Speichern"
|
||||
|
||||
@@ -1191,10 +1269,6 @@ msgstr "Start"
|
||||
msgid "End"
|
||||
msgstr "Aktiviert"
|
||||
|
||||
#: extensions/webmail/forms.py:14
|
||||
msgid "Select a file"
|
||||
msgstr "Wählen Sie eine Datei"
|
||||
|
||||
#: extensions/webmail/lib.py:33
|
||||
msgid "Server response"
|
||||
msgstr "Server-Antwort"
|
||||
@@ -1207,12 +1281,12 @@ msgstr "Verbindung zu IMAP-Server fehlgeschlagen. Überprüfen Sie Ihre Konfigur
|
||||
msgid "Authentication failed, check your configuration"
|
||||
msgstr "Authentifizierung fehlgeschlagen. Überprüfen Sie Ihre Konfiguration"
|
||||
|
||||
#: extensions/webmail/lib.py:468
|
||||
#: extensions/webmail/lib.py:472
|
||||
msgid "wrote:"
|
||||
msgstr "schrieb:"
|
||||
|
||||
#: extensions/webmail/lib.py:535
|
||||
#: extensions/webmail/lib.py:539
|
||||
#: extensions/webmail/lib.py:543
|
||||
msgid "Original message"
|
||||
msgstr "Gesendete Nachrichten"
|
||||
|
||||
@@ -1470,7 +1544,7 @@ msgstr "Leerer Ordner"
|
||||
msgid "No entries to display"
|
||||
msgstr "Keine Einträge darzustellen"
|
||||
|
||||
#: templates/nlayout.html:49
|
||||
#: templates/nlayout.html:50
|
||||
msgid "Logout"
|
||||
msgstr "Logout"
|
||||
|
||||
@@ -1478,11 +1552,7 @@ msgstr "Logout"
|
||||
msgid "Add"
|
||||
msgstr "Hinzufügen"
|
||||
|
||||
#: templates/admin/domains_header.html:44
|
||||
msgid "Remove this selection?"
|
||||
msgstr "Diese Auswahl entfernen?"
|
||||
|
||||
#: templates/admin/domains_header.html:52
|
||||
#: templates/admin/domains_header.html:13
|
||||
msgid "for"
|
||||
msgstr "Für"
|
||||
|
||||
@@ -1490,6 +1560,10 @@ msgstr "Für"
|
||||
msgid "Apply"
|
||||
msgstr "Antworten"
|
||||
|
||||
#: templates/admin/import.html:62
|
||||
msgid "Importing..."
|
||||
msgstr "Importiere …"
|
||||
|
||||
#: templates/admin/listing.html:12
|
||||
msgid "Items"
|
||||
msgstr "Einträge"
|
||||
@@ -1543,7 +1617,7 @@ msgstr "Fehler"
|
||||
msgid "Messages"
|
||||
msgstr "Nachrichten"
|
||||
|
||||
#: templates/common/parameters.html:16
|
||||
#: templates/common/parameters.html:15
|
||||
msgid "No parameters available"
|
||||
msgstr "Keine Parameter verfügbar"
|
||||
|
||||
@@ -1577,39 +1651,39 @@ msgstr "Bevorzugte Sprache"
|
||||
msgid "Prefered language to display pages"
|
||||
msgstr "Bevorzugte Sprache für Seitendarstellung"
|
||||
|
||||
#: userprefs/forms.py:12
|
||||
#: userprefs/forms.py:13
|
||||
msgid "Old password"
|
||||
msgstr "Altes Passwort"
|
||||
|
||||
#: userprefs/forms.py:14
|
||||
#: userprefs/forms.py:15
|
||||
msgid "New password"
|
||||
msgstr "Neues Passwort"
|
||||
|
||||
#: userprefs/forms.py:30
|
||||
#: userprefs/forms.py:34
|
||||
msgid "Old password mismatchs"
|
||||
msgstr "Altes Passwort stimmt nicht überein"
|
||||
|
||||
#: userprefs/forms.py:39
|
||||
#: userprefs/forms.py:43
|
||||
msgid "Destination(s)"
|
||||
msgstr "Ziel(e)"
|
||||
|
||||
#: userprefs/forms.py:52
|
||||
#: userprefs/forms.py:44
|
||||
msgid "Keep local copies"
|
||||
msgstr "Lokale Kopien behalten"
|
||||
|
||||
#: userprefs/forms.py:57
|
||||
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."
|
||||
|
||||
#: userprefs/views.py:34
|
||||
#: userprefs/views.py:27
|
||||
msgid "Password change is disabled for this user"
|
||||
msgstr "Passwort-Änderung ist für diesen Anwender deaktiviert"
|
||||
|
||||
#: userprefs/views.py:46
|
||||
msgid "Password changed"
|
||||
msgstr "Passwort geändert"
|
||||
|
||||
#: userprefs/views.py:63
|
||||
#: userprefs/views.py:79
|
||||
msgid "Forward updated"
|
||||
msgstr "Weiterleitung aktualisiert"
|
||||
|
||||
#~ msgid "Enabled"
|
||||
#~ msgstr "Aktiviert"
|
||||
|
||||
#~ msgid "Release this message?"
|
||||
#~ msgstr "Diese Nachricht freigeben?"
|
||||
|
||||
#~ msgid "Delete this message?"
|
||||
#~ msgstr "Diese Nachricht löschen?"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
# Modoboa German translation.
|
||||
# Copyright (C) 2011
|
||||
# Copyright (C) 2012
|
||||
# This file is distributed under the same license as the Modoboa package.
|
||||
#
|
||||
# Patrick Ben Koetter <p@state-of-mind.de>, 2010-2011.
|
||||
# Patrick Ben Koetter <p@state-of-mind.de>, 2010-2012.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Modoboa-0.8.7\n"
|
||||
"Report-Msgid-Bugs-To: http://dev.modoboa.org/\n"
|
||||
"POT-Creation-Date: 2011-09-30 15:26+0200\n"
|
||||
"PO-Revision-Date: 2011-10-09 00:26+0100\n"
|
||||
"Project-Id-Version: Modoboa-0.8.8\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-01-10 11:09+0100\n"
|
||||
"PO-Revision-Date: 2012-01-10 22:49+0100\n"
|
||||
"Last-Translator: Patrick Ben Koetter <p@state-of-mind.de>\n"
|
||||
"Language-Team: DE <p@state-of-mind.fr>\n"
|
||||
"Language: de\n"
|
||||
@@ -61,17 +61,17 @@ msgstr "Ordner bearbeiten"
|
||||
msgid "Folder deleted"
|
||||
msgstr "Ordner gelöscht"
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:94
|
||||
#: extensions/webmail/static/js/webmail.js:95
|
||||
msgid "Sending..."
|
||||
msgstr "Sende …"
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:227
|
||||
#: extensions/webmail/static/js/webmail.js:251
|
||||
#: static/js/anchor_nav.js:212
|
||||
#: extensions/webmail/static/js/webmail.js:229
|
||||
#: extensions/webmail/static/js/webmail.js:254
|
||||
#: static/js/anchor_nav.js:215
|
||||
msgid "Done"
|
||||
msgstr "Abgeschlossen"
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:240
|
||||
#: extensions/webmail/static/js/webmail.js:243
|
||||
msgid "Waiting..."
|
||||
msgstr "Warte..."
|
||||
|
||||
@@ -79,10 +79,18 @@ msgstr "Warte..."
|
||||
msgid "Loading..."
|
||||
msgstr "Lade..."
|
||||
|
||||
#: static/js/common.js:172
|
||||
#: static/js/common.js:17
|
||||
msgid "Message sent"
|
||||
msgstr "Nachrichten gesendet"
|
||||
|
||||
#: static/js/common.js:188
|
||||
msgid "Search..."
|
||||
msgstr "Suchen..."
|
||||
|
||||
#: static/js/domains.js:61
|
||||
msgid "Remove this selection?"
|
||||
msgstr "Diese Auswahl entfernen?"
|
||||
|
||||
#: static/js/preferences.js:14
|
||||
msgid "Preferences saved"
|
||||
msgstr "Einstellungen gespeichert"
|
||||
|
||||
+150
-74
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-09-30 15:26+0200\n"
|
||||
"POT-Creation-Date: 2012-01-10 11:09+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -17,45 +17,53 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: admin/__init__.py:8
|
||||
#: admin/__init__.py:9
|
||||
msgid "Local"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:11
|
||||
msgid "The backend used for authentication"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:13
|
||||
msgid "Modoboa will handle mailbox creation on filesystem"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:10
|
||||
#: admin/__init__.py:15
|
||||
msgid "Path to the root directory where messages are stored"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:12
|
||||
#: admin/__init__.py:17
|
||||
msgid ""
|
||||
"UID of the virtual user which owns domains/mailboxes/messages on the "
|
||||
"filesystem"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:14
|
||||
#: admin/__init__.py:19
|
||||
msgid ""
|
||||
"GID of the virtual user which owns domains/mailboxes/messages on the "
|
||||
"filesystem"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:17
|
||||
#: admin/__init__.py:22
|
||||
msgid "Mailboxes storage format"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:19
|
||||
#: admin/__init__.py:24
|
||||
msgid ""
|
||||
"Sub-directory (inside the mailbox) where messages are stored when using the "
|
||||
"maildir format"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:22
|
||||
#: admin/__init__.py:27
|
||||
msgid "Scheme used to crypt mailbox passwords"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:24
|
||||
#: admin/__init__.py:29
|
||||
msgid "Number of displayed items per page"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:31
|
||||
#: admin/__init__.py:52
|
||||
msgid "The default redirection used when no application is specified"
|
||||
msgstr ""
|
||||
|
||||
@@ -79,7 +87,7 @@ msgstr ""
|
||||
msgid "Password used to log in"
|
||||
msgstr ""
|
||||
|
||||
#: admin/forms.py:56 userprefs/forms.py:16
|
||||
#: admin/forms.py:56 userprefs/forms.py:17
|
||||
msgid "Confirmation"
|
||||
msgstr ""
|
||||
|
||||
@@ -91,7 +99,7 @@ msgstr ""
|
||||
msgid "Check to activate this mailbox"
|
||||
msgstr ""
|
||||
|
||||
#: admin/forms.py:88 userprefs/forms.py:35
|
||||
#: admin/forms.py:88 userprefs/forms.py:39
|
||||
msgid "Passwords mismatch"
|
||||
msgstr ""
|
||||
|
||||
@@ -143,91 +151,112 @@ msgstr ""
|
||||
msgid "Empty"
|
||||
msgstr ""
|
||||
|
||||
#: admin/forms.py:204 extensions/webmail/forms.py:14
|
||||
msgid "Select a file"
|
||||
msgstr ""
|
||||
|
||||
#: admin/forms.py:205
|
||||
msgid "Separator"
|
||||
msgstr ""
|
||||
|
||||
#: admin/lib.py:13
|
||||
#, python-format
|
||||
msgid "Invalid action, %(user)s is a local user"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:77 admin/models.py:141 admin/models.py:154
|
||||
#: admin/models.py:78 admin/models.py:142 admin/models.py:155
|
||||
msgid "name"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:78
|
||||
#: admin/models.py:79
|
||||
msgid "The domain name"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:79
|
||||
#: admin/models.py:80
|
||||
msgid "Default quota in MB applied to mailboxes"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:80 admin/models.py:145 admin/models.py:352
|
||||
#: admin/models.py:428 extensions/postfix_autoreply/models.py:19
|
||||
#: admin/models.py:81 admin/models.py:146 admin/models.py:393
|
||||
#: admin/models.py:469 extensions/postfix_autoreply/models.py:19
|
||||
msgid "enabled"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:81
|
||||
#: admin/models.py:82
|
||||
msgid "Check to activate this domain"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:134
|
||||
#: admin/models.py:135
|
||||
msgid "Failed to initialise domain, check permissions"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:142
|
||||
#: admin/models.py:143
|
||||
msgid "The alias name"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:143
|
||||
#: admin/models.py:144
|
||||
msgid "target"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:144
|
||||
#: admin/models.py:145
|
||||
msgid "The domain this alias points to"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:146 admin/models.py:353
|
||||
#: admin/models.py:147 admin/models.py:394
|
||||
msgid "Check to activate this alias"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:155
|
||||
#: admin/models.py:156
|
||||
msgid "First name and last name of mailbox owner"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:156 admin/models.py:346
|
||||
#: admin/models.py:157 admin/models.py:387
|
||||
msgid "address"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:157
|
||||
#: admin/models.py:158
|
||||
msgid "Mailbox address (without the @domain.tld part)"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:158
|
||||
#: admin/models.py:159
|
||||
msgid "password"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:245 admin/models.py:306
|
||||
#: admin/models.py:246 admin/models.py:327
|
||||
msgid "Failed to initialise mailbox, check permissions"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:264
|
||||
#: admin/models.py:265
|
||||
msgid "Mailbox with this address already exists"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:347
|
||||
#: admin/models.py:313
|
||||
#, python-format
|
||||
msgid "Failed to update password: %s"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:353
|
||||
msgid "Invalid line"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:359
|
||||
msgid "Cannot import this mailbox because the associated domain does not exist"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:388
|
||||
msgid ""
|
||||
"The alias address (without the domain part). For a 'catch-all' address, just "
|
||||
"enter an * character."
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:349
|
||||
#: admin/models.py:390
|
||||
msgid "mailboxes"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:350
|
||||
#: admin/models.py:391
|
||||
msgid "The mailboxes this alias points to"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:429
|
||||
#: admin/models.py:470
|
||||
msgid "Check to enable this extension"
|
||||
msgstr ""
|
||||
|
||||
@@ -256,22 +285,22 @@ msgid "Last modified"
|
||||
msgstr ""
|
||||
|
||||
#: admin/tables.py:14 admin/views.py:164
|
||||
#: admin/templatetags/admin_extras.py:113
|
||||
#: admin/templatetags/admin_extras.py:128
|
||||
msgid "Domain aliases"
|
||||
msgstr ""
|
||||
|
||||
#: admin/tables.py:16 admin/templatetags/admin_extras.py:36
|
||||
#: admin/templatetags/admin_extras.py:116
|
||||
#: admin/templatetags/admin_extras.py:131
|
||||
msgid "Mailboxes"
|
||||
msgstr ""
|
||||
|
||||
#: admin/tables.py:18 admin/views.py:394
|
||||
#: admin/templatetags/admin_extras.py:119
|
||||
#: admin/templatetags/admin_extras.py:134
|
||||
msgid "Mailbox aliases"
|
||||
msgstr ""
|
||||
|
||||
#: admin/tables.py:24 admin/tables.py:52 admin/tables.py:82
|
||||
#: admin/tables.py:109
|
||||
#: admin/tables.py:109 admin/templatetags/admin_extras.py:98
|
||||
#: extensions/sievefilters/templates/sievefilters/filter.html:86
|
||||
#: extensions/sievefilters/templates/sievefilters/filters.html:7
|
||||
#: extensions/sievefilters/templates/sievefilters/guieditor.html:3
|
||||
@@ -499,6 +528,20 @@ msgstr ""
|
||||
msgid "Modifications applied."
|
||||
msgstr ""
|
||||
|
||||
#: admin/views.py:631
|
||||
#, python-format
|
||||
msgid "%d mailboxes imported successfully"
|
||||
msgstr ""
|
||||
|
||||
#: admin/views.py:641 admin/templatetags/admin_extras.py:112
|
||||
#: templates/admin/import.html:48
|
||||
msgid "Import data"
|
||||
msgstr ""
|
||||
|
||||
#: admin/views.py:642 templates/admin/import.html:56
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:12
|
||||
msgid "enabled_m"
|
||||
msgstr ""
|
||||
@@ -512,7 +555,7 @@ msgid "Admin"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:29
|
||||
#: admin/templatetags/admin_extras.py:108
|
||||
#: admin/templatetags/admin_extras.py:123
|
||||
msgid "Domains"
|
||||
msgstr ""
|
||||
|
||||
@@ -533,55 +576,55 @@ msgstr ""
|
||||
msgid "Extensions"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:97
|
||||
#: admin/templatetags/admin_extras.py:103
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:101
|
||||
#: admin/templatetags/admin_extras.py:107
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:134
|
||||
#: admin/templatetags/admin_extras.py:149
|
||||
msgid "Add permission"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:138
|
||||
#: admin/templatetags/admin_extras.py:153
|
||||
msgid "Remove permissions"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:151
|
||||
#: admin/templatetags/admin_extras.py:166
|
||||
msgid "Edit domain"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:157
|
||||
#: admin/templatetags/admin_extras.py:172
|
||||
msgid "View aliases of this domain"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:167
|
||||
#: admin/templatetags/admin_extras.py:182
|
||||
msgid "Edit alias"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:179
|
||||
#: admin/templatetags/admin_extras.py:194
|
||||
msgid "Edit mailbox"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:185
|
||||
#: admin/templatetags/admin_extras.py:200
|
||||
msgid "View this mailbox aliases"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:200
|
||||
#: admin/templatetags/admin_extras.py:215
|
||||
msgid "Edit mailbox alias"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:235
|
||||
#: admin/templatetags/admin_extras.py:250
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:235
|
||||
#: admin/templatetags/admin_extras.py:250
|
||||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:252 templates/common/genericform.html:6
|
||||
#: admin/templatetags/admin_extras.py:267 templates/common/genericform.html:6
|
||||
msgid "Help"
|
||||
msgstr ""
|
||||
|
||||
@@ -605,6 +648,35 @@ msgstr ""
|
||||
msgid "Your username and password didn't match. Please try again."
|
||||
msgstr ""
|
||||
|
||||
#: demo/__init__.py:16
|
||||
msgid "Test messages"
|
||||
msgstr ""
|
||||
|
||||
#: demo/__init__.py:21
|
||||
msgid "Send virus"
|
||||
msgstr ""
|
||||
|
||||
#: demo/__init__.py:25
|
||||
msgid "Send spam"
|
||||
msgstr ""
|
||||
|
||||
#: demo/templates/demo/login_announcement.html:2
|
||||
msgid ""
|
||||
"\n"
|
||||
"<h1>Welcome to the online demo!</h1>\n"
|
||||
"<p><b>Warning:</b> the demo's concent is resetted every two hours.</p>\n"
|
||||
"<p>To try the demo, the following users are available (<i>username/password</"
|
||||
"i>): </p>\n"
|
||||
"<ul>\n"
|
||||
" <li>A super administrator : <b>admin/password</b></li>\n"
|
||||
" <li>A domain administrator : <b>admin@demo.local/admin</b></li>\n"
|
||||
" <li>A simple user : <b>user@demo.local/user</b></li>\n"
|
||||
"</ul>\n"
|
||||
"<p>Please report any issue of give any suggestion to \n"
|
||||
" <a href=\"https://groups.google.com/forum/#!forum/modoboa-users\">the "
|
||||
"mailing list</a>.</p>\n"
|
||||
msgstr ""
|
||||
|
||||
#: extensions/amavis_quarantine/main.py:15
|
||||
msgid "Simple amavis quarantine management tool"
|
||||
msgstr ""
|
||||
@@ -653,12 +725,12 @@ msgstr ""
|
||||
|
||||
#: extensions/amavis_quarantine/sql_listing.py:22
|
||||
#: extensions/sievefilters/forms.py:29 extensions/webmail/forms.py:8
|
||||
#: extensions/webmail/lib.py:521 templates/common/email_searchbar.html:7
|
||||
#: extensions/webmail/lib.py:525 templates/common/email_searchbar.html:7
|
||||
msgid "Subject"
|
||||
msgstr ""
|
||||
|
||||
#: extensions/amavis_quarantine/sql_listing.py:23
|
||||
#: extensions/webmail/lib.py:523
|
||||
#: extensions/webmail/lib.py:527
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
|
||||
@@ -960,7 +1032,7 @@ msgid "Match type"
|
||||
msgstr ""
|
||||
|
||||
#: extensions/sievefilters/templates/sievefilters/filter.html:92
|
||||
#: templates/common/parameters.html:4
|
||||
#: templates/admin/parameters.html:14 templates/userprefs/preferences.html:18
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
@@ -1142,10 +1214,6 @@ msgstr ""
|
||||
msgid "End"
|
||||
msgstr ""
|
||||
|
||||
#: extensions/webmail/forms.py:14
|
||||
msgid "Select a file"
|
||||
msgstr ""
|
||||
|
||||
#: extensions/webmail/lib.py:33
|
||||
msgid "Server response"
|
||||
msgstr ""
|
||||
@@ -1158,11 +1226,11 @@ msgstr ""
|
||||
msgid "Authentication failed, check your configuration"
|
||||
msgstr ""
|
||||
|
||||
#: extensions/webmail/lib.py:468
|
||||
#: extensions/webmail/lib.py:472
|
||||
msgid "wrote:"
|
||||
msgstr ""
|
||||
|
||||
#: extensions/webmail/lib.py:535 extensions/webmail/lib.py:539
|
||||
#: extensions/webmail/lib.py:539 extensions/webmail/lib.py:543
|
||||
msgid "Original message"
|
||||
msgstr ""
|
||||
|
||||
@@ -1419,7 +1487,7 @@ msgstr ""
|
||||
msgid "No entries to display"
|
||||
msgstr ""
|
||||
|
||||
#: templates/nlayout.html:49
|
||||
#: templates/nlayout.html:50
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
@@ -1427,11 +1495,7 @@ msgstr ""
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin/domains_header.html:44
|
||||
msgid "Remove this selection?"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin/domains_header.html:52
|
||||
#: templates/admin/domains_header.html:13
|
||||
msgid "for"
|
||||
msgstr ""
|
||||
|
||||
@@ -1439,6 +1503,10 @@ msgstr ""
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin/import.html:62
|
||||
msgid "Importing..."
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin/listing.html:12
|
||||
msgid "Items"
|
||||
msgstr ""
|
||||
@@ -1487,7 +1555,7 @@ msgstr ""
|
||||
msgid "Messages"
|
||||
msgstr ""
|
||||
|
||||
#: templates/common/parameters.html:16
|
||||
#: templates/common/parameters.html:15
|
||||
msgid "No parameters available"
|
||||
msgstr ""
|
||||
|
||||
@@ -1521,32 +1589,40 @@ msgstr ""
|
||||
msgid "Prefered language to display pages"
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/forms.py:12
|
||||
#: userprefs/forms.py:13
|
||||
msgid "Old password"
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/forms.py:14
|
||||
#: userprefs/forms.py:15
|
||||
msgid "New password"
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/forms.py:30
|
||||
#: userprefs/forms.py:34
|
||||
msgid "Old password mismatchs"
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/forms.py:39
|
||||
#: userprefs/forms.py:43
|
||||
msgid "Destination(s)"
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/forms.py:52
|
||||
#: userprefs/forms.py:44
|
||||
msgid "Keep local copies"
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/forms.py:57
|
||||
msgid ""
|
||||
"You can't define a forward to a local destination. Please ask your "
|
||||
"administrator to create an alias instead."
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/views.py:34
|
||||
#: userprefs/views.py:27
|
||||
msgid "Password change is disabled for this user"
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/views.py:46
|
||||
msgid "Password changed"
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/views.py:63
|
||||
#: userprefs/views.py:79
|
||||
msgid "Forward updated"
|
||||
msgstr ""
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-09-30 15:26+0200\n"
|
||||
"POT-Creation-Date: 2012-01-10 11:09+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -61,16 +61,16 @@ msgstr ""
|
||||
msgid "Folder deleted"
|
||||
msgstr ""
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:94
|
||||
#: extensions/webmail/static/js/webmail.js:95
|
||||
msgid "Sending..."
|
||||
msgstr ""
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:227
|
||||
#: extensions/webmail/static/js/webmail.js:251 static/js/anchor_nav.js:212
|
||||
#: extensions/webmail/static/js/webmail.js:229
|
||||
#: extensions/webmail/static/js/webmail.js:254 static/js/anchor_nav.js:215
|
||||
msgid "Done"
|
||||
msgstr ""
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:240
|
||||
#: extensions/webmail/static/js/webmail.js:243
|
||||
msgid "Waiting..."
|
||||
msgstr ""
|
||||
|
||||
@@ -78,10 +78,18 @@ msgstr ""
|
||||
msgid "Loading..."
|
||||
msgstr ""
|
||||
|
||||
#: static/js/common.js:172
|
||||
#: static/js/common.js:17
|
||||
msgid "Message sent"
|
||||
msgstr ""
|
||||
|
||||
#: static/js/common.js:188
|
||||
msgid "Search..."
|
||||
msgstr ""
|
||||
|
||||
#: static/js/domains.js:61
|
||||
msgid "Remove this selection?"
|
||||
msgstr ""
|
||||
|
||||
#: static/js/preferences.js:14
|
||||
msgid "Preferences saved"
|
||||
msgstr ""
|
||||
|
||||
+172
-94
@@ -1,54 +1,63 @@
|
||||
# Modoboa spanish translation.
|
||||
# Copyright (C) 2011
|
||||
# This file is distributed under the same license as the Modoboa package.
|
||||
#
|
||||
#
|
||||
# Translators:
|
||||
# Pedro Gracia <lasarux@neuroomante.com>, 2011.
|
||||
# Pedro Gracia <pedro.gracia@impulzia.com>, 2010, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Modoboa-0.8.7\n"
|
||||
"Report-Msgid-Bugs-To: http://dev.modoboa.org/\n"
|
||||
"POT-Creation-Date: 2011-09-30 15:26+0200\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-01-10 11:09+0100\n"
|
||||
"PO-Revision-Date: 2011-10-12 08:40+0000\n"
|
||||
"Last-Translator: lasarux <lasarux@neuroomante.com>\n"
|
||||
"Language-Team: ES <LL@li.org>\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: admin/__init__.py:8
|
||||
#: admin/__init__.py:9
|
||||
msgid "Local"
|
||||
msgstr ""
|
||||
|
||||
#: admin/__init__.py:11
|
||||
#, fuzzy
|
||||
msgid "The backend used for authentication"
|
||||
msgstr "Contraseña usada para autenticar"
|
||||
|
||||
#: admin/__init__.py:13
|
||||
msgid "Modoboa will handle mailbox creation on filesystem"
|
||||
msgstr ""
|
||||
"Modoboa se ocupará de la creación del \"mailbox\" en el sistema de ficheros."
|
||||
|
||||
#: admin/__init__.py:10
|
||||
#: admin/__init__.py:15
|
||||
msgid "Path to the root directory where messages are stored"
|
||||
msgstr "Directorio raiz dónde están almacenados los mensajes"
|
||||
|
||||
#: admin/__init__.py:12
|
||||
#: admin/__init__.py:17
|
||||
msgid ""
|
||||
"UID of the virtual user which owns domains/mailboxes/messages on the "
|
||||
"filesystem"
|
||||
msgstr ""
|
||||
"UID del usuario virtual que es el propietario de los "
|
||||
"dominios/mailboxes/mensajes en el sistema"
|
||||
"UID del usuario virtual que es el propietario de los dominios/mailboxes/"
|
||||
"mensajes en el sistema"
|
||||
|
||||
#: admin/__init__.py:14
|
||||
#: admin/__init__.py:19
|
||||
msgid ""
|
||||
"GID of the virtual user which owns domains/mailboxes/messages on the "
|
||||
"filesystem"
|
||||
msgstr ""
|
||||
"GID del usuario virtual que es el propietario de los "
|
||||
"dominios/mailboxes/mensajes en el sistema"
|
||||
"GID del usuario virtual que es el propietario de los dominios/mailboxes/"
|
||||
"mensajes en el sistema"
|
||||
|
||||
#: admin/__init__.py:17
|
||||
#: admin/__init__.py:22
|
||||
msgid "Mailboxes storage format"
|
||||
msgstr "Formato de almacenamiento de los \"Mailboxes\""
|
||||
|
||||
#: admin/__init__.py:19
|
||||
#: admin/__init__.py:24
|
||||
msgid ""
|
||||
"Sub-directory (inside the mailbox) where messages are stored when using the "
|
||||
"maildir format"
|
||||
@@ -56,15 +65,15 @@ msgstr ""
|
||||
"Subdirectorio (dentro del \"mailbox\") dónde los mensajes son almacenados "
|
||||
"cuando se usa el formato maildir"
|
||||
|
||||
#: admin/__init__.py:22
|
||||
#: admin/__init__.py:27
|
||||
msgid "Scheme used to crypt mailbox passwords"
|
||||
msgstr "Esquema usado para cifrar las contraseñas del \"mailbox\""
|
||||
|
||||
#: admin/__init__.py:24
|
||||
#: admin/__init__.py:29
|
||||
msgid "Number of displayed items per page"
|
||||
msgstr "Número de ítems mostrado por página"
|
||||
|
||||
#: admin/__init__.py:31
|
||||
#: admin/__init__.py:52
|
||||
msgid "The default redirection used when no application is specified"
|
||||
msgstr ""
|
||||
"La redirección que será usada cuando ninguna aplicación sea especificada."
|
||||
@@ -80,8 +89,7 @@ msgstr "Cuota"
|
||||
#: admin/forms.py:52
|
||||
msgid "Mailbox quota in MB (default to domain quota if blank)"
|
||||
msgstr ""
|
||||
"Cuota del \"Mailbox\" en MB (por defecto la del dominio, si no se "
|
||||
"especifica)"
|
||||
"Cuota del \"Mailbox\" en MB (por defecto la del dominio, si no se especifica)"
|
||||
|
||||
#: admin/forms.py:53 auth/forms.py:6
|
||||
msgid "Password"
|
||||
@@ -91,7 +99,7 @@ msgstr "Contraseña"
|
||||
msgid "Password used to log in"
|
||||
msgstr "Contraseña usada para identificarse (\"log in\")"
|
||||
|
||||
#: admin/forms.py:56 userprefs/forms.py:16
|
||||
#: admin/forms.py:56 userprefs/forms.py:17
|
||||
msgid "Confirmation"
|
||||
msgstr "Confirmación"
|
||||
|
||||
@@ -103,7 +111,7 @@ msgstr "Confirmación de la contraseña"
|
||||
msgid "Check to activate this mailbox"
|
||||
msgstr "Activar este 'mailbox'"
|
||||
|
||||
#: admin/forms.py:88 userprefs/forms.py:35
|
||||
#: admin/forms.py:88 userprefs/forms.py:39
|
||||
msgid "Passwords mismatch"
|
||||
msgstr "Las contraseñas no coinciden"
|
||||
|
||||
@@ -155,93 +163,115 @@ msgstr "Elija un dominio de la lista"
|
||||
msgid "Empty"
|
||||
msgstr "Vacío"
|
||||
|
||||
#: admin/forms.py:204 extensions/webmail/forms.py:14
|
||||
msgid "Select a file"
|
||||
msgstr "Seleccione un fichero"
|
||||
|
||||
#: admin/forms.py:205
|
||||
msgid "Separator"
|
||||
msgstr ""
|
||||
|
||||
#: admin/lib.py:13
|
||||
#, python-format
|
||||
msgid "Invalid action, %(user)s is a local user"
|
||||
msgstr "Acción inválida, %(user)s es un usuario local"
|
||||
|
||||
#: admin/models.py:77 admin/models.py:141 admin/models.py:154
|
||||
#: admin/models.py:78 admin/models.py:142 admin/models.py:155
|
||||
msgid "name"
|
||||
msgstr "nombre"
|
||||
|
||||
#: admin/models.py:78
|
||||
#: admin/models.py:79
|
||||
msgid "The domain name"
|
||||
msgstr "Nombre del dominio"
|
||||
|
||||
#: admin/models.py:79
|
||||
#: admin/models.py:80
|
||||
msgid "Default quota in MB applied to mailboxes"
|
||||
msgstr "Cuota por defecto en MB que se aplicarán a los \"mailboxes\""
|
||||
|
||||
#: admin/models.py:80 admin/models.py:145 admin/models.py:352
|
||||
#: admin/models.py:428 extensions/postfix_autoreply/models.py:19
|
||||
#: admin/models.py:81 admin/models.py:146 admin/models.py:393
|
||||
#: admin/models.py:469 extensions/postfix_autoreply/models.py:19
|
||||
msgid "enabled"
|
||||
msgstr "activado"
|
||||
|
||||
#: admin/models.py:81
|
||||
#: admin/models.py:82
|
||||
msgid "Check to activate this domain"
|
||||
msgstr "Activar este dominio"
|
||||
|
||||
#: admin/models.py:134
|
||||
#: admin/models.py:135
|
||||
msgid "Failed to initialise domain, check permissions"
|
||||
msgstr "Ha fallado la inicialización del dominio, compruebe permisos"
|
||||
|
||||
#: admin/models.py:142
|
||||
#: admin/models.py:143
|
||||
msgid "The alias name"
|
||||
msgstr "Nombre del alias"
|
||||
|
||||
#: admin/models.py:143
|
||||
#: admin/models.py:144
|
||||
msgid "target"
|
||||
msgstr "objetivo"
|
||||
|
||||
#: admin/models.py:144
|
||||
#: admin/models.py:145
|
||||
msgid "The domain this alias points to"
|
||||
msgstr "El dominio de este alias apuntan a"
|
||||
|
||||
#: admin/models.py:146 admin/models.py:353
|
||||
#: admin/models.py:147 admin/models.py:394
|
||||
msgid "Check to activate this alias"
|
||||
msgstr "Activar este alias"
|
||||
|
||||
#: admin/models.py:155
|
||||
#: admin/models.py:156
|
||||
msgid "First name and last name of mailbox owner"
|
||||
msgstr "Nombre y apellidos del propietario del \"mailbox\""
|
||||
|
||||
#: admin/models.py:156 admin/models.py:346
|
||||
#: admin/models.py:157 admin/models.py:387
|
||||
msgid "address"
|
||||
msgstr "dirección"
|
||||
|
||||
#: admin/models.py:157
|
||||
#: admin/models.py:158
|
||||
msgid "Mailbox address (without the @domain.tld part)"
|
||||
msgstr "Dirección del \"mailbox\" (sin la parte @dominio.tld)"
|
||||
|
||||
#: admin/models.py:158
|
||||
#: admin/models.py:159
|
||||
msgid "password"
|
||||
msgstr "contraseña"
|
||||
|
||||
#: admin/models.py:245 admin/models.py:306
|
||||
#: admin/models.py:246 admin/models.py:327
|
||||
msgid "Failed to initialise mailbox, check permissions"
|
||||
msgstr "Ha fallado la inicialización del \"mailbox\", compruebe permisos"
|
||||
|
||||
#: admin/models.py:264
|
||||
#: admin/models.py:265
|
||||
msgid "Mailbox with this address already exists"
|
||||
msgstr "Ya existe un \"Mailbox\" con esta dirección"
|
||||
|
||||
#: admin/models.py:347
|
||||
msgid ""
|
||||
"The alias address (without the domain part). For a 'catch-all' address, just"
|
||||
" enter an * character."
|
||||
#: admin/models.py:313
|
||||
#, python-format
|
||||
msgid "Failed to update password: %s"
|
||||
msgstr ""
|
||||
"La dirección del alias (sin la parte del dominio). Para una dirección que lo"
|
||||
" recoja todo, ponga un asterisco (*)."
|
||||
|
||||
#: admin/models.py:349
|
||||
#: admin/models.py:353
|
||||
#, fuzzy
|
||||
msgid "Invalid line"
|
||||
msgstr "'mailbox' inválido"
|
||||
|
||||
#: admin/models.py:359
|
||||
msgid "Cannot import this mailbox because the associated domain does not exist"
|
||||
msgstr ""
|
||||
|
||||
#: admin/models.py:388
|
||||
msgid ""
|
||||
"The alias address (without the domain part). For a 'catch-all' address, just "
|
||||
"enter an * character."
|
||||
msgstr ""
|
||||
"La dirección del alias (sin la parte del dominio). Para una dirección que lo "
|
||||
"recoja todo, ponga un asterisco (*)."
|
||||
|
||||
#: admin/models.py:390
|
||||
msgid "mailboxes"
|
||||
msgstr "'mailboxes'"
|
||||
|
||||
#: admin/models.py:350
|
||||
#: admin/models.py:391
|
||||
msgid "The mailboxes this alias points to"
|
||||
msgstr "Los 'mailboxes' de este alias apuntan a"
|
||||
|
||||
#: admin/models.py:429
|
||||
#: admin/models.py:470
|
||||
msgid "Check to enable this extension"
|
||||
msgstr "Activar esta extensión"
|
||||
|
||||
@@ -270,22 +300,22 @@ msgid "Last modified"
|
||||
msgstr "Última modificación"
|
||||
|
||||
#: admin/tables.py:14 admin/views.py:164
|
||||
#: admin/templatetags/admin_extras.py:113
|
||||
#: admin/templatetags/admin_extras.py:128
|
||||
msgid "Domain aliases"
|
||||
msgstr "Alias del dominio"
|
||||
|
||||
#: admin/tables.py:16 admin/templatetags/admin_extras.py:36
|
||||
#: admin/templatetags/admin_extras.py:116
|
||||
#: admin/templatetags/admin_extras.py:131
|
||||
msgid "Mailboxes"
|
||||
msgstr "'Mailboxes'"
|
||||
|
||||
#: admin/tables.py:18 admin/views.py:394
|
||||
#: admin/templatetags/admin_extras.py:119
|
||||
#: admin/templatetags/admin_extras.py:134
|
||||
msgid "Mailbox aliases"
|
||||
msgstr "Alias del \"mailbox\""
|
||||
|
||||
#: admin/tables.py:24 admin/tables.py:52 admin/tables.py:82
|
||||
#: admin/tables.py:109
|
||||
#: admin/tables.py:109 admin/templatetags/admin_extras.py:98
|
||||
#: extensions/sievefilters/templates/sievefilters/filter.html:86
|
||||
#: extensions/sievefilters/templates/sievefilters/filters.html:7
|
||||
#: extensions/sievefilters/templates/sievefilters/guieditor.html:3
|
||||
@@ -513,6 +543,20 @@ msgstr "Permisos eliminados"
|
||||
msgid "Modifications applied."
|
||||
msgstr "Modificaciones aplicadas."
|
||||
|
||||
#: admin/views.py:631
|
||||
#, fuzzy, python-format
|
||||
msgid "%d mailboxes imported successfully"
|
||||
msgstr "%(count)d mensaje eliminado correctamente"
|
||||
|
||||
#: admin/views.py:641 admin/templatetags/admin_extras.py:112
|
||||
#: templates/admin/import.html:48
|
||||
msgid "Import data"
|
||||
msgstr ""
|
||||
|
||||
#: admin/views.py:642 templates/admin/import.html:56
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:12
|
||||
msgid "enabled_m"
|
||||
msgstr "Activado"
|
||||
@@ -526,7 +570,7 @@ msgid "Admin"
|
||||
msgstr "Administrador"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:29
|
||||
#: admin/templatetags/admin_extras.py:108
|
||||
#: admin/templatetags/admin_extras.py:123
|
||||
msgid "Domains"
|
||||
msgstr "Dominios"
|
||||
|
||||
@@ -547,55 +591,55 @@ msgstr "Parámetros"
|
||||
msgid "Extensions"
|
||||
msgstr "Extensiones"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:97
|
||||
#: admin/templatetags/admin_extras.py:103
|
||||
msgid "New"
|
||||
msgstr "Nuevo"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:101
|
||||
#: admin/templatetags/admin_extras.py:107
|
||||
msgid "Remove"
|
||||
msgstr "Eliminar"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:134
|
||||
#: admin/templatetags/admin_extras.py:149
|
||||
msgid "Add permission"
|
||||
msgstr "Añadir un permiso"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:138
|
||||
#: admin/templatetags/admin_extras.py:153
|
||||
msgid "Remove permissions"
|
||||
msgstr "Elminar permisos"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:151
|
||||
#: admin/templatetags/admin_extras.py:166
|
||||
msgid "Edit domain"
|
||||
msgstr "Editar el dominio"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:157
|
||||
#: admin/templatetags/admin_extras.py:172
|
||||
msgid "View aliases of this domain"
|
||||
msgstr "Activar los alias este dominio"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:167
|
||||
#: admin/templatetags/admin_extras.py:182
|
||||
msgid "Edit alias"
|
||||
msgstr "Editar el alias"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:179
|
||||
#: admin/templatetags/admin_extras.py:194
|
||||
msgid "Edit mailbox"
|
||||
msgstr "Editar el \"mailbox\""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:185
|
||||
#: admin/templatetags/admin_extras.py:200
|
||||
msgid "View this mailbox aliases"
|
||||
msgstr "Mostrar este alias del \"mailbox\""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:200
|
||||
#: admin/templatetags/admin_extras.py:215
|
||||
msgid "Edit mailbox alias"
|
||||
msgstr "Editar el alias del \"mailbox\""
|
||||
|
||||
#: admin/templatetags/admin_extras.py:235
|
||||
#: admin/templatetags/admin_extras.py:250
|
||||
msgid "Yes"
|
||||
msgstr "Sí"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:235
|
||||
#: admin/templatetags/admin_extras.py:250
|
||||
msgid "No"
|
||||
msgstr "No "
|
||||
|
||||
#: admin/templatetags/admin_extras.py:252 templates/common/genericform.html:6
|
||||
#: admin/templatetags/admin_extras.py:267 templates/common/genericform.html:6
|
||||
msgid "Help"
|
||||
msgstr "Ayuda"
|
||||
|
||||
@@ -621,6 +665,38 @@ msgstr ""
|
||||
"Su nombre de usuario y contraseña no concuerdan. Por favor, inténtelo de "
|
||||
"nuevo."
|
||||
|
||||
#: demo/__init__.py:16
|
||||
#, fuzzy
|
||||
msgid "Test messages"
|
||||
msgstr "mensajes enviados"
|
||||
|
||||
#: demo/__init__.py:21
|
||||
#, fuzzy
|
||||
msgid "Send virus"
|
||||
msgstr "Remitente"
|
||||
|
||||
#: demo/__init__.py:25
|
||||
#, fuzzy
|
||||
msgid "Send spam"
|
||||
msgstr "Enviar"
|
||||
|
||||
#: demo/templates/demo/login_announcement.html:2
|
||||
msgid ""
|
||||
"\n"
|
||||
"<h1>Welcome to the online demo!</h1>\n"
|
||||
"<p><b>Warning:</b> the demo's concent is resetted every two hours.</p>\n"
|
||||
"<p>To try the demo, the following users are available (<i>username/password</"
|
||||
"i>): </p>\n"
|
||||
"<ul>\n"
|
||||
" <li>A super administrator : <b>admin/password</b></li>\n"
|
||||
" <li>A domain administrator : <b>admin@demo.local/admin</b></li>\n"
|
||||
" <li>A simple user : <b>user@demo.local/user</b></li>\n"
|
||||
"</ul>\n"
|
||||
"<p>Please report any issue of give any suggestion to \n"
|
||||
" <a href=\"https://groups.google.com/forum/#!forum/modoboa-users\">the "
|
||||
"mailing list</a>.</p>\n"
|
||||
msgstr ""
|
||||
|
||||
#: extensions/amavis_quarantine/main.py:15
|
||||
msgid "Simple amavis quarantine management tool"
|
||||
msgstr "Herramienta simple de adminitración de cuarentena para amavis "
|
||||
@@ -634,8 +710,8 @@ msgstr ""
|
||||
#: extensions/amavis_quarantine/main.py:25
|
||||
msgid "Remove messages marked as released while cleaning up the database"
|
||||
msgstr ""
|
||||
"Eliminar los mensajes marcados como publicados cuando se haga limpieza de la"
|
||||
" base de datos"
|
||||
"Eliminar los mensajes marcados como publicados cuando se haga limpieza de la "
|
||||
"base de datos"
|
||||
|
||||
#: extensions/amavis_quarantine/main.py:29
|
||||
msgid "Mode used to access the PDP server"
|
||||
@@ -673,12 +749,12 @@ msgstr "Desde"
|
||||
|
||||
#: extensions/amavis_quarantine/sql_listing.py:22
|
||||
#: extensions/sievefilters/forms.py:29 extensions/webmail/forms.py:8
|
||||
#: extensions/webmail/lib.py:521 templates/common/email_searchbar.html:7
|
||||
#: extensions/webmail/lib.py:525 templates/common/email_searchbar.html:7
|
||||
msgid "Subject"
|
||||
msgstr "Tema"
|
||||
|
||||
#: extensions/amavis_quarantine/sql_listing.py:23
|
||||
#: extensions/webmail/lib.py:523
|
||||
#: extensions/webmail/lib.py:527
|
||||
msgid "Date"
|
||||
msgstr "Fecha"
|
||||
|
||||
@@ -882,8 +958,7 @@ msgstr "Redirigir el mensaje a"
|
||||
|
||||
#: extensions/sievefilters/lib.py:37
|
||||
msgid "Connection to MANAGESIEVE server failed, check your configuration"
|
||||
msgstr ""
|
||||
"La conexión al servidor MANAGESIEVE falló, verifique su configuración."
|
||||
msgstr "La conexión al servidor MANAGESIEVE falló, verifique su configuración."
|
||||
|
||||
#: extensions/sievefilters/lib.py:78
|
||||
msgid "Not enough space on server"
|
||||
@@ -981,7 +1056,7 @@ msgid "Match type"
|
||||
msgstr "Tipo de coincidencia"
|
||||
|
||||
#: extensions/sievefilters/templates/sievefilters/filter.html:92
|
||||
#: templates/common/parameters.html:4
|
||||
#: templates/admin/parameters.html:14 templates/userprefs/preferences.html:18
|
||||
msgid "Save"
|
||||
msgstr "Guardar"
|
||||
|
||||
@@ -1165,10 +1240,6 @@ msgstr "Inicio"
|
||||
msgid "End"
|
||||
msgstr "Fin"
|
||||
|
||||
#: extensions/webmail/forms.py:14
|
||||
msgid "Select a file"
|
||||
msgstr "Seleccione un fichero"
|
||||
|
||||
#: extensions/webmail/lib.py:33
|
||||
msgid "Server response"
|
||||
msgstr "Respuesta del servidor"
|
||||
@@ -1181,11 +1252,11 @@ msgstr "Ha fallado la conexión al servidor IMAP, compruebe su configuración"
|
||||
msgid "Authentication failed, check your configuration"
|
||||
msgstr "Ha fallado la autenticación, compruebe su configuración"
|
||||
|
||||
#: extensions/webmail/lib.py:468
|
||||
#: extensions/webmail/lib.py:472
|
||||
msgid "wrote:"
|
||||
msgstr "escribió:"
|
||||
|
||||
#: extensions/webmail/lib.py:535 extensions/webmail/lib.py:539
|
||||
#: extensions/webmail/lib.py:539 extensions/webmail/lib.py:543
|
||||
msgid "Original message"
|
||||
msgstr "Mensaje original"
|
||||
|
||||
@@ -1442,7 +1513,7 @@ msgstr "Vaciar la carpeta"
|
||||
msgid "No entries to display"
|
||||
msgstr "No hay entradas que mostrar"
|
||||
|
||||
#: templates/nlayout.html:49
|
||||
#: templates/nlayout.html:50
|
||||
msgid "Logout"
|
||||
msgstr "Salir"
|
||||
|
||||
@@ -1450,11 +1521,7 @@ msgstr "Salir"
|
||||
msgid "Add"
|
||||
msgstr "Añadir"
|
||||
|
||||
#: templates/admin/domains_header.html:44
|
||||
msgid "Remove this selection?"
|
||||
msgstr "¿Eliminar esta selección?"
|
||||
|
||||
#: templates/admin/domains_header.html:52
|
||||
#: templates/admin/domains_header.html:13
|
||||
msgid "for"
|
||||
msgstr "para"
|
||||
|
||||
@@ -1462,6 +1529,11 @@ msgstr "para"
|
||||
msgid "Apply"
|
||||
msgstr "Aplicar"
|
||||
|
||||
#: templates/admin/import.html:62
|
||||
#, fuzzy
|
||||
msgid "Importing..."
|
||||
msgstr "Subiendo..."
|
||||
|
||||
#: templates/admin/listing.html:12
|
||||
msgid "Items"
|
||||
msgstr "Ítems"
|
||||
@@ -1510,7 +1582,7 @@ msgstr "Error"
|
||||
msgid "Messages"
|
||||
msgstr "Mensajes"
|
||||
|
||||
#: templates/common/parameters.html:16
|
||||
#: templates/common/parameters.html:15
|
||||
msgid "No parameters available"
|
||||
msgstr "No hay parámetros disponibles"
|
||||
|
||||
@@ -1544,23 +1616,27 @@ msgstr "Idioma preferido"
|
||||
msgid "Prefered language to display pages"
|
||||
msgstr "Idioma preferido para mostrar las páginas"
|
||||
|
||||
#: userprefs/forms.py:12
|
||||
#: userprefs/forms.py:13
|
||||
msgid "Old password"
|
||||
msgstr "Contraseña anterior"
|
||||
|
||||
#: userprefs/forms.py:14
|
||||
#: userprefs/forms.py:15
|
||||
msgid "New password"
|
||||
msgstr "Nueva contraseña"
|
||||
|
||||
#: userprefs/forms.py:30
|
||||
#: userprefs/forms.py:34
|
||||
msgid "Old password mismatchs"
|
||||
msgstr "La contraseña no concuerda con la anterior"
|
||||
|
||||
#: userprefs/forms.py:39
|
||||
#: userprefs/forms.py:43
|
||||
msgid "Destination(s)"
|
||||
msgstr "Destino(s)"
|
||||
|
||||
#: userprefs/forms.py:52
|
||||
#: userprefs/forms.py:44
|
||||
msgid "Keep local copies"
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/forms.py:57
|
||||
msgid ""
|
||||
"You can't define a forward to a local destination. Please ask your "
|
||||
"administrator to create an alias instead."
|
||||
@@ -1568,12 +1644,14 @@ msgstr ""
|
||||
"No puede definir un reenvío a un destino local. Por favor, pregunte a su "
|
||||
"administrador para crear un alias en su lugar."
|
||||
|
||||
#: userprefs/views.py:34
|
||||
#: userprefs/views.py:27
|
||||
msgid "Password change is disabled for this user"
|
||||
msgstr ""
|
||||
|
||||
#: userprefs/views.py:46
|
||||
msgid "Password changed"
|
||||
msgstr "Contraseña cambiada"
|
||||
|
||||
#: userprefs/views.py:63
|
||||
#: userprefs/views.py:79
|
||||
msgid "Forward updated"
|
||||
msgstr "Reenvío actualizado"
|
||||
|
||||
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
# Modoboa spanish translation.
|
||||
# Copyright (C) 2011
|
||||
# This file is distributed under the same license as the Modoboa package.
|
||||
#
|
||||
#
|
||||
# Translators:
|
||||
# Pedro Gracia <lasarux@neuroomante.com>, 2011.
|
||||
# Pedro Gracia <pedro.gracia@impulzia.com>, 2010, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Modoboa-0.8.7\n"
|
||||
"Report-Msgid-Bugs-To: http://dev.modoboa.org/\n"
|
||||
"POT-Creation-Date: 2011-09-30 15:26+0200\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-01-10 11:09+0100\n"
|
||||
"PO-Revision-Date: 2011-10-12 08:42+0000\n"
|
||||
"Last-Translator: lasarux <lasarux@neuroomante.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: extensions/amavis_quarantine/static/js/quarantine.js:41
|
||||
@@ -63,16 +63,16 @@ msgstr "Editar carpeta"
|
||||
msgid "Folder deleted"
|
||||
msgstr "Carpeta eliminada"
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:94
|
||||
#: extensions/webmail/static/js/webmail.js:95
|
||||
msgid "Sending..."
|
||||
msgstr "Enviando..."
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:227
|
||||
#: extensions/webmail/static/js/webmail.js:251 static/js/anchor_nav.js:212
|
||||
#: extensions/webmail/static/js/webmail.js:229
|
||||
#: extensions/webmail/static/js/webmail.js:254 static/js/anchor_nav.js:215
|
||||
msgid "Done"
|
||||
msgstr "Hecho"
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:240
|
||||
#: extensions/webmail/static/js/webmail.js:243
|
||||
msgid "Waiting..."
|
||||
msgstr "Esperando..."
|
||||
|
||||
@@ -80,10 +80,18 @@ msgstr "Esperando..."
|
||||
msgid "Loading..."
|
||||
msgstr "Cargando..."
|
||||
|
||||
#: static/js/common.js:172
|
||||
#: static/js/common.js:17
|
||||
msgid "Message sent"
|
||||
msgstr ""
|
||||
|
||||
#: static/js/common.js:188
|
||||
msgid "Search..."
|
||||
msgstr "Buscar..."
|
||||
|
||||
#: static/js/domains.js:61
|
||||
msgid "Remove this selection?"
|
||||
msgstr "¿Eliminar esta selección?"
|
||||
|
||||
#: static/js/preferences.js:14
|
||||
msgid "Preferences saved"
|
||||
msgstr "Preferencias guardas"
|
||||
@@ -91,5 +99,3 @@ msgstr "Preferencias guardas"
|
||||
#: static/js/settings.js:14
|
||||
msgid "Parameters saved"
|
||||
msgstr "Parámetros guardados"
|
||||
|
||||
|
||||
|
||||
+166
-76
@@ -5,9 +5,9 @@
|
||||
# Antoine Nguyen <tonio@ngyn.org>, 2010-2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: modoboa-0.8.7\n"
|
||||
"Report-Msgid-Bugs-To: http://dev.modoboa.org/\n"
|
||||
"POT-Creation-Date: 2011-09-30 15:25+0200\n"
|
||||
"Project-Id-Version: modoboa-0.8.8\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-01-10 11:09+0100\n"
|
||||
"PO-Revision-Date: 2011-01-07 10:00+100\n"
|
||||
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
|
||||
"Language-Team: FR <tonio@ngyn.org>\n"
|
||||
@@ -17,16 +17,24 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: admin/__init__.py:8
|
||||
#: admin/__init__.py:9
|
||||
msgid "Local"
|
||||
msgstr "Locale"
|
||||
|
||||
#: admin/__init__.py:11
|
||||
msgid "The backend used for authentication"
|
||||
msgstr "Le backend utilisé pour l'authentification"
|
||||
|
||||
#: admin/__init__.py:13
|
||||
msgid "Modoboa will handle mailbox creation on filesystem"
|
||||
msgstr ""
|
||||
"Modoboa prendra en charge la création des boites sur le système de fichiers"
|
||||
|
||||
#: admin/__init__.py:10
|
||||
#: admin/__init__.py:15
|
||||
msgid "Path to the root directory where messages are stored"
|
||||
msgstr "Emplacement du répertoire ou sont stockés les messages"
|
||||
|
||||
#: admin/__init__.py:12
|
||||
#: admin/__init__.py:17
|
||||
msgid ""
|
||||
"UID of the virtual user which owns domains/mailboxes/messages on the "
|
||||
"filesystem"
|
||||
@@ -34,7 +42,7 @@ msgstr ""
|
||||
"UID du propriétaire virtuel des domaines/bals/messages sur le système de "
|
||||
"fichiers"
|
||||
|
||||
#: admin/__init__.py:14
|
||||
#: admin/__init__.py:19
|
||||
msgid ""
|
||||
"GID of the virtual user which owns domains/mailboxes/messages on the "
|
||||
"filesystem"
|
||||
@@ -42,11 +50,11 @@ msgstr ""
|
||||
"GID du propriétaire virtuel des domaines/bals/messages sur le système de "
|
||||
"fichiers"
|
||||
|
||||
#: admin/__init__.py:17
|
||||
#: admin/__init__.py:22
|
||||
msgid "Mailboxes storage format"
|
||||
msgstr "Format de stockage des boites aux lettres"
|
||||
|
||||
#: admin/__init__.py:19
|
||||
#: admin/__init__.py:24
|
||||
msgid ""
|
||||
"Sub-directory (inside the mailbox) where messages are stored when using the "
|
||||
"maildir format"
|
||||
@@ -54,16 +62,16 @@ msgstr ""
|
||||
"Sous répertoire (dans la boite aux lettres) ou les messages sont stockés en "
|
||||
"cas d'utilisation du format maildir"
|
||||
|
||||
#: admin/__init__.py:22
|
||||
#: admin/__init__.py:27
|
||||
msgid "Scheme used to crypt mailbox passwords"
|
||||
msgstr ""
|
||||
"Méthode utilisée pour chiffrer les mots de passe des boites aux lettres"
|
||||
|
||||
#: admin/__init__.py:24
|
||||
#: admin/__init__.py:29
|
||||
msgid "Number of displayed items per page"
|
||||
msgstr "Nombre d'éléments affichés par page"
|
||||
|
||||
#: admin/__init__.py:31
|
||||
#: admin/__init__.py:52
|
||||
msgid "The default redirection used when no application is specified"
|
||||
msgstr ""
|
||||
"La redirection appliquée par défaut quand aucune application n'est spécifiée"
|
||||
@@ -89,7 +97,7 @@ msgstr "Mot de passe"
|
||||
msgid "Password used to log in"
|
||||
msgstr "Mot de passe utilisé pour se connecter"
|
||||
|
||||
#: admin/forms.py:56 userprefs/forms.py:16
|
||||
#: admin/forms.py:56 userprefs/forms.py:17
|
||||
msgid "Confirmation"
|
||||
msgstr "Confirmation"
|
||||
|
||||
@@ -101,7 +109,7 @@ msgstr "Confirmation du mot de passe"
|
||||
msgid "Check to activate this mailbox"
|
||||
msgstr "Cocher pour activer cette boite aux lettres"
|
||||
|
||||
#: admin/forms.py:88 userprefs/forms.py:35
|
||||
#: admin/forms.py:88 userprefs/forms.py:39
|
||||
msgid "Passwords mismatch"
|
||||
msgstr "Les mots de passe diffèrent"
|
||||
|
||||
@@ -153,78 +161,99 @@ msgstr "Sélectionner un domaine dans la liste"
|
||||
msgid "Empty"
|
||||
msgstr "Vide"
|
||||
|
||||
#: admin/forms.py:204 extensions/webmail/forms.py:14
|
||||
msgid "Select a file"
|
||||
msgstr "Sélectionner un fichier"
|
||||
|
||||
#: admin/forms.py:205
|
||||
msgid "Separator"
|
||||
msgstr "Séparateur"
|
||||
|
||||
#: admin/lib.py:13
|
||||
#, python-format
|
||||
msgid "Invalid action, %(user)s is a local user"
|
||||
msgstr "Action invalide, %(user)s est un utilisateur local"
|
||||
|
||||
#: admin/models.py:77 admin/models.py:141 admin/models.py:154
|
||||
#: admin/models.py:78 admin/models.py:142 admin/models.py:155
|
||||
msgid "name"
|
||||
msgstr "Nom"
|
||||
|
||||
#: admin/models.py:78
|
||||
#: admin/models.py:79
|
||||
msgid "The domain name"
|
||||
msgstr "Le nom du domaine"
|
||||
|
||||
#: admin/models.py:79
|
||||
#: admin/models.py:80
|
||||
msgid "Default quota in MB applied to mailboxes"
|
||||
msgstr "Quota par défaut en Mo appliqué aux boites aux lettres"
|
||||
|
||||
#: admin/models.py:80 admin/models.py:145 admin/models.py:352
|
||||
#: admin/models.py:428 extensions/postfix_autoreply/models.py:19
|
||||
#: admin/models.py:81 admin/models.py:146 admin/models.py:393
|
||||
#: admin/models.py:469 extensions/postfix_autoreply/models.py:19
|
||||
msgid "enabled"
|
||||
msgstr "Activé"
|
||||
|
||||
#: admin/models.py:81
|
||||
#: admin/models.py:82
|
||||
msgid "Check to activate this domain"
|
||||
msgstr "Cocher pour activer ce domaine"
|
||||
|
||||
#: admin/models.py:134
|
||||
#: admin/models.py:135
|
||||
msgid "Failed to initialise domain, check permissions"
|
||||
msgstr "Impossible d'initialiser le domaine, vérifier les permissions"
|
||||
|
||||
#: admin/models.py:142
|
||||
#: admin/models.py:143
|
||||
msgid "The alias name"
|
||||
msgstr "Le nom de l'alias"
|
||||
|
||||
#: admin/models.py:143
|
||||
#: admin/models.py:144
|
||||
msgid "target"
|
||||
msgstr "cible"
|
||||
|
||||
#: admin/models.py:144
|
||||
#: admin/models.py:145
|
||||
msgid "The domain this alias points to"
|
||||
msgstr "Le domaine vers lequel cet alias pointe"
|
||||
|
||||
#: admin/models.py:146 admin/models.py:353
|
||||
#: admin/models.py:147 admin/models.py:394
|
||||
msgid "Check to activate this alias"
|
||||
msgstr "Cocher pour activer cet alias"
|
||||
|
||||
#: admin/models.py:155
|
||||
#: admin/models.py:156
|
||||
msgid "First name and last name of mailbox owner"
|
||||
msgstr "Prénom et nom du propriétaire de la boite aux lettres"
|
||||
|
||||
#: admin/models.py:156 admin/models.py:346
|
||||
#: admin/models.py:157 admin/models.py:387
|
||||
msgid "address"
|
||||
msgstr "Adresse"
|
||||
|
||||
#: admin/models.py:157
|
||||
#: admin/models.py:158
|
||||
msgid "Mailbox address (without the @domain.tld part)"
|
||||
msgstr "Adresse de la boite aux lettres (sans la partie @domain.tld)"
|
||||
|
||||
#: admin/models.py:158
|
||||
#: admin/models.py:159
|
||||
msgid "password"
|
||||
msgstr "Mot de passe"
|
||||
|
||||
#: admin/models.py:245 admin/models.py:306
|
||||
#: admin/models.py:246 admin/models.py:327
|
||||
msgid "Failed to initialise mailbox, check permissions"
|
||||
msgstr ""
|
||||
"Impossible d'initialiser la boite aux lettres, vérifier les permissions"
|
||||
|
||||
#: admin/models.py:264
|
||||
#: admin/models.py:265
|
||||
msgid "Mailbox with this address already exists"
|
||||
msgstr "Une boite aux lettres pour cette adresse existe déjà"
|
||||
|
||||
#: admin/models.py:347
|
||||
#: admin/models.py:313
|
||||
#, python-format
|
||||
msgid "Failed to update password: %s"
|
||||
msgstr "Echec de la mise à jour du mot de passe : %s"
|
||||
|
||||
#: admin/models.py:353
|
||||
msgid "Invalid line"
|
||||
msgstr "Ligne invalide"
|
||||
|
||||
#: admin/models.py:359
|
||||
msgid "Cannot import this mailbox because the associated domain does not exist"
|
||||
msgstr "Impossible d'importer cette boite car le domaine associé n'existe pas"
|
||||
|
||||
#: admin/models.py:388
|
||||
msgid ""
|
||||
"The alias address (without the domain part). For a 'catch-all' address, just "
|
||||
"enter an * character."
|
||||
@@ -232,15 +261,15 @@ msgstr ""
|
||||
"L'adresse de l'alias (sans la partie domaine). Pour une adresse 'attrape-"
|
||||
"tout', entrer juste un caractère *."
|
||||
|
||||
#: admin/models.py:349
|
||||
#: admin/models.py:390
|
||||
msgid "mailboxes"
|
||||
msgstr "Boites aux lettres"
|
||||
|
||||
#: admin/models.py:350
|
||||
#: admin/models.py:391
|
||||
msgid "The mailboxes this alias points to"
|
||||
msgstr "Les boites aux lettres sur lesquelles pointe cet alias"
|
||||
|
||||
#: admin/models.py:429
|
||||
#: admin/models.py:470
|
||||
msgid "Check to enable this extension"
|
||||
msgstr "Cocher pour activer cette extension"
|
||||
|
||||
@@ -269,22 +298,22 @@ msgid "Last modified"
|
||||
msgstr "Modifié"
|
||||
|
||||
#: admin/tables.py:14 admin/views.py:164
|
||||
#: admin/templatetags/admin_extras.py:113
|
||||
#: admin/templatetags/admin_extras.py:128
|
||||
msgid "Domain aliases"
|
||||
msgstr "Alias de domaine"
|
||||
|
||||
#: admin/tables.py:16 admin/templatetags/admin_extras.py:36
|
||||
#: admin/templatetags/admin_extras.py:116
|
||||
#: admin/templatetags/admin_extras.py:131
|
||||
msgid "Mailboxes"
|
||||
msgstr "Boites"
|
||||
|
||||
#: admin/tables.py:18 admin/views.py:394
|
||||
#: admin/templatetags/admin_extras.py:119
|
||||
#: admin/templatetags/admin_extras.py:134
|
||||
msgid "Mailbox aliases"
|
||||
msgstr "Alias de boite."
|
||||
|
||||
#: admin/tables.py:24 admin/tables.py:52 admin/tables.py:82
|
||||
#: admin/tables.py:109
|
||||
#: admin/tables.py:109 admin/templatetags/admin_extras.py:98
|
||||
#: extensions/sievefilters/templates/sievefilters/filter.html:86
|
||||
#: extensions/sievefilters/templates/sievefilters/filters.html:7
|
||||
#: extensions/sievefilters/templates/sievefilters/guieditor.html:3
|
||||
@@ -512,6 +541,20 @@ msgstr "Permission supprimée"
|
||||
msgid "Modifications applied."
|
||||
msgstr "Modifications appliquées"
|
||||
|
||||
#: admin/views.py:631
|
||||
#, python-format
|
||||
msgid "%d mailboxes imported successfully"
|
||||
msgstr "%d boites importées avec succès"
|
||||
|
||||
#: admin/views.py:641 admin/templatetags/admin_extras.py:112
|
||||
#: templates/admin/import.html:48
|
||||
msgid "Import data"
|
||||
msgstr "Importer des données"
|
||||
|
||||
#: admin/views.py:642 templates/admin/import.html:56
|
||||
msgid "Import"
|
||||
msgstr "Importer"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:12
|
||||
msgid "enabled_m"
|
||||
msgstr "Activé"
|
||||
@@ -525,7 +568,7 @@ msgid "Admin"
|
||||
msgstr "Admin"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:29
|
||||
#: admin/templatetags/admin_extras.py:108
|
||||
#: admin/templatetags/admin_extras.py:123
|
||||
msgid "Domains"
|
||||
msgstr "Domaines"
|
||||
|
||||
@@ -546,55 +589,55 @@ msgstr "Paramètres"
|
||||
msgid "Extensions"
|
||||
msgstr "Extensions"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:97
|
||||
#: admin/templatetags/admin_extras.py:103
|
||||
msgid "New"
|
||||
msgstr "Nouveau"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:101
|
||||
#: admin/templatetags/admin_extras.py:107
|
||||
msgid "Remove"
|
||||
msgstr "Supprimer"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:134
|
||||
#: admin/templatetags/admin_extras.py:149
|
||||
msgid "Add permission"
|
||||
msgstr "Ajouter une permission"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:138
|
||||
#: admin/templatetags/admin_extras.py:153
|
||||
msgid "Remove permissions"
|
||||
msgstr "Supprimer les permissions"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:151
|
||||
#: admin/templatetags/admin_extras.py:166
|
||||
msgid "Edit domain"
|
||||
msgstr "Editer le domaine"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:157
|
||||
#: admin/templatetags/admin_extras.py:172
|
||||
msgid "View aliases of this domain"
|
||||
msgstr "Voir les alias de ce domaine"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:167
|
||||
#: admin/templatetags/admin_extras.py:182
|
||||
msgid "Edit alias"
|
||||
msgstr "Editer cet alias"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:179
|
||||
#: admin/templatetags/admin_extras.py:194
|
||||
msgid "Edit mailbox"
|
||||
msgstr "Editer la boite aux lettres"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:185
|
||||
#: admin/templatetags/admin_extras.py:200
|
||||
msgid "View this mailbox aliases"
|
||||
msgstr "Voir les alias de cette boite"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:200
|
||||
#: admin/templatetags/admin_extras.py:215
|
||||
msgid "Edit mailbox alias"
|
||||
msgstr "Editer l'alias de boite"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:235
|
||||
#: admin/templatetags/admin_extras.py:250
|
||||
msgid "Yes"
|
||||
msgstr "Oui"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:235
|
||||
#: admin/templatetags/admin_extras.py:250
|
||||
msgid "No"
|
||||
msgstr "Non"
|
||||
|
||||
#: admin/templatetags/admin_extras.py:252 templates/common/genericform.html:6
|
||||
#: admin/templatetags/admin_extras.py:267 templates/common/genericform.html:6
|
||||
msgid "Help"
|
||||
msgstr "Aide"
|
||||
|
||||
@@ -620,6 +663,48 @@ msgstr ""
|
||||
"Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez "
|
||||
"réessayer."
|
||||
|
||||
#: demo/__init__.py:16
|
||||
msgid "Test messages"
|
||||
msgstr "Message de test"
|
||||
|
||||
#: demo/__init__.py:21
|
||||
msgid "Send virus"
|
||||
msgstr "Envoyer un virus"
|
||||
|
||||
#: demo/__init__.py:25
|
||||
msgid "Send spam"
|
||||
msgstr "Envoyer un spam"
|
||||
|
||||
#: demo/templates/demo/login_announcement.html:2
|
||||
msgid ""
|
||||
"\n"
|
||||
"<h1>Welcome to the online demo!</h1>\n"
|
||||
"<p><b>Warning:</b> the demo's concent is resetted every two hours.</p>\n"
|
||||
"<p>To try the demo, the following users are available (<i>username/password</"
|
||||
"i>): </p>\n"
|
||||
"<ul>\n"
|
||||
" <li>A super administrator : <b>admin/password</b></li>\n"
|
||||
" <li>A domain administrator : <b>admin@demo.local/admin</b></li>\n"
|
||||
" <li>A simple user : <b>user@demo.local/user</b></li>\n"
|
||||
"</ul>\n"
|
||||
"<p>Please report any issue of give any suggestion to \n"
|
||||
" <a href=\"https://groups.google.com/forum/#!forum/modoboa-users\">the "
|
||||
"mailing list</a>.</p>\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"<h1>Bienvenue sur la démo en ligne!</h1>\n"
|
||||
"<p><b>Attention:</b> Le contenu de la démo est réinitialisé toutes les deux heures.</p>\n"
|
||||
"<p>Pour essayer la démo, les utilisateurs suivants sont disponibles (<i>nom d'utilisateur/mot de passe</"
|
||||
"i>): </p>\n"
|
||||
"<ul>\n"
|
||||
" <li>Un super administrateur : <b>admin/password</b></li>\n"
|
||||
" <li>Un administrateur de domaine : <b>admin@demo.local/admin</b></li>\n"
|
||||
" <li>Un simple utilisateur : <b>user@demo.local/user</b></li>\n"
|
||||
"</ul>\n"
|
||||
"<p>Veuillez svp rapporter toute erreur sur \n"
|
||||
" <a href=\"https://groups.google.com/forum/#!forum/modoboa-users\">la "
|
||||
"liste de diffusion</a>.</p>\n"
|
||||
|
||||
#: extensions/amavis_quarantine/main.py:15
|
||||
msgid "Simple amavis quarantine management tool"
|
||||
msgstr "Outil simple de gestion de quarantaine amavis"
|
||||
@@ -670,12 +755,12 @@ msgstr "De"
|
||||
|
||||
#: extensions/amavis_quarantine/sql_listing.py:22
|
||||
#: extensions/sievefilters/forms.py:29 extensions/webmail/forms.py:8
|
||||
#: extensions/webmail/lib.py:521 templates/common/email_searchbar.html:7
|
||||
#: extensions/webmail/lib.py:525 templates/common/email_searchbar.html:7
|
||||
msgid "Subject"
|
||||
msgstr "Sujet"
|
||||
|
||||
#: extensions/amavis_quarantine/sql_listing.py:23
|
||||
#: extensions/webmail/lib.py:523
|
||||
#: extensions/webmail/lib.py:527
|
||||
msgid "Date"
|
||||
msgstr "Date"
|
||||
|
||||
@@ -980,7 +1065,7 @@ msgid "Match type"
|
||||
msgstr "Type de comparaison"
|
||||
|
||||
#: extensions/sievefilters/templates/sievefilters/filter.html:92
|
||||
#: templates/common/parameters.html:4
|
||||
#: templates/admin/parameters.html:14 templates/userprefs/preferences.html:18
|
||||
msgid "Save"
|
||||
msgstr "Sauvegarder"
|
||||
|
||||
@@ -1165,10 +1250,6 @@ msgstr "Démarrer"
|
||||
msgid "End"
|
||||
msgstr "Fin"
|
||||
|
||||
#: extensions/webmail/forms.py:14
|
||||
msgid "Select a file"
|
||||
msgstr "Sélectionner un fichier"
|
||||
|
||||
#: extensions/webmail/lib.py:33
|
||||
msgid "Server response"
|
||||
msgstr "Réponse du serveur"
|
||||
@@ -1181,11 +1262,11 @@ msgstr "La connexion au serveur IMAP a échoué, vérifiez votre configuration"
|
||||
msgid "Authentication failed, check your configuration"
|
||||
msgstr "L'authentification a échoué, vérifiez votre configuration"
|
||||
|
||||
#: extensions/webmail/lib.py:468
|
||||
#: extensions/webmail/lib.py:472
|
||||
msgid "wrote:"
|
||||
msgstr "a écrit :"
|
||||
|
||||
#: extensions/webmail/lib.py:535 extensions/webmail/lib.py:539
|
||||
#: extensions/webmail/lib.py:539 extensions/webmail/lib.py:543
|
||||
msgid "Original message"
|
||||
msgstr "Message original"
|
||||
|
||||
@@ -1442,7 +1523,7 @@ msgstr "Vider ce dossier"
|
||||
msgid "No entries to display"
|
||||
msgstr "Aucune entrée à afficher"
|
||||
|
||||
#: templates/nlayout.html:49
|
||||
#: templates/nlayout.html:50
|
||||
msgid "Logout"
|
||||
msgstr "Déconnexion"
|
||||
|
||||
@@ -1450,11 +1531,7 @@ msgstr "Déconnexion"
|
||||
msgid "Add"
|
||||
msgstr "Ajouter"
|
||||
|
||||
#: templates/admin/domains_header.html:44
|
||||
msgid "Remove this selection?"
|
||||
msgstr "Supprimer cette sélection ?"
|
||||
|
||||
#: templates/admin/domains_header.html:52
|
||||
#: templates/admin/domains_header.html:13
|
||||
msgid "for"
|
||||
msgstr "pour"
|
||||
|
||||
@@ -1462,6 +1539,10 @@ msgstr "pour"
|
||||
msgid "Apply"
|
||||
msgstr "Appliquer"
|
||||
|
||||
#: templates/admin/import.html:62
|
||||
msgid "Importing..."
|
||||
msgstr "Import en cours..."
|
||||
|
||||
#: templates/admin/listing.html:12
|
||||
msgid "Items"
|
||||
msgstr "Eléments"
|
||||
@@ -1510,7 +1591,7 @@ msgstr "Erreur"
|
||||
msgid "Messages"
|
||||
msgstr "Messages"
|
||||
|
||||
#: templates/common/parameters.html:16
|
||||
#: templates/common/parameters.html:15
|
||||
msgid "No parameters available"
|
||||
msgstr "Aucun paramètre disponible"
|
||||
|
||||
@@ -1544,23 +1625,27 @@ msgstr "Langage préféré"
|
||||
msgid "Prefered language to display pages"
|
||||
msgstr "Langage préféré pour afficher les pages"
|
||||
|
||||
#: userprefs/forms.py:12
|
||||
#: userprefs/forms.py:13
|
||||
msgid "Old password"
|
||||
msgstr "Ancien mot de passe"
|
||||
|
||||
#: userprefs/forms.py:14
|
||||
#: userprefs/forms.py:15
|
||||
msgid "New password"
|
||||
msgstr "Nouveau mot de passe"
|
||||
|
||||
#: userprefs/forms.py:30
|
||||
#: userprefs/forms.py:34
|
||||
msgid "Old password mismatchs"
|
||||
msgstr "L'ancien mot de passe est incorrect"
|
||||
|
||||
#: userprefs/forms.py:39
|
||||
#: userprefs/forms.py:43
|
||||
msgid "Destination(s)"
|
||||
msgstr "Destination(s)"
|
||||
|
||||
#: userprefs/forms.py:52
|
||||
#: userprefs/forms.py:44
|
||||
msgid "Keep local copies"
|
||||
msgstr "Conserver des copies locales"
|
||||
|
||||
#: userprefs/forms.py:57
|
||||
msgid ""
|
||||
"You can't define a forward to a local destination. Please ask your "
|
||||
"administrator to create an alias instead."
|
||||
@@ -1568,10 +1653,15 @@ msgstr ""
|
||||
"Vous ne pouvez pas définir un transfert vers une destination locale. "
|
||||
"Veuillez plutôt demander à votre administrateur de créer un alias"
|
||||
|
||||
#: userprefs/views.py:34
|
||||
#: userprefs/views.py:27
|
||||
msgid "Password change is disabled for this user"
|
||||
msgstr "Le changement de mot de passe est désactivé pour cet utilisateur"
|
||||
|
||||
#: userprefs/views.py:46
|
||||
msgid "Password changed"
|
||||
msgstr "Mot de passe changé"
|
||||
|
||||
#: userprefs/views.py:63
|
||||
#: userprefs/views.py:79
|
||||
msgid "Forward updated"
|
||||
msgstr "Transfert mis à jour"
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: modoboa-0.8.7\n"
|
||||
"Report-Msgid-Bugs-To: http://dev.modoboa.org/\n"
|
||||
"POT-Creation-Date: 2011-09-30 15:26+0200\n"
|
||||
"Project-Id-Version: modoboa-0.8.8\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-01-10 11:09+0100\n"
|
||||
"PO-Revision-Date: 2011-01-07 10:00+0100\n"
|
||||
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
|
||||
"Language-Team: FR <tonio@ngyn.org>\n"
|
||||
@@ -60,16 +60,16 @@ msgstr "Editer le dossier"
|
||||
msgid "Folder deleted"
|
||||
msgstr "Dossier supprimé"
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:94
|
||||
#: extensions/webmail/static/js/webmail.js:95
|
||||
msgid "Sending..."
|
||||
msgstr "Envoi..."
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:227
|
||||
#: extensions/webmail/static/js/webmail.js:251 static/js/anchor_nav.js:212
|
||||
#: extensions/webmail/static/js/webmail.js:229
|
||||
#: extensions/webmail/static/js/webmail.js:254 static/js/anchor_nav.js:215
|
||||
msgid "Done"
|
||||
msgstr "Effectué"
|
||||
|
||||
#: extensions/webmail/static/js/webmail.js:240
|
||||
#: extensions/webmail/static/js/webmail.js:243
|
||||
msgid "Waiting..."
|
||||
msgstr "En attente..."
|
||||
|
||||
@@ -77,10 +77,18 @@ msgstr "En attente..."
|
||||
msgid "Loading..."
|
||||
msgstr "Chargement..."
|
||||
|
||||
#: static/js/common.js:172
|
||||
#: static/js/common.js:17
|
||||
msgid "Message sent"
|
||||
msgstr "Message envoyé"
|
||||
|
||||
#: static/js/common.js:188
|
||||
msgid "Search..."
|
||||
msgstr "Chercher..."
|
||||
|
||||
#: static/js/domains.js:61
|
||||
msgid "Remove this selection?"
|
||||
msgstr "Supprimer cette sélection?"
|
||||
|
||||
#: static/js/preferences.js:14
|
||||
msgid "Preferences saved"
|
||||
msgstr "Préférences enregistrées"
|
||||
|
||||
@@ -88,6 +88,7 @@ MIDDLEWARE_CLASSES = (
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.locale.LocaleMiddleware',
|
||||
'modoboa.lib.middleware.AjaxLoginRedirect',
|
||||
'modoboa.lib.middleware.ExtControlMiddleware',
|
||||
'modoboa.extensions.webmail.middleware.WebmailErrorMiddleware',
|
||||
)
|
||||
|
||||
@@ -483,4 +483,10 @@ div.row label {
|
||||
|
||||
.element {
|
||||
margin: 10px 5px 10px 5px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Parameters or Preferences */
|
||||
#footer > #update {
|
||||
color: #000000;
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
@@ -227,6 +227,9 @@ var AnchorNavigation = new Class({
|
||||
new Request.JSON({
|
||||
url: query,
|
||||
noCache : true,
|
||||
onComplete: function() {
|
||||
ajax_login_redirect();
|
||||
},
|
||||
onSuccess: function(resp) {
|
||||
if (!this.options.spin_disabled) {
|
||||
var target = this.options.spin_target ? this.options.spin_target
|
||||
|
||||
+1
-1
@@ -234,4 +234,4 @@ saveparams = function(id, message) {
|
||||
}
|
||||
}).send();
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Collection of functions that are accessible to every page.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Simple function that redirect ajax requests to the login page if
|
||||
* the status code received with a response is equal to 278.
|
||||
*/
|
||||
function ajax_login_redirect() {
|
||||
if (this.status != 278) {
|
||||
return;
|
||||
}
|
||||
var params = "?next=" + window.location.pathname;
|
||||
|
||||
window.location.href =
|
||||
this.xhr.getResponseHeader("Location").replace(/\?.*$/, params);
|
||||
}
|
||||
|
||||
/*
|
||||
* Simple wrapper around Request.JSON. We just ensure that
|
||||
* redirections are correctly catched. (on session timeout for
|
||||
* example)
|
||||
*/
|
||||
Request.JSON.mdb = new Class({
|
||||
Extends: Request.JSON,
|
||||
|
||||
options: {
|
||||
onComplete: ajax_login_redirect
|
||||
}
|
||||
});
|
||||
@@ -13,7 +13,9 @@ domadminform_init = function() {
|
||||
{% url domains as doms_url %}
|
||||
new Request({
|
||||
url: "{% url domains %}" + domid + "/rawmboxes/?target=permissions",
|
||||
method: "get", onSuccess: function(data) {
|
||||
method: "get",
|
||||
onComplete: ajax_login_redirect,
|
||||
onSuccess: function(data) {
|
||||
$("id_user").set("html", data);
|
||||
$("id_user").options[0].setProperty("selected", "selected");
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@ function init_form() {
|
||||
new Autocompleter.Request.JSON("id_targets",
|
||||
"{% url admin.views.mailboxes_search %}", {
|
||||
postVar: "search",
|
||||
minLength: 3
|
||||
minLength: 3,
|
||||
onComplete: ajax_login_redirect
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{% extends "admin/settings_header.html" %}
|
||||
{% load i18n %}
|
||||
{% block menu %}
|
||||
{% load admin_extras %}
|
||||
{% settings_menu "parameters" user %}
|
||||
@@ -9,3 +10,6 @@
|
||||
{% include "common/parameters.html" %}
|
||||
</form>
|
||||
{% endblock %}
|
||||
{% block footer %}
|
||||
<input type="button" id="update" name="update" value="{% trans 'Save' %}" />
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
{% load i18n %}
|
||||
{% load admin_extras %}
|
||||
{% if gparams %}
|
||||
<p><input style="margin: 5px" type="submit" name="update" value="{% trans 'Save' %}" /></p>
|
||||
<div id="accordion">
|
||||
{% for app in gparams %}
|
||||
<h3 class="toggler atStart">{{ app.name }}</h3>
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
<script src="{{ MEDIA_URL }}js/mootools.js" type="text/javascript"></script>
|
||||
<script src="{{ MEDIA_URL }}js/mootools-more.js" type="text/javascript"></script>
|
||||
<script src="{{ MEDIA_URL }}js/SqueezeBox.js" type="text/javascript"></script>
|
||||
<script src="{{ MEDIA_URL }}js/utils.js" type="text/javascript"></script>
|
||||
{% url django.views.i18n.javascript_catalog as catalog_url %}
|
||||
<script type="text/javascript" src="{{ catalog_url }}"></script>
|
||||
{% block html_head %}{% endblock %}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
<script src="{{ MEDIA_URL }}js/SqueezeBox.js" type="text/javascript"></script>
|
||||
<script src="{{ MEDIA_URL }}js/infobox.js" type="text/javascript"></script>
|
||||
<script src="{{ MEDIA_URL }}js/common.js" type="text/javascript"></script>
|
||||
<script src="{{ MEDIA_URL }}js/utils.js" type="text/javascript"></script>
|
||||
{% url django.views.i18n.javascript_catalog as catalog_url %}
|
||||
<script type="text/javascript" src="{{ catalog_url }}"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -14,3 +14,6 @@
|
||||
{% include "common/parameters.html" %}
|
||||
</form>
|
||||
{% endblock %}
|
||||
{% block footer %}
|
||||
<input type="button" id="update" name="update" value="{% trans 'Save' %}" />
|
||||
{% endblock %}
|
||||
|
||||
@@ -4,6 +4,7 @@ from modoboa.auth.lib import _check_password
|
||||
from django.contrib.auth.models import check_password
|
||||
from django.utils.translation import ugettext as _, ugettext_noop
|
||||
from modoboa.lib.emailutils import split_mailbox
|
||||
from modoboa.lib import parameters
|
||||
|
||||
class BadDestination(Exception):
|
||||
pass
|
||||
@@ -21,6 +22,9 @@ class ChangePasswordForm(forms.Form):
|
||||
self.target = target
|
||||
|
||||
def clean_oldpassword(self):
|
||||
if parameters.get_admin("AUTHENTICATION_TYPE", app="admin") != "local":
|
||||
return self.cleaned_data["oldpassword"]
|
||||
|
||||
if not isinstance(self.target, Mailbox):
|
||||
func = check_password
|
||||
else:
|
||||
|
||||
+19
-13
@@ -8,9 +8,9 @@ from django.utils.translation import ugettext as _
|
||||
from modoboa.lib import parameters, events
|
||||
from modoboa.lib.webutils import _render, _render_error, ajax_response
|
||||
from forms import *
|
||||
from modoboa.admin.models import Mailbox, Alias
|
||||
from modoboa.admin.models import Mailbox, Alias, AdminError
|
||||
from modoboa.admin.lib import is_domain_admin
|
||||
from modoboa.auth.lib import encrypt, crypt_password
|
||||
from modoboa.auth.lib import encrypt
|
||||
|
||||
@login_required
|
||||
def index(request):
|
||||
@@ -31,13 +31,19 @@ def changepassword(request, tplname="userprefs/chpassword.html"):
|
||||
if request.method == "POST":
|
||||
form = ChangePasswordForm(target, request.POST)
|
||||
if form.is_valid():
|
||||
if request.user.id != 1:
|
||||
target.password = crypt_password(request.POST["confirmation"])
|
||||
if request.user.id != 1:
|
||||
try:
|
||||
target.set_password(form.cleaned_data["oldpassword"],
|
||||
form.cleaned_data["confirmation"])
|
||||
except AdminError, e:
|
||||
error = str(e)
|
||||
request.session["password"] = encrypt(request.POST["confirmation"])
|
||||
else:
|
||||
target.set_password(request.POST["confirmation"])
|
||||
request.session["password"] = encrypt(request.POST["confirmation"])
|
||||
target.save()
|
||||
return ajax_response(request, respmsg=_("Password changed"))
|
||||
target.save()
|
||||
|
||||
if error is None:
|
||||
return ajax_response(request, respmsg=_("Password changed"))
|
||||
return ajax_response(request, status="ko", template=tplname,
|
||||
form=form, error=error)
|
||||
|
||||
@@ -78,12 +84,12 @@ def setforward(request, tplname="userprefs/setforward.html"):
|
||||
form = ForwardForm()
|
||||
if al is not None:
|
||||
form.fields["dest"].initial = al.extmboxes
|
||||
try:
|
||||
selfmb = al.mboxes.get(pk=mb.id)
|
||||
except Mailbox.DoesNotExist:
|
||||
pass
|
||||
else:
|
||||
form.fields["keepcopies"].initial = True
|
||||
try:
|
||||
selfmb = al.mboxes.get(pk=mb.id)
|
||||
except Mailbox.DoesNotExist:
|
||||
pass
|
||||
else:
|
||||
form.fields["keepcopies"].initial = True
|
||||
return _render(request, tplname, {
|
||||
"form" : form
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user