This commit is contained in:
tonio
2012-01-11 10:38:32 +01:00
40 changed files with 1075 additions and 459 deletions
+1 -1
View File
@@ -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
+50 -2
View File
@@ -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
----------------------------------
+4
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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();
+5 -5
View File
@@ -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);
+2 -2
View File
@@ -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 %}
+3
View File
@@ -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():
+1 -1
View File
@@ -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) {
+11 -7
View File
@@ -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();
+111
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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?"
+20 -12
View File
@@ -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
View File
@@ -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 ""
+14 -6
View File
@@ -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
View File
@@ -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"
+17 -11
View File
@@ -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
View File
@@ -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"
+16 -8
View File
@@ -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"
+1
View File
@@ -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',
)
+7 -1
View File
@@ -483,4 +483,10 @@ div.row label {
.element {
margin: 10px 5px 10px 5px;
}
}
/* Parameters or Preferences */
#footer > #update {
color: #000000;
margin: 2px;
}
+3
View File
@@ -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
View File
@@ -234,4 +234,4 @@ saveparams = function(id, message) {
}
}).send();
});
};
};
+30
View File
@@ -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
}
});
+3 -1
View File
@@ -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");
}
+2 -1
View File
@@ -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
});
}
+4
View File
@@ -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
View File
@@ -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>
+1
View File
@@ -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 %}
+1
View File
@@ -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">
+3
View File
@@ -14,3 +14,6 @@
{% include "common/parameters.html" %}
</form>
{% endblock %}
{% block footer %}
<input type="button" id="update" name="update" value="{% trans 'Save' %}" />
{% endblock %}
+4
View File
@@ -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
View File
@@ -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
})