Merge branch 'master' into refactoring

This commit is contained in:
Antoine Nguyen
2013-09-28 13:53:11 +02:00
8 changed files with 218 additions and 319 deletions
+2 -2
View File
@@ -11,8 +11,8 @@ as an administration panel or a webmail.
Modoboa integrates with well known software such as `Postfix
<http://postfix.org/>`_ or `Dovecot <http://dovecot.org/>`_. A SQL
database (`MySQL <http://www.mysql.com>`_, `PostgreSQL
<http://www.postgresql.org/>`_) is used as a central point of
communication between all components.
<http://www.postgresql.org/>`_ or `SQLite <http://www.sqlite.org>`_)
is used as a central point of communication between all components.
Modoboa is developed with modularity in mind, expanding it is really
easy. Actually, all current features are extensions.
+30 -9
View File
@@ -161,6 +161,23 @@ PostgreSQL users
iterate_query = SELECT email AS username FROM admin_user
SQLite users
------------
::
driver = sqlite
connect = <path to the sqlite db file>
default_pass_scheme = CRYPT
password_query = SELECT email AS user, password FROM admin_user WHERE email='%u' and is_active=1
user_query = SELECT '<mailboxes storage directory>/%d/%n' AS home, <uid> as uid, <gid> as gid, ('*:bytes=' || mb.quota || 'M') AS quota_rule FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE mb.address='%n' AND dom.name='%d'
iterate_query = SELECT email AS username FROM admin_user
.. note::
Replace values between ``<>`` with yours.
@@ -228,6 +245,8 @@ Finally, edit the :file:`dovecot-dict-sql.conf.ext` file and put the
following content inside::
connect = host=<db host> dbname=<db name> user=<db user> password=<password>
# SQLite users
# connect = /path/to/the/database.db
map {
pattern = priv/quota/storage
@@ -404,7 +423,7 @@ be used by Postfix to lookup into Modoboa tables.
To automaticaly generate the requested map files and store them in a
directory, run the following command::
$ modoboa-admin.py postfix_maps --dbtype <mysql|postgres> mapfiles
$ modoboa-admin.py postfix_maps --dbtype <mysql|postgres|sqlite> mapfiles
:file:`mapfiles` is the directory where the files will be
stored. Answer the few questions and you're done.
@@ -427,22 +446,24 @@ Use the following configuration in the :file:`/etc/postfix/main.cf` file
virtual_mailbox_base = /var/vmail
relay_domains =
virtual_mailbox_domains = mysql:/etc/postfix/sql-domains.cf
virtual_alias_domains = mysql:/etc/postfix/sql-domain-aliases.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql-mailboxes.cf
virtual_alias_maps = mysql:/etc/postfix/sql-aliases.cf,
mysql:/etc/postfix/sql-domain-aliases-mailboxes.cf,
mysql:/etc/postfix/sql-email2email.cf,
mysql:/etc/postfix/sql-catchall-aliases.cf
virtual_mailbox_domains = <driver>:/etc/postfix/sql-domains.cf
virtual_alias_domains = <driver>:/etc/postfix/sql-domain-aliases.cf
virtual_mailbox_maps = <driver>:/etc/postfix/sql-mailboxes.cf
virtual_alias_maps = <driver>:/etc/postfix/sql-aliases.cf,
<driver>:/etc/postfix/sql-domain-aliases-mailboxes.cf,
<driver>:/etc/postfix/sql-email2email.cf,
<driver>:/etc/postfix/sql-catchall-aliases.cf
smtpd_recipient_restrictions =
...
check_recipient_access mysql:/etc/postfix/maps/sql-maintain.cf
check_recipient_access <driver>:/etc/postfix/maps/sql-maintain.cf
permit_mynetworks
...
# Stuff after
Replace ``<driver>`` by the name of the database you use.
Then, edit the :file:`/etc/postfix/master.cf` file and add the following
definition at the end::
+2 -2
View File
@@ -75,8 +75,8 @@ class DeployCommand(Command):
"""
print "Configuring database connection: %s" % name
info = {'conn_name': name,
'dbtype': raw_input('Database type (mysql or postgres): ')}
if info['dbtype'] not in ['mysql', 'postgres']:
'dbtype': raw_input('Database type (mysql, postgres or sqlite3): ')}
if info['dbtype'] not in ['mysql', 'postgres', 'sqlite3']:
info['dbtype'] = 'mysql'
if info['dbtype'] == 'postgres':
info['dbtype'] = 'postgresql_psycopg2'
+74 -37
View File
@@ -6,69 +6,111 @@ from django.template import Context, Template
from modoboa.core.management import Command
class MapFile(object):
category = 'std'
class MapFilesGenerator(object):
def __init__(self):
self.base_tpl = Template("""user = {{ dbuser }}
password = {{ dbpassword }}
self.template = Template("""user = {{ dbuser }}
password = {{ dbpass }}
dbname = {{ dbname }}
hosts = {{ dbhost }}
query = {{ query|safe }}
""")
self.tpl_context = {
'dbhost': raw_input('Database host: '),
'dbname': raw_input('Database name: '),
'dbuser': raw_input('Username: '),
'dbpass': getpass.getpass('Password: ')
}
if not self.tpl_context['dbhost']:
self.tpl_context['dbhost'] = '127.0.0.1'
def render(self, destdir, dbtype, **options):
def render(self, args):
"""Render all map files.
:param args: arguments received from the command line
"""
try:
options['query'] = getattr(self, dbtype)
except AttributeError:
return
os.mkdir(args.destdir)
except OSError:
pass
content = self.base_tpl.render(Context(options))
fp = open("%s/%s" % (destdir, self.filename), "w")
fp.write(content)
fp.close()
for v in globals().values():
if not inspect.isclass(v) or not issubclass(v, MapFile):
continue
if v is MapFile:
continue
if not v.category in args.categories:
continue
content = self.template.render(
Context(dict(self.tpl_context.items(),
query=getattr(v, args.dbtype)))
)
with open("%s/%s" % (args.destdir, v.filename), "w") as fp:
print >> fp, content
class SQLiteMapFilesGenerator(MapFilesGenerator):
def __init__(self):
self.template = Template("""dbpath = {{ dbpath }}
query = {{ query|safe }}
""")
self.tpl_context = {
'dbpath': raw_input('Database path: ')
}
class MapFile(object):
category = 'std'
class DomainsMap(MapFile):
filename = 'sql-domains.cf'
mysql = "SELECT name FROM admin_domain WHERE name='%s' AND enabled=1"
postgres = "SELECT name FROM admin_domain WHERE name='%s' AND enabled"
sqlite = "SELECT name FROM admin_domain WHERE name='%s' AND enabled=1"
class DomainsAliasesMap(MapFile):
filename = 'sql-domain-aliases.cf'
mysql = "SELECT dom.name FROM admin_domain dom INNER JOIN admin_domainalias domal ON dom.id=domal.target_id WHERE domal.name='%s' AND domal.enabled=1 AND dom.enabled=1"
postgres = "SELECT dom.name FROM admin_domain dom INNER JOIN admin_domainalias domal ON dom.id=domal.target_id WHERE domal.name='%s' AND domal.enabled AND dom.enabled"
sqlite = "SELECT dom.name FROM admin_domain dom INNER JOIN admin_domainalias domal ON dom.id=domal.target_id WHERE domal.name='%s' AND domal.enabled=1 AND dom.enabled=1"
class MailboxesMap(MapFile):
filename = 'sql-mailboxes.cf'
mysql = "SELECT 1 FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN admin_user user ON mb.user_id=user.id WHERE dom.enabled=1 AND dom.name='%d' AND user.is_active=1 AND mb.address='%u'"
postgres = "SELECT 1 FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN admin_user u ON mb.user_id=u.id WHERE dom.enabled AND dom.name='%d' AND u.is_active AND mb.address='%u'"
sqlite = "SELECT 1 FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN admin_user user ON mb.user_id=user.id WHERE dom.enabled=1 AND dom.name='%d' AND user.is_active=1 AND mb.address='%u'"
class AliasesMap(MapFile):
filename = 'sql-aliases.cf'
mysql = "(SELECT concat(mb.address, '@', dom.name) FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE mb.id IN (SELECT al_mb.mailbox_id FROM admin_alias_mboxes al_mb INNER JOIN admin_alias al ON al_mb.alias_id=al.id INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE dom.name='%d' AND dom.enabled=1 AND al.address='%u' AND al.enabled=1)) UNION (SELECT concat(al.address, '@', dom.name) FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE al.id IN (SELECT al_al.to_alias_id FROM admin_alias_aliases al_al INNER JOIN admin_alias al ON al_al.from_alias_id=al.id INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE dom.name='%d' AND dom.enabled=1 AND al.address='%u' AND al.enabled=1)) UNION (SELECT al.extmboxes FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE dom.name='%d' AND dom.enabled=1 AND al.address='%u' AND al.enabled=1 AND al.extmboxes<>'')"
postgres = "(SELECT mb.address || '@' || dom.name FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE mb.id IN (SELECT al_mb.mailbox_id FROM admin_alias_mboxes al_mb INNER JOIN admin_alias al ON al_mb.alias_id=al.id INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE dom.name='%d' AND dom.enabled AND al.address='%u' AND al.enabled)) UNION (SELECT al.address || '@' || dom.name FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE al.id IN (SELECT al_al.to_alias_id FROM admin_alias_aliases al_al INNER JOIN admin_alias al ON al_al.from_alias_id=al.id INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE dom.name='%d' AND dom.enabled AND al.address='%u' AND al.enabled)) UNION (SELECT al.extmboxes FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE dom.name='%d' AND dom.enabled AND al.address='%u' AND al.enabled AND al.extmboxes<>'')"
sqlite = "(SELECT (mb.address || '@' || dom.name) FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE mb.id IN (SELECT al_mb.mailbox_id FROM admin_alias_mboxes al_mb INNER JOIN admin_alias al ON al_mb.alias_id=al.id INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE dom.name='%d' AND dom.enabled=1 AND al.address='%u' AND al.enabled=1)) UNION (SELECT (al.address || '@' || dom.name) FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE al.id IN (SELECT al_al.to_alias_id FROM admin_alias_aliases al_al INNER JOIN admin_alias al ON al_al.from_alias_id=al.id INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE dom.name='%d' AND dom.enabled=1 AND al.address='%u' AND al.enabled=1)) UNION (SELECT al.extmboxes FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE dom.name='%d' AND dom.enabled=1 AND al.address='%u' AND al.enabled=1 AND al.extmboxes<>'')"
class DomainAliasesMailboxesMap(MapFile):
filename = 'sql-domain-aliases-mailboxes.cf'
mysql = "(SELECT concat(mb.address, '@', dom.name) FROM admin_domainalias domal INNER JOIN admin_domain dom ON domal.target_id=dom.id INNER JOIN admin_mailbox mb ON mb.domain_id=dom.id WHERE domal.name='%d' AND dom.enabled=1 AND mb.address='%u') UNION (SELECT concat(al.address, '@', dom.name) FROM admin_domainalias domal INNER JOIN admin_domain dom ON domal.target_id=dom.id INNER JOIN admin_alias al ON al.domain_id=dom.id WHERE domal.name='%d' AND dom.enabled=1 AND al.address='%u')"
postgres = "(SELECT mb.address || '@' || dom.name FROM admin_domainalias domal INNER JOIN admin_domain dom ON domal.target_id=dom.id INNER JOIN admin_mailbox mb ON mb.domain_id=dom.id WHERE domal.name='%d' AND dom.enabled AND mb.address='%u') UNION (SELECT al.address || '@' || dom.name FROM admin_domainalias domal INNER JOIN admin_domain dom ON domal.target_id=dom.id INNER JOIN admin_alias al ON al.domain_id=dom.id WHERE domal.name='%d' AND dom.enabled AND al.address='%u')"
sqlite = "(SELECT mb.address || '@' || dom.name FROM admin_domainalias domal INNER JOIN admin_domain dom ON domal.target_id=dom.id INNER JOIN admin_mailbox mb ON mb.domain_id=dom.id WHERE domal.name='%d' AND dom.enabled=1 AND mb.address='%u') UNION (SELECT al.address || '@' || dom.name FROM admin_domainalias domal INNER JOIN admin_domain dom ON domal.target_id=dom.id INNER JOIN admin_alias al ON al.domain_id=dom.id WHERE domal.name='%d' AND dom.enabled=1 AND al.address='%u')"
class CatchallAliasesMap(MapFile):
filename = 'sql-catchall-aliases.cf'
mysql = "(SELECT concat(mb.address, '@', dom.name) FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE mb.id IN (SELECT al_mb.mailbox_id FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id INNER JOIN admin_alias_mboxes al_mb ON al.id=al_mb.alias_id WHERE al.enabled=1 AND al.address='*' AND dom.name='%d' AND dom.enabled=1)) UNION (SELECT al.extmboxes FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE al.enabled='1' AND al.extmboxes<>'' AND al.address='*' AND dom.name='%d' AND dom.enabled=1)"
postgres = "(SELECT mb.address || '@' || dom.name FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE mb.id IN (SELECT al_mb.mailbox_id FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id INNER JOIN admin_alias_mboxes al_mb ON al.id=al_mb.alias_id WHERE al.enabled AND al.address='*' AND dom.name='%d' AND dom.enabled)) UNION (SELECT al.extmboxes FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE al.enabled AND al.extmboxes<>'' AND al.address='*' AND dom.name='%d' AND dom.enabled)"
sqlite = "(SELECT (mb.address || '@' || dom.name) FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE mb.id IN (SELECT al_mb.mailbox_id FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id INNER JOIN admin_alias_mboxes al_mb ON al.id=al_mb.alias_id WHERE al.enabled=1 AND al.address='*' AND dom.name='%d' AND dom.enabled=1)) UNION (SELECT al.extmboxes FROM admin_alias al INNER JOIN admin_domain dom ON al.domain_id=dom.id WHERE al.enabled='1' AND al.extmboxes<>'' AND al.address='*' AND dom.name='%d' AND dom.enabled=1)"
class MaintainMap(MapFile):
filename = 'sql-maintain.cf'
mysql = "SELECT '450 Requested mail action not taken: mailbox unavailable' FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN admin_mailboxoperation mbop ON mbop.mailbox_id=mb.id WHERE dom.name='%d' AND mb.address='%u' LIMIT 1"
postgres = "SELECT '450 Requested mail action not taken: mailbox unavailable' FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN admin_mailboxoperation mbop ON mbop.mailbox_id=mb.id WHERE dom.name='%d' AND mb.address='%u' LIMIT 1"
sqlite = "SELECT '450 Requested mail action not taken: mailbox unavailable' FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN admin_mailboxoperation mbop ON mbop.mailbox_id=mb.id WHERE dom.name='%d' AND mb.address='%u' LIMIT 1"
class TransportMap(MapFile):
@@ -76,6 +118,7 @@ class TransportMap(MapFile):
filename = 'sql-transport.cf'
mysql = "SELECT method FROM postfix_autoreply_transport WHERE domain='%s'"
postgres = "SELECT method FROM postfix_autoreply_transport WHERE domain='%s'"
sqlite = "SELECT method FROM postfix_autoreply_transport WHERE domain='%s'"
class AutoRepliesMap(MapFile):
@@ -83,6 +126,7 @@ class AutoRepliesMap(MapFile):
filename = 'sql-autoreplies.cf'
mysql = "SELECT full_address, autoreply_address FROM postfix_autoreply_alias WHERE full_address='%s'"
postgres = "SELECT full_address, autoreply_address FROM postfix_autoreply_alias WHERE full_address='%s'"
sqlite = "SELECT full_address, autoreply_address FROM postfix_autoreply_alias WHERE full_address='%s'"
class PostfixMapsCommand(Command):
@@ -90,30 +134,23 @@ class PostfixMapsCommand(Command):
def __init__(self, *args, **kwargs):
super(PostfixMapsCommand, self).__init__(*args, **kwargs)
self._parser.add_argument('destdir', type=str,
help='Directory that will contain generated map files')
self._parser.add_argument('--dbtype', type=str, choices=['mysql', 'postgres'], default='mysql',
help='Used database type')
self._parser.add_argument('--dbhost', type=str, default='127.0.0.1',
help='Database host address')
self._parser.add_argument('--categories', type=str, nargs='*', default=['std'],
help='Map file categories to generate (choices: std, autoreply)')
self._parser.add_argument(
'destdir', type=str,
help='Directory that will contain generated map files'
)
self._parser.add_argument(
'--dbtype', type=str, choices=['mysql', 'postgres', 'sqlite'],
default='mysql',
help='Used database type'
)
self._parser.add_argument(
'--categories', type=str, nargs='*', default=['std'],
help='Map file categories to generate (choices: std, autoreply)'
)
def handle(self, parsed_args):
dbname = raw_input('Database name: ')
dbuser = raw_input('Username: ')
dbpass = getpass.getpass('Password: ')
try:
os.mkdir(parsed_args.destdir)
except OSError:
pass
for k, v in globals().iteritems():
if not inspect.isclass(v) or not issubclass(v, MapFile):
continue
if not v.category in parsed_args.categories:
continue
v().render(parsed_args.destdir, parsed_args.dbtype,
dbname=dbname, dbuser=dbuser, dbpassword=dbpass,
dbhost=parsed_args.dbhost)
if parsed_args.dbtype == 'sqlite':
g = SQLiteMapFilesGenerator()
else:
g = MapFilesGenerator()
g.render(parsed_args)
+5 -17
View File
@@ -41,7 +41,8 @@ def getattachment(request):
mbox = request.GET.get("mbox", None)
mailid = request.GET.get("mailid", None)
pnum = request.GET.get("partnumber", None)
if not mbox or not mailid or not pnum:
fname = request.GET.get("fname", None)
if not mbox or not mailid or not pnum or not fname:
raise WebmailError(_("Invalid request"))
imapc = get_imapconnector(request)
@@ -49,22 +50,9 @@ def getattachment(request):
resp = HttpResponse(decode_payload(partdef["encoding"], payload))
resp["Content-Type"] = partdef["Content-Type"]
resp["Content-Transfer-Encoding"] = partdef["encoding"]
if partdef["disposition"] != 'NIL':
disp = partdef["disposition"]
# FIXME : ugly hack, see fetch_parser.py for more explanation
# :p
if type(disp[1][0]) != dict:
atype, fieldname, filename = disp[0], disp[1][0], disp[1][1]
else:
atype, fieldname, filename = disp[0], disp[1][0]['struct'][0], disp[1][0]['struct'][1]
if fieldname.endswith('*'):
cd = '%s; %s=%s' % (atype, fieldname, filename)
else:
cd = '%s; %s="%s"' % (atype, fieldname, filename)
else:
cd = build_header(request.GET["fname"])
resp["Content-Disposition"] = cd
resp["Content-Length"] = partdef["size"]
resp["Content-Disposition"] = build_header(fname)
if int(partdef["size"]) < 200:
resp["Content-Length"] = partdef["size"]
return resp
+40 -62
View File
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-09-20 22:30+0200\n"
"PO-Revision-Date: 2013-06-28 17:03+0200\n"
"Last-Translator: Giancarlo Gaifas <lallo@artiemestieri.tn.it>\n"
"POT-Creation-Date: 2013-09-26 23:42+0200\n"
"PO-Revision-Date: 2013-09-27 00:07+0200\n"
"Last-Translator: Alberto Berti <alberto@metapensiero.it>\n"
"Language-Team: ITALIANO <LL@li.org>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
@@ -252,7 +252,7 @@ msgstr ""
#: admin/app_settings.py:213
msgid "Key must be either 16, 24, or 32 bytes long"
msgstr ""
msgstr "La chiave può essere lunga solo 16, 24 o 32 bytes"
#: admin/app_settings.py:222
msgid "Invalid syntax"
@@ -520,12 +520,12 @@ msgstr "Non puoi importare un account con un ruolo superiore al tuo"
#: admin/models.py:506
#, python-format
msgid "The simple user '%s' must have a valid email address"
msgstr ""
msgstr "L'utente '%s' deve avere un indirizzo email valido"
#: admin/models.py:510
#, python-format
msgid "username and email fields must not differ for '%s'"
msgstr ""
msgstr "I campi nome utente e email di '%s' devono avere lo stesso valore"
#: admin/models.py:534
#, python-format
@@ -685,7 +685,7 @@ msgstr "Nuovo dominio"
#: admin/views.py:89 admin/views.py:98 admin/views.py:228 admin/views.py:444
#: admin/views.py:451 extensions/sievefilters/views.py:129
#: extensions/sievefilters/views.py:198 extensions/webmail/views.py:136
#: extensions/sievefilters/views.py:198 extensions/webmail/views.py:128
msgid "Create"
msgstr "Crea"
@@ -707,7 +707,7 @@ msgstr "Dominio creato"
#: admin/views.py:146 admin/views.py:285 admin/views.py:498
#: extensions/postfix_autoreply/templates/postfix_autoreply/autoreply.html:9
#: extensions/sievefilters/views.py:148 extensions/webmail/views.py:168
#: extensions/sievefilters/views.py:148 extensions/webmail/views.py:160
#: userprefs/templates/userprefs/forward.html:8
#: userprefs/templates/userprefs/profile.html:8
msgid "Update"
@@ -770,11 +770,11 @@ msgstr "Alias modificato"
#: admin/views.py:402 admin/views.py:545 admin/views.py:550
#: extensions/amavis/views.py:204 extensions/amavis/views.py:210
#: extensions/amavis/views.py:243 extensions/amavis/views.py:247
#: extensions/amavis/views.py:249 extensions/webmail/views.py:41
#: extensions/webmail/views.py:68 extensions/webmail/views.py:81
#: extensions/webmail/views.py:98 extensions/webmail/views.py:114
#: extensions/webmail/views.py:200 extensions/webmail/views.py:427
#: extensions/webmail/views.py:438 extensions/webmail/views.py:465
#: extensions/amavis/views.py:249 extensions/webmail/views.py:42
#: extensions/webmail/views.py:60 extensions/webmail/views.py:73
#: extensions/webmail/views.py:90 extensions/webmail/views.py:106
#: extensions/webmail/views.py:192 extensions/webmail/views.py:419
#: extensions/webmail/views.py:430 extensions/webmail/views.py:457
#: lib/formutils.py:32 lib/formutils.py:37
msgid "Invalid request"
msgstr "Richiesta non valida"
@@ -1007,7 +1007,7 @@ msgid "Previously on Modoboa..."
msgstr "Precedentemente su Modoboa ..."
#: admin/templates/admin/logs.html:6 extensions/amavis/sql_listing.py:25
#: extensions/webmail/lib.py:38 extensions/webmail/lib.py:411
#: extensions/webmail/lib.py:38 extensions/webmail/lib.py:413
msgid "Date"
msgstr "Data"
@@ -1067,11 +1067,11 @@ msgstr "Impostazioni Modoboa"
#: admin/templatetags/admin_extras.py:13
msgid "enabled_m"
msgstr ""
msgstr "Abilitato"
#: admin/templatetags/admin_extras.py:13
msgid "enabled_f"
msgstr ""
msgstr "Abilitata"
#: admin/templatetags/admin_extras.py:36
msgid "Modoboa"
@@ -1112,9 +1112,9 @@ msgstr "Visualizza le identita del dominio"
#: admin/templatetags/admin_extras.py:178
#: admin/templatetags/admin_extras.py:194
#: admin/templatetags/admin_extras.py:201
#, fuzzy, python-format
#, python-format
msgid "Delete %s?"
msgstr "Elimina"
msgstr "Eliminare %s?"
#: admin/templatetags/admin_extras.py:223
msgid "Remove this permission"
@@ -1382,7 +1382,7 @@ msgstr "Da"
#: extensions/amavis/sql_listing.py:24 extensions/sievefilters/forms.py:68
#: extensions/webmail/forms.py:10 extensions/webmail/lib.py:36
#: extensions/webmail/lib.py:409 templates/common/email_searchbar.html:6
#: extensions/webmail/lib.py:411 templates/common/email_searchbar.html:6
msgid "Subject"
msgstr "Oggetto"
@@ -2217,88 +2217,87 @@ msgid "Cci"
msgstr "Cci"
#: extensions/webmail/imaputils.py:237
#, fuzzy
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Recupero delle impostazioni di filtro fallito"
msgstr "Impossibile recuperare il delimitatore delle gerarchie"
#: extensions/webmail/imaputils.py:278
#, python-format
msgid "Connection to IMAP server failed: %s"
msgstr "Connessione al server IMAP fallita: %s"
#: extensions/webmail/lib.py:358
#: extensions/webmail/lib.py:360
msgid "wrote:"
msgstr "scritto:"
#: extensions/webmail/lib.py:423 extensions/webmail/lib.py:427
#: extensions/webmail/lib.py:425 extensions/webmail/lib.py:429
msgid "Original message"
msgstr "Messaggio originale"
#: extensions/webmail/views.py:86
#: extensions/webmail/views.py:78
#, python-format
msgid "%(count)d message deleted"
msgid_plural "%(count)d messages deleted"
msgstr[0] "%(count)d messaggio cancellato"
msgstr[1] "%(count)d messaggi cancellati"
#: extensions/webmail/views.py:103
#: extensions/webmail/views.py:95
msgid "Unknown action"
msgstr "Azione sconosciuta"
#: extensions/webmail/views.py:116 lib/email_listing.py:137
#: extensions/webmail/views.py:108 lib/email_listing.py:137
msgid "Empty mailbox"
msgstr "Casella di posta vuota"
#: extensions/webmail/views.py:133
#: extensions/webmail/views.py:125
#: extensions/webmail/templatetags/webextras.py:170
msgid "Create a new mailbox"
msgstr "Crea una nuova casella di posta"
#: extensions/webmail/views.py:149
#: extensions/webmail/views.py:141
msgid "Mailbox created"
msgstr "Casella di posta creata"
#: extensions/webmail/views.py:165
#: extensions/webmail/views.py:157
msgid "Edit mailbox"
msgstr "Modifica casella di posta"
#: extensions/webmail/views.py:180
#: extensions/webmail/views.py:172
msgid "Mailbox updated"
msgstr "Casella di posta aggiornata"
#: extensions/webmail/views.py:214 extensions/webmail/views.py:396
#: extensions/webmail/views.py:505
#: extensions/webmail/views.py:206 extensions/webmail/views.py:388
#: extensions/webmail/views.py:497
msgid "Bad request"
msgstr "Richiesta sbagliata"
#: extensions/webmail/views.py:246
#: extensions/webmail/views.py:238
msgid "Failed to save attachment: "
msgstr "Salvataggio allegato fallito: "
#: extensions/webmail/views.py:249
#: extensions/webmail/views.py:241
#, python-format
msgid "Attachment is too big (limit: %s)"
msgstr "L'allegato è troppo grande (limite: %s)"
#: extensions/webmail/views.py:255
#: extensions/webmail/views.py:247
#: extensions/webmail/templates/webmail/compose.html:15
#: extensions/webmail/templates/webmail/headers.html:4
msgid "Attachments"
msgstr "Allegati"
#: extensions/webmail/views.py:271
#: extensions/webmail/views.py:263
msgid "Bad query"
msgstr "Domanda sbagliata"
#: extensions/webmail/views.py:281
#: extensions/webmail/views.py:273
msgid "Failed to remove attachment: "
msgstr "Rimozione allegato fallita: "
#: extensions/webmail/views.py:286
#: extensions/webmail/views.py:278
msgid "Unknown attachment"
msgstr "Allegato sconosciuto"
#: extensions/webmail/views.py:501
#: extensions/webmail/views.py:493
msgid "Undefined action"
msgstr "Azione non definita"
@@ -2455,11 +2454,11 @@ msgstr "È intervenuto un errore interno"
#: templates/nlayout.html:62
msgid "Powered by Modoboa"
msgstr ""
msgstr "Powered by Modoboa"
#: templates/common/email_searchbar.html:5
msgid "From address"
msgstr "Indirizzo from"
msgstr "Mittente"
#: templates/common/email_searchbar.html:10
msgid "Both"
@@ -2598,24 +2597,3 @@ msgstr "Aggiorna le informazioni personali"
#: userprefs/templatetags/uprefs_extras.py:57
msgid "Logout"
msgstr "Esci"
#~ msgid "Failed to rename mailbox: %s"
#~ msgstr "Impossibile rinominare la casella di posta: %s"
#~ msgid "Failed to remove mailbox: %s"
#~ msgstr "Impossibile rimuovere la casella di posta: %s"
#~ msgid "Delete the domain"
#~ msgstr "Cancella il dominio"
#~ msgid "Delete this account"
#~ msgstr "Cancella questo account"
#~ msgid "Delete this distribution list"
#~ msgstr "Cancella l'elenco di smistamento"
#~ msgid "Delete this forward"
#~ msgstr "Cancella questo inoltro"
#~ msgid "Delete this alias"
#~ msgstr "Cancella questo alias"
+11 -29
View File
@@ -6,9 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: http://dev.modoboa.org\n"
"POT-Creation-Date: 2013-06-28 16:37+0200\n"
"PO-Revision-Date: 2013-06-28 16:58+0200\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-09-26 23:44+0200\n"
"PO-Revision-Date: 2013-09-27 00:07+0200\n"
"Last-Translator: Giancarlo Gaifas <lallo@artiemestieri.tn.it>\n"
"Language-Team: Italiano <LL@li.org>\n"
"Language: it\n"
@@ -33,11 +33,9 @@ msgstr "Questa operazione eliminerà TUTTI i dati associati a questo dominio."
msgid ""
"This operation will remove all data associated to this domain, excepting "
"accounts."
msgstr "Questa operazione eliminerà tutti i dati associati a questo dominio tranne gli account"
#: admin/static/admin/js/admin.js:117
msgid "Delete this domain?"
msgstr "Elimino questo dominio?"
msgstr ""
"Questa operazione eliminerà tutti i dati associati a questo dominio tranne "
"gli account"
#: admin/static/admin/js/admin.js:161
msgid "No domain administrator defined"
@@ -47,22 +45,6 @@ msgstr "Non è stato definito un amministratore di dominio"
msgid "Do not delete mailbox directory"
msgstr "Non eliminare la cartella della casella posta"
#: admin/static/admin/js/admin.js:243
msgid "Delete this account?"
msgstr "Eliminare questo account"
#: admin/static/admin/js/admin.js:249
msgid "Delete this list?"
msgstr "Eliminare questo elenco?"
#: admin/static/admin/js/admin.js:254
msgid "Delete this forward?"
msgstr "Eliminare questo inoltro?"
#: admin/static/admin/js/admin.js:259
msgid "Delete this alias?"
msgstr "Eliminare questo alias?"
#: extensions/amavis/static/amavis/js/quarantine.js:126
msgid "Release this selection?"
msgstr "Rilasciare questa selezione?"
@@ -114,11 +96,11 @@ msgstr "attivo"
msgid "Search a domain"
msgstr "Cerca un dominio"
#: extensions/webmail/static/webmail/js/webmail.js:475
#: extensions/webmail/static/webmail/js/webmail.js:476
msgid "Remove the selected mailbox?"
msgstr "Rimuovere la casella di posta selezionata?"
#: extensions/webmail/static/webmail/js/webmail.js:489
#: extensions/webmail/static/webmail/js/webmail.js:490
msgid "Mailbox removed"
msgstr "Casella di posta rimossa"
@@ -144,15 +126,15 @@ msgid_plural "Moving %s messages"
msgstr[0] "Spostato %s messaggio"
msgstr[1] "Spostati %s messaggi"
#: static/js/confirmation.js:48
#: static/js/confirmation.js:50
msgid "Warning"
msgstr "Attenzione"
#: static/js/confirmation.js:57
#: static/js/confirmation.js:59
msgid "Cancel"
msgstr "Elimina"
#: static/js/confirmation.js:99 static/js/history.js:239
#: static/js/confirmation.js:101 static/js/history.js:235
msgid "Internal Error"
msgstr "Errore interno"
+54 -161
View File
@@ -1,22 +1,22 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# ogg1980 <olle@dalnix.se>, 2013
# ogg1980 <olle@dalnix.se>, 2013
msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
"Report-Msgid-Bugs-To: http://dev.modoboa.org/\n"
"POT-Creation-Date: 2013-09-20 22:30+0200\n"
"PO-Revision-Date: 2013-06-01 14:36+0000\n"
"Last-Translator: Antoine Nguyen <tonio@ngyn.org>\n"
"Language-Team: Swedish (http://www.transifex.com/projects/p/modoboa/language/"
"sv/)\n"
"Language: sv\n"
"PO-Revision-Date: 2013-09-27 08:19+0000\n"
"Last-Translator: ogg1980 <olle@dalnix.se>\n"
"Language-Team: Swedish (http://www.transifex.com/projects/p/modoboa/language/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin/__init__.py:9
@@ -122,9 +122,7 @@ msgstr "Bind DN"
msgid ""
"The distinguished name to use when binding to the LDAP server. Leave empty "
"for an anonymous bind"
msgstr ""
"Det unika namnet för att använda vid bindningar till LDAP-servern. Lämna "
"tomt för en anonym bindning"
msgstr "Det unika namnet för att använda vid bindningar till LDAP-servern. Lämna tomt för en anonym bindning"
#: admin/app_settings.py:97
msgid "Bind password"
@@ -132,8 +130,7 @@ msgstr "Bind lösenord"
#: admin/app_settings.py:99
msgid "The password to use when binding to the LDAP server (with 'Bind DN')"
msgstr ""
"Lösenordet ska användas vid bindning till LDAP-servern (med \"Bind DN ')"
msgstr "Lösenordet ska användas vid bindning till LDAP-servern (med \"Bind DN ')"
#: admin/app_settings.py:105
msgid "Search base"
@@ -151,9 +148,7 @@ msgstr "Sökfilter"
msgid ""
"An optional filter string (e.g. '(objectClass=person)'). In order to be "
"valid, it must be enclosed in parentheses."
msgstr ""
"En valfri filtersträng (t.ex. \"(objectClass = personer) '). För att vara "
"giltigt måste det omges av parenteser."
msgstr "En valfri filtersträng (t.ex. \"(objectClass = personer) '). För att vara giltigt måste det omges av parenteser."
#: admin/app_settings.py:119
msgid "User DN template"
@@ -164,9 +159,7 @@ msgstr "Anvädar DN mall"
msgid ""
"The template used to construct a user's DN. It should contain one "
"placeholder (ie. %(user)s)"
msgstr ""
"Mallen som används för att konstruera en användares DN. Den bör innehålla en "
"platshållare (dvs. %(user)s)"
msgstr "Mallen som används för att konstruera en användares DN. Den bör innehålla en platshållare (dvs. %(user)s)"
#: admin/app_settings.py:126
msgid "Password attribute"
@@ -199,9 +192,7 @@ msgstr "Hantera brevlådor på filsystem"
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
msgstr ""
"Byt namn på eller ta bort brevlådor på filsystemet när de kommer byta namn "
"eller tas bort inom Modoboa"
msgstr "Byt namn på eller ta bort brevlådor på filsystemet när de kommer byta namn eller tas bort inom Modoboa"
#: admin/app_settings.py:146
msgid "Mailboxes ower"
@@ -249,12 +240,11 @@ msgstr "Standard omdirigering när ingen applikation angetts"
#: admin/app_settings.py:213
msgid "Key must be either 16, 24, or 32 bytes long"
msgstr ""
msgstr "Nyckel måste vara endera 16, 24 eller 32 bytes lång"
#: admin/app_settings.py:222
#, fuzzy
msgid "Invalid syntax"
msgstr "Ogiltig rad"
msgstr "Ogiltig syntax"
#: admin/app_settings.py:245
msgid "This field is required"
@@ -268,9 +258,7 @@ msgstr "Alias"
msgid ""
"Alias(es) of this domain. Indicate only one name per input, press ENTER to "
"add a new input."
msgstr ""
"Alias för denna domän. Ange endast ett namn per rad, tryck ENTER för att "
"lägga till en rad."
msgstr "Alias för denna domän. Ange endast ett namn per rad, tryck ENTER för att lägga till en rad."
#: admin/forms.py:59
msgid "An alias with this name already exists"
@@ -301,9 +289,7 @@ msgstr "Namn"
msgid ""
"The administrator's name. Don't include the domain's name here, it will be "
"automatically appended."
msgstr ""
"Administratörens namn. Inkludera inte domänens namn här, den kommer att "
"läggas till automatiskt."
msgstr "Administratörens namn. Inkludera inte domänens namn här, den kommer att läggas till automatiskt."
#: admin/forms.py:160
msgid "Create aliases"
@@ -330,9 +316,7 @@ msgstr "E-post adress"
msgid ""
"The distribution list address. Use the '*' character to create a 'catchall' "
"address (ex: *@domain.tld)."
msgstr ""
"Distributionslistans adress. Använd '*' för att skapa en 'catchall' adress "
"(ex: *@domain.tld)."
msgstr "Distributionslistans adress. Använd '*' för att skapa en 'catchall' adress (ex: *@domain.tld)."
#: admin/forms.py:239
msgid "Recipients"
@@ -342,9 +326,7 @@ msgstr "Mottagare"
msgid ""
"Mailbox(es) this alias will point to. Indicate only one address per input, "
"press ENTER to add a new input."
msgstr ""
"Brevlåda/or detta alias kommer att peka på. Ange endast en adress per "
"inlägg, tryck ENTER för att lägga till en ny inlägg."
msgstr "Brevlåda/or detta alias kommer att peka på. Ange endast en adress per inlägg, tryck ENTER för att lägga till en ny inlägg."
#: admin/forms.py:278 admin/forms.py:542 admin/forms.py:568
msgid "Domain does not exist"
@@ -454,20 +436,14 @@ msgid ""
"Quota in MB for this mailbox. Define a custom value or use domain's default "
"one. Leave empty to define an unlimited value (not allowed for domain "
"administrators)."
msgstr ""
"Kvot i MB för denna brevlåda. Definiera ett anpassat värde eller använda "
"domänens förvalda. Lämna tomt för att definiera ett obegränsat värde (ej "
"tillåtet för domänadministratörer)."
msgstr "Kvot i MB för denna brevlåda. Definiera ett anpassat värde eller använda domänens förvalda. Lämna tomt för att definiera ett obegränsat värde (ej tillåtet för domänadministratörer)."
#: admin/forms.py:499
msgid ""
"Alias(es) of this mailbox. Indicate only one address per input, press ENTER "
"to add a new input. Use the '*' character to create a 'catchall' alias (ex: "
"*@domain.tld)."
msgstr ""
"Alias för denna brevlåda. Ange endast en adress per rad, tryck ENTER för att "
"lägga till ny rad. Använd '*' för att skapa ett 'catchall' alias (ex: "
"*@domain.tld)."
msgstr "Alias för denna brevlåda. Ange endast en adress per rad, tryck ENTER för att lägga till ny rad. Använd '*' för att skapa ett 'catchall' alias (ex: *@domain.tld)."
#: admin/forms.py:550
#, python-format
@@ -518,12 +494,12 @@ msgstr "Du kan inte importera konto med en roll större än din"
#: admin/models.py:506
#, python-format
msgid "The simple user '%s' must have a valid email address"
msgstr ""
msgstr "Den enkla användaren '%s' måste ha en gällande e-postadress"
#: admin/models.py:510
#, python-format
msgid "username and email fields must not differ for '%s'"
msgstr ""
msgstr "användarnamn och e-post fält får inte avvika för '%s'"
#: admin/models.py:534
#, python-format
@@ -596,11 +572,9 @@ msgstr "En kvota krävs"
#: admin/models.py:1032
msgid ""
"The alias address (without the domain part). For a 'catch-all' address, just "
"enter an * character."
msgstr ""
"Alias adress (utan domän delen). För en \"catch-all\"-adress, ange bara "
"asterisk *."
"The alias address (without the domain part). For a 'catch-all' address, just"
" enter an * character."
msgstr "Alias adress (utan domän delen). För en \"catch-all\"-adress, ange bara asterisk *."
#: admin/models.py:1036
msgid "mailboxes"
@@ -632,9 +606,9 @@ msgid "Invalid line: %s"
msgstr "Ogiltig rad: %s"
#: admin/models.py:1175
#, fuzzy, python-format
#, python-format
msgid "Domain '%s' does not exist"
msgstr "Domän existerar inte"
msgstr "Domänen '%s' existerar inte"
#: admin/models.py:1218
msgid "Check to enable this extension"
@@ -817,29 +791,15 @@ msgstr "%d objekt importerade"
msgid ""
"Provide a CSV file where lines respect one of the following formats:\n"
"<ul>\n"
"<li><em>account; loginname; password; first name; last name; enabled; group; "
"address[, domain, ...]</em></li>\n"
"<li><em>account; loginname; password; first name; last name; enabled; group; address[, domain, ...]</em></li>\n"
"<li><em>alias; address; enabled; internal recipient</em></li>\n"
"<li><em>forward; address; enabled; external recipient</em></li>\n"
"<li><em>dlist; address; enabled; recipient; recipient; ...</em></li>\n"
"</ul>\n"
"<p>The first element of each line is mandatory and must be equal to one of "
"the previous values.</p>\n"
"<p>The first element of each line is mandatory and must be equal to one of the previous values.</p>\n"
"\n"
"<p>You can use a different character as separator.</p>\n"
msgstr ""
"Tillhandahåll en CSV-fil där raderna har följande format:⏎\n"
"<ul>⏎\n"
"<li><em>account; loginname; password; first name; last name; enabled; group; "
"address[, domain, ...]</em></li>⏎\n"
"<li><em>alias; address; enabled; internal recipient</em></li>⏎\n"
"<li><em>forward; address; enabled; external recipient</em></li>⏎\n"
"<li><em>dlist; address; enabled; recipient; recipient; ...</em></li>⏎\n"
"</ul>⏎\n"
"<p>Det första elementet i varje rad är obligatorisk och måste vara lika med "
"en av de tidigare värdena.</p>⏎\n"
"⏎\n"
"<p>Du kan använda ett annat tecken separator.</p>⏎\n"
msgstr "Tillhandahåll en CSV-fil där raderna har följande format:⏎\n<ul>⏎\n<li><em>account; loginname; password; first name; last name; enabled; group; address[, domain, ...]</em></li>⏎\n<li><em>alias; address; enabled; internal recipient</em></li>⏎\n<li><em>forward; address; enabled; external recipient</em></li>⏎\n<li><em>dlist; address; enabled; recipient; recipient; ...</em></li>⏎\n</ul>⏎\n<p>Det första elementet i varje rad är obligatorisk och måste vara lika med en av de tidigare värdena.</p>⏎\n⏎\n<p>Du kan använda ett annat tecken separator.</p>⏎\n"
#: admin/views.py:775
msgid "Import identities"
@@ -866,18 +826,9 @@ msgid ""
" <li><em>domain; name; quota; enabled</em></li>\n"
" <li><em>domainalias; name; targeted domain; enabled</em></li>\n"
"</ul>\n"
"<p>The first element of each line is mandatory and must be equal to one of "
"the previous values.</p>\n"
"<p>The first element of each line is mandatory and must be equal to one of the previous values.</p>\n"
"<p>You can use a different character as separator.</p>\n"
msgstr ""
"Tillhandahåll en CSV fil där raderna har följande format:\n"
"<ul>\n"
"<li><em>domän, namn, kvot, aktiverade</ em></ li>\n"
"<li><em>domainalias, namn, riktad domän, aktiverade</ em></ li>\n"
"</ ul>\n"
"<p>det första elementet i varje rad är obligatoriskt och måste vara lika med "
"en av de tidigare värdena.</ p>\n"
"<p>Du kan använda ett annat tecken som separator.</ p>\n"
msgstr "Tillhandahåll en CSV fil där raderna har följande format:\n<ul>\n<li><em>domän, namn, kvot, aktiverade</ em></ li>\n<li><em>domainalias, namn, riktad domän, aktiverade</ em></ li>\n</ ul>\n<p>det första elementet i varje rad är obligatoriskt och måste vara lika med en av de tidigare värdena.</ p>\n<p>Du kan använda ett annat tecken som separator.</ p>\n"
#: admin/views.py:845
msgid "Import domains"
@@ -1108,9 +1059,9 @@ msgstr "Visa domänens konton"
#: admin/templatetags/admin_extras.py:178
#: admin/templatetags/admin_extras.py:194
#: admin/templatetags/admin_extras.py:201
#, fuzzy, python-format
#, python-format
msgid "Delete %s?"
msgstr "Radera"
msgstr "Radera %s?"
#: admin/templatetags/admin_extras.py:223
msgid "Remove this permission"
@@ -1159,30 +1110,15 @@ msgid ""
"\n"
"<h3>Welcome to the online demo!</h3>\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"
"<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 or give any suggestion to \n"
" <a href=\"https://groups.google.com/forum/#!forum/modoboa-users\">the "
"mailing list</a>.</p>\n"
msgstr ""
"\n"
"<h3>Välkommen till online-demot!</h3>\n"
"<p><b>Varning:</b> demots innehåll återställs varannan timme</p>\n"
"<p>För att prova demot, följande användare finns tillgängliga "
"(<i>användarnamn/lösenord</i>): </p>\n"
"<ul>\n"
"<li>En super administratör: <b>admin/password</b></li>\n"
"<li>En domän administratölr: <b>admin@demo.local/admin</b></li>\n"
"<li>En enkel användare: <b>user@demo.local/user</b></li>\n"
"</ul>\n"
"<p>Var vänlig rapportera eventuella fel eller ge förslag på <a href="
"\"https://groups.google.com/forum/#!forum/modoboa-users\">mailinglistan</a>."
"</p>\n"
" <a href=\"https://groups.google.com/forum/#!forum/modoboa-users\">the mailing list</a>.</p>\n"
msgstr "\n<h3>Välkommen till online-demot!</h3>\n<p><b>Varning:</b> demots innehåll återställs varannan timme</p>\n<p>För att prova demot, följande användare finns tillgängliga (<i>användarnamn/lösenord</i>): </p>\n<ul>\n<li>En super administratör: <b>admin/password</b></li>\n<li>En domän administratölr: <b>admin@demo.local/admin</b></li>\n<li>En enkel användare: <b>user@demo.local/user</b></li>\n</ul>\n<p>Var vänlig rapportera eventuella fel eller ge förslag på <a href=\"https://groups.google.com/forum/#!forum/modoboa-users\">mailinglistan</a>.</p>\n"
#: extensions/amavis/__init__.py:22
msgid "Simple amavis management frontend"
@@ -1333,9 +1269,7 @@ msgstr "standard"
#: extensions/amavis/models.py:98
msgid "Bypass virus checks or not. Choose 'default' to use global settings."
msgstr ""
"Kringgå virus kontroller eller ej. Välj \"standard\" för att använda globala "
"inställningar."
msgstr "Kringgå virus kontroller eller ej. Välj \"standard\" för att använda globala inställningar."
#: extensions/amavis/models.py:101
msgid "Spam filter"
@@ -1343,9 +1277,7 @@ msgstr "Skräp filter"
#: extensions/amavis/models.py:106
msgid "Bypass spam checks or not. Choose 'default' to use global settings."
msgstr ""
"Kringgå skräp filter eller ej. Välj 'standard' för att använda globala "
"inställningar."
msgstr "Kringgå skräp filter eller ej. Välj 'standard' för att använda globala inställningar."
#: extensions/amavis/models.py:109
msgid "Banned filter"
@@ -1353,9 +1285,7 @@ msgstr "Förbjudna filter"
#: extensions/amavis/models.py:114
msgid "Bypass banned checks or not. Choose 'default' to use global settings."
msgstr ""
"Kringgå förbjudna filter eller inte. Välj 'standard' för att använda globala "
"inställningar."
msgstr "Kringgå förbjudna filter eller inte. Välj 'standard' för att använda globala inställningar."
#: extensions/amavis/models.py:144
msgid "Spam marker"
@@ -1363,11 +1293,9 @@ msgstr "Skräp markering"
#: extensions/amavis/models.py:146
msgid ""
"Modify spam subject using the specified text. Choose 'default' to use global "
"settings."
msgstr ""
"Ändra skräppost ämnesrad med vald text. Välj 'standard' för att använd "
"globala inställningar."
"Modify spam subject using the specified text. Choose 'default' to use global"
" settings."
msgstr "Ändra skräppost ämnesrad med vald text. Välj 'standard' för att använd globala inställningar."
#: extensions/amavis/sql_listing.py:23 extensions/webmail/lib.py:37
msgid "From"
@@ -1450,12 +1378,8 @@ msgid ""
msgid_plural ""
"\n"
"%(counter)s release requests are pending for action.\n"
msgstr[0] ""
"\n"
"%(counter)s frisläpps förfrågning väntar på åtgärd.\n"
msgstr[1] ""
"\n"
"%(counter)s frisläpps förfrågningar väntar på åtgärd.'\n"
msgstr[0] "\n%(counter)s frisläpps förfrågning väntar på åtgärd.\n"
msgstr[1] "\n%(counter)s frisläpps förfrågningar väntar på åtgärd.'\n"
#: extensions/amavis/templates/amavis/notifications/pending_requests.html:6
msgid "Sketch:"
@@ -1530,8 +1454,7 @@ msgstr "Dålig MIME"
#: extensions/limits/__init__.py:23
msgid ""
"Per administrator resources to limit the number of objects they can create"
msgstr ""
"Per administratör resurser för att begränsa antalet objekt som de kan skapa"
msgstr "Per administratör resurser för att begränsa antalet objekt som de kan skapa"
#: extensions/limits/__init__.py:54
msgid "Limits"
@@ -1555,7 +1478,8 @@ msgid "Domain admins"
msgstr "Domänadministratörer"
#: extensions/limits/app_settings.py:15
msgid "Maximum number of allowed domain administrators for a new administrator"
msgid ""
"Maximum number of allowed domain administrators for a new administrator"
msgstr "Maximalt antal domänadministratörer den här användaren kan skapa"
#: extensions/limits/app_settings.py:21
@@ -1804,9 +1728,7 @@ msgstr "Omdirigera meddelande till"
#: extensions/sievefilters/lib.py:37
msgid "Connection to MANAGESIEVE server failed, check your configuration"
msgstr ""
"Anslutning till MANAGESIEVE servern misslyckades, kontrollera din "
"konfiguration"
msgstr "Anslutning till MANAGESIEVE servern misslyckades, kontrollera din konfiguration"
#: extensions/sievefilters/lib.py:82
msgid "Not enough space on server"
@@ -1885,9 +1807,7 @@ msgstr "aktivera"
#: extensions/sievefilters/templates/sievefilters/index.html:74
msgid ""
"No filters set defined yet. You must create one in order to define filters."
msgstr ""
"Inga filter uppsättningar definierade. Du måste skapa en uppsättning för att "
"kunna definiera filter."
msgstr "Inga filter uppsättningar definierade. Du måste skapa en uppsättning för att kunna definiera filter."
#: extensions/sievefilters/templatetags/sfilters_tags.py:16
msgid "New filters set"
@@ -2200,9 +2120,8 @@ msgid "Cci"
msgstr "BCC"
#: extensions/webmail/imaputils.py:237
#, fuzzy
msgid "Failed to retrieve hierarchy delimiter"
msgstr "Det gick inte att hämta filteruppsättning"
msgstr "Det gick inte att hämta hierarki avgränsare"
#: extensions/webmail/imaputils.py:278
#, python-format
@@ -2221,8 +2140,8 @@ msgstr "Orginalmeddelande"
#, python-format
msgid "%(count)d message deleted"
msgid_plural "%(count)d messages deleted"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%(count)d meddelande raderat"
msgstr[1] "%(count)d meddelanden raderade"
#: extensions/webmail/views.py:103
msgid "Unknown action"
@@ -2530,9 +2449,7 @@ msgstr "Vidarebefordra meddelande och spara kopia i din lokala brevlåda"
msgid ""
"You can't define a forward to a local destination. Please ask your "
"administrator to create an alias instead."
msgstr ""
"Du kan inte definiera en vidarebefordring till en lokal destination. Be din "
"administratör att skapa ett alias istället."
msgstr "Du kan inte definiera en vidarebefordring till en lokal destination. Be din administratör att skapa ett alias istället."
#: userprefs/views.py:32
msgid "You need a mailbox in order to define a forward"
@@ -2580,27 +2497,3 @@ msgstr "Uppdatera personlig information"
#: userprefs/templatetags/uprefs_extras.py:57
msgid "Logout"
msgstr "Logga ut"
#~ msgid "Failed to rename mailbox: %s"
#~ msgstr "Kunde byta namn på brevlåda: %s"
#~ msgid "Failed to remove mailbox: %s"
#~ msgstr "Kunde inte radera brevlåda: %s"
#~ msgid "Mailbox %s does not exist"
#~ msgstr "Brevlådan %s finns inte"
#~ msgid "Delete the domain"
#~ msgstr "Radera domänen"
#~ msgid "Delete this account"
#~ msgstr "Radera detta konto"
#~ msgid "Delete this distribution list"
#~ msgstr "Radera denna distributionslista"
#~ msgid "Delete this forward"
#~ msgstr "Radera denna vidarebefodring"
#~ msgid "Delete this alias"
#~ msgstr "Radera detta alia"