Merge pull request #75 from kaiyou/feat-babel

Implement babel translation for I18N
master
kaiyou 8 years ago committed by GitHub
commit fe8e25485d

@ -10,5 +10,6 @@ COPY requirements.txt .
COPY start.sh /start.sh COPY start.sh /start.sh
RUN pip install -r requirements.txt RUN pip install -r requirements.txt
RUN pybabel compile -d freeposte/translations
CMD ["/start.sh"] CMD ["/start.sh"]

@ -0,0 +1,3 @@
[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_

@ -4,6 +4,7 @@ import flask_bootstrap
import flask_login import flask_login
import flask_script import flask_script
import flask_migrate import flask_migrate
import flask_babel
import os import os
import docker import docker
@ -23,7 +24,9 @@ default_config = {
'DEBUG': False, 'DEBUG': False,
'BOOTSTRAP_SERVE_LOCAL': True, 'BOOTSTRAP_SERVE_LOCAL': True,
'DKIM_PATH': '/dkim/{domain}.{selector}.key', 'DKIM_PATH': '/dkim/{domain}.{selector}.key',
'DKIM_SELECTOR': 'dkim' 'DKIM_SELECTOR': 'dkim',
'BABEL_DEFAULT_LOCALE': 'en',
'BABEL_DEFAULT_TIMEZONE': 'UTC'
} }
# Load configuration from the environment if available # Load configuration from the environment if available
@ -36,6 +39,7 @@ db = flask_sqlalchemy.SQLAlchemy(app)
migrate = flask_migrate.Migrate(app, db) migrate = flask_migrate.Migrate(app, db)
login_manager = flask_login.LoginManager() login_manager = flask_login.LoginManager()
login_manager.init_app(app) login_manager.init_app(app)
babel = flask_babel.Babel(app)
# Manager commnad # Manager commnad
manager = flask_script.Manager(app) manager = flask_script.Manager(app)

@ -1,5 +1,6 @@
from wtforms import validators, fields, widgets from wtforms import validators, fields, widgets
from wtforms_components import fields as fields_ from wtforms_components import fields as fields_
from flask_babel import lazy_gettext as _
import flask_login import flask_login
import flask_wtf import flask_wtf
@ -28,92 +29,93 @@ class DestinationField(fields.SelectMultipleField):
def pre_validate(self, form): def pre_validate(self, form):
for item in self.data: for item in self.data:
if not self.validator.match(item): if not self.validator.match(item):
raise validators.ValidationError("Invalid email address.") raise validators.ValidationError(_('Invalid email address.'))
class Confirmation(flask_wtf.FlaskForm): class ConfirmationForm(flask_wtf.FlaskForm):
submit = fields.SubmitField('Confirm') submit = fields.SubmitField(_('Confirm'))
class LoginForm(flask_wtf.FlaskForm): class LoginForm(flask_wtf.FlaskForm):
email = fields.StringField('E-mail', [validators.Email()]) email = fields.StringField(_('E-mail'), [validators.Email()])
pw = fields.PasswordField('Password', [validators.DataRequired()]) pw = fields.PasswordField(_('Password'), [validators.DataRequired()])
submit = fields.SubmitField('Sign in') submit = fields.SubmitField(_('Sign in'))
class DomainForm(flask_wtf.FlaskForm): class DomainForm(flask_wtf.FlaskForm):
name = fields.StringField('Domain name', [validators.DataRequired()]) name = fields.StringField(_('Domain name'), [validators.DataRequired()])
max_users = fields_.IntegerField('Maximum user count', default=10) max_users = fields_.IntegerField(_('Maximum user count'), default=10)
max_aliases = fields_.IntegerField('Maximum alias count', default=10) max_aliases = fields_.IntegerField(_('Maximum alias count'), default=10)
comment = fields.StringField('Comment') comment = fields.StringField(_('Comment'))
submit = fields.SubmitField('Create') submit = fields.SubmitField(_('Create'))
class UserForm(flask_wtf.FlaskForm): class UserForm(flask_wtf.FlaskForm):
localpart = fields.StringField('E-mail', [validators.DataRequired()]) localpart = fields.StringField(_('E-mail'), [validators.DataRequired()])
pw = fields.PasswordField('Password', [validators.DataRequired()]) pw = fields.PasswordField(_('Password'), [validators.DataRequired()])
pw2 = fields.PasswordField('Confirm password', [validators.EqualTo('pw')]) pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
quota_bytes = fields_.IntegerSliderField('Quota', default=1000000000) quota_bytes = fields_.IntegerSliderField(_('Quota'), default=1000000000)
enable_imap = fields.BooleanField('Allow IMAP access', default=True) enable_imap = fields.BooleanField(_('Allow IMAP access'), default=True)
enable_pop = fields.BooleanField('Allow POP3 access', default=True) enable_pop = fields.BooleanField(_('Allow POP3 access'), default=True)
comment = fields.StringField('Comment') comment = fields.StringField(_('Comment'))
submit = fields.SubmitField('Save') submit = fields.SubmitField(_('Save'))
class UserSettingsForm(flask_wtf.FlaskForm): class UserSettingsForm(flask_wtf.FlaskForm):
displayed_name = fields.StringField('Displayed name') displayed_name = fields.StringField(_('Displayed name'))
spam_enabled = fields.BooleanField('Enable spam filter') spam_enabled = fields.BooleanField(_('Enable spam filter'))
spam_threshold = fields_.IntegerSliderField('Spam filter threshold') spam_threshold = fields_.IntegerSliderField(_('Spam filter threshold'))
submit = fields.SubmitField('Save settings') submit = fields.SubmitField(_('Save settings'))
class UserPasswordForm(flask_wtf.FlaskForm): class UserPasswordForm(flask_wtf.FlaskForm):
pw = fields.PasswordField('Password', [validators.DataRequired()]) pw = fields.PasswordField(_('Password'), [validators.DataRequired()])
pw2 = fields.PasswordField('Password check', [validators.DataRequired()]) pw2 = fields.PasswordField(_('Password check'), [validators.DataRequired()])
submit = fields.SubmitField('Update password') submit = fields.SubmitField(_('Update password'))
class UserForwardForm(flask_wtf.FlaskForm): class UserForwardForm(flask_wtf.FlaskForm):
forward_enabled = fields.BooleanField('Enable forwarding') forward_enabled = fields.BooleanField(_('Enable forwarding'))
forward_destination = fields.StringField( forward_destination = fields.StringField(
'Destination', [validators.Optional(), validators.Email()] _('Destination'), [validators.Optional(), validators.Email()]
) )
submit = fields.SubmitField('Update') submit = fields.SubmitField(_('Update'))
class UserReplyForm(flask_wtf.FlaskForm): class UserReplyForm(flask_wtf.FlaskForm):
reply_enabled = fields.BooleanField('Enable automatic reply') reply_enabled = fields.BooleanField(_('Enable automatic reply'))
reply_subject = fields.StringField('Reply subject') reply_subject = fields.StringField(_('Reply subject'))
reply_body = fields.StringField('Reply body', widget=widgets.TextArea()) reply_body = fields.StringField(_('Reply body'),
submit = fields.SubmitField('Update') widget=widgets.TextArea())
submit = fields.SubmitField(_('Update'))
class AliasForm(flask_wtf.FlaskForm): class AliasForm(flask_wtf.FlaskForm):
localpart = fields.StringField('Alias', [validators.DataRequired()]) localpart = fields.StringField(_('Alias'), [validators.DataRequired()])
wildcard = fields.BooleanField( wildcard = fields.BooleanField(
'Use SQL Like Syntax (e.g. for catch-all aliases, admin-%@domain.com)') _('Use SQL LIKE Syntax (e.g. for catch-all aliases)'))
destination = DestinationField('Destination') destination = DestinationField(_('Destination'))
comment = fields.StringField('Comment') comment = fields.StringField(_('Comment'))
submit = fields.SubmitField('Create') submit = fields.SubmitField(_('Create'))
class AdminForm(flask_wtf.FlaskForm): class AdminForm(flask_wtf.FlaskForm):
admin = fields.SelectField('Admin email', choices=[]) admin = fields.SelectField(_('Admin email'), choices=[])
submit = fields.SubmitField('Submit') submit = fields.SubmitField(_('Submit'))
class ManagerForm(flask_wtf.FlaskForm): class ManagerForm(flask_wtf.FlaskForm):
manager = fields.SelectField('Manager email') manager = fields.SelectField(_('Manager email'))
submit = fields.SubmitField('Submit') submit = fields.SubmitField(_('Submit'))
class FetchForm(flask_wtf.FlaskForm): class FetchForm(flask_wtf.FlaskForm):
protocol = fields.SelectField('Protocol', choices=[ protocol = fields.SelectField(_('Protocol'), choices=[
('imap', 'IMAP'), ('pop3', 'POP3') ('imap', 'IMAP'), ('pop3', 'POP3')
]) ])
host = fields.StringField('Hostname or IP') host = fields.StringField(_('Hostname or IP'))
port = fields.IntegerField('TCP port') port = fields.IntegerField(_('TCP port'))
tls = fields.BooleanField('Enable TLS') tls = fields.BooleanField(_('Enable TLS'))
username = fields.StringField('Username') username = fields.StringField(_('Username'))
password = fields.StringField('Password') password = fields.StringField(_('Password'))
submit = fields.SubmitField('Submit') submit = fields.SubmitField(_('Submit'))

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Add a global administrator {% trans %}Add a global administrator{% endtrans %}
{% endblock %} {% endblock %}
{% block box_content %} {% block box_content %}

@ -1,24 +1,26 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Global administrators {% trans %}Global administrators{% endtrans %}
{% endblock %} {% endblock %}
{% block main_action %} {% block main_action %}
<a class="btn btn-primary" href="{{ url_for('.admin_create') }}">Add administrator</a> <a class="btn btn-primary" href="{{ url_for('.admin_create') }}">
{% trans %}Add administrator{% endtrans %}
</a>
{% endblock %} {% endblock %}
{% block box %} {% block box %}
<table class="table table-bordered"> <table class="table table-bordered">
<tbody> <tbody>
<tr> <tr>
<th>Actions</th> <th>{% trans %}Actions{% endtrans %}</th>
<th>Email</th> <th>{% trans %}Email{% endtrans %}</th>
</tr> </tr>
{% for admin in admins %} {% for admin in admins %}
<tr> <tr>
<td> <td>
<a href="{{ url_for('.admin_delete', admin=admin.email) }}" title="Delete"><i class="fa fa-trash"></i></a> <a href="{{ url_for('.admin_delete', admin=admin.email) }}" title="{% trans %}Delete{% endtrans %}"><i class="fa fa-trash"></i></a>
</td> </td>
<td>{{ admin }}</td> <td>{{ admin }}</td>
</tr> </tr>

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Create alias {% trans %}Create alias{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}

@ -1,7 +1,7 @@
{% extends "alias/create.html" %} {% extends "alias/create.html" %}
{% block title %} {% block title %}
Edit alias {% trans %}Edit alias{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Alias list {% trans %}Alias list{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}
@ -9,25 +9,25 @@ Alias list
{% endblock %} {% endblock %}
{% block main_action %} {% block main_action %}
<a class="btn btn-primary" href="{{ url_for('.alias_create', domain_name=domain.name) }}">Add alias</a> <a class="btn btn-primary" href="{{ url_for('.alias_create', domain_name=domain.name) }}">{% trans %}Add alias{% endtrans %}</a>
{% endblock %} {% endblock %}
{% block box %} {% block box %}
<table class="table table-bordered"> <table class="table table-bordered">
<tbody> <tbody>
<tr> <tr>
<th>Actions</th> <th>{% trans %}Actions{% endtrans %}</th>
<th>Email</th> <th>{% trans %}Email{% endtrans %}</th>
<th>Destination</th> <th>{% trans %}Destination{% endtrans %}</th>
<th>Comment</th> <th>{% trans %}Comment{% endtrans %}</th>
<th>Created</th> <th>{% trans %}Created{% endtrans %}</th>
<th>Last edit</th> <th>{% trans %}Last edit{% endtrans %}</th>
</tr> </tr>
{% for alias in domain.aliases %} {% for alias in domain.aliases %}
<tr> <tr>
<td> <td>
<a href="{{ url_for('.alias_edit', alias=alias.email) }}" title="Edit"><i class="fa fa-pencil"></i></a>&nbsp; <a href="{{ url_for('.alias_edit', alias=alias.email) }}" title="{% trans %}Edit{% endtrans %}"><i class="fa fa-pencil"></i></a>&nbsp;
<a href="{{ url_for('.alias_delete', alias=alias.email) }}" title="Delete"><i class="fa fa-trash"></i></a> <a href="{{ url_for('.alias_delete', alias=alias.email) }}" title="{% trans %}Delete{% endtrans %}"><i class="fa fa-trash"></i></a>
</td> </td>
<td>{{ alias }}</td> <td>{{ alias }}</td>
<td>{{ alias.destination|join(', ') or '-' }}</td> <td>{{ alias.destination|join(', ') or '-' }}</td>

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Confirm action {% trans %}Confirm action{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}
@ -9,6 +9,6 @@ Confirm action
{% endblock %} {% endblock %}
{% block box_content %} {% block box_content %}
<p>You are about to {{ action }}. Please confirm your action.</p> <p>{% trans action %}You are about to {{ action }}. Please confirm your action.{% endtrans %}</p>
{{ macros.form(form) }} {{ macros.form(form) }}
{% endblock %} {% endblock %}

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
New domain {% trans %}New domain{% endtrans %}
{% endblock %} {% endblock %}
{% block box_content %} {% block box_content %}

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Domain details {% trans %}Domain details{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}
@ -10,7 +10,7 @@ Domain details
{% block main_action %} {% block main_action %}
{% if current_user.global_admin %} {% if current_user.global_admin %}
<a class="btn btn-primary" href="{{ url_for(".domain_genkeys", domain_name=domain.name) }}">Regenerate keys</a> <a class="btn btn-primary" href="{{ url_for(".domain_genkeys", domain_name=domain.name) }}">{% trans %}Regenerate keys{% endtrans %}</a>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
@ -18,30 +18,30 @@ Domain details
<table class="table table-bordered"> <table class="table table-bordered">
<tbody> <tbody>
<tr> <tr>
<th>Domain name</th> <th>{% trans %}Domain name{% endtrans %}</th>
<td>{{ domain.name }}</td> <td>{{ domain.name }}</td>
</tr> </tr>
<tr> <tr>
<th>DNS MX entry</th> <th>{% trans %}DNS MX entry{% endtrans %}</th>
<td><pre>{{ domain.name }}. 600 IN MX 10 {{ config["HOSTNAME"] }}.</pre></td> <td><pre>{{ domain.name }}. 600 IN MX 10 {{ config["HOSTNAME"] }}.</pre></td>
</tr> </tr>
<tr> <tr>
<th>DNS SPF entries</th> <th>{% trans %}DNS SPF entries{% endtrans %}</th>
<td><pre> <td><pre>
{{ domain.name }}. 600 IN TXT "v=spf1 mx a:{{ config["HOSTNAME"] }} -all" {{ domain.name }}. 600 IN TXT "v=spf1 mx a:{{ config["HOSTNAME"] }} -all"
{{ domain.name }}. 600 IN SPF "v=spf1 mx a:{{ config["HOSTNAME"] }} -all"</pre></td> {{ domain.name }}. 600 IN SPF "v=spf1 mx a:{{ config["HOSTNAME"] }} -all"</pre></td>
</tr> </tr>
{% if domain.dkim_publickey %} {% if domain.dkim_publickey %}
<tr> <tr>
<th>DKIM public key</th> <th>{% trans %}DKIM public key{% endtrans %}</th>
<td><pre style="white-space: pre-wrap; word-wrap: break-word;">{{ domain.dkim_publickey }}</pre></td> <td><pre style="white-space: pre-wrap; word-wrap: break-word;">{{ domain.dkim_publickey }}</pre></td>
</tr> </tr>
<tr> <tr>
<th>DNS DKIM entry</th> <th>{% trans %}DNS DKIM entry{% endtrans %}</th>
<td><pre style="white-space: pre-wrap; word-wrap: break-word;">{{ config["DKIM_SELECTOR"] }}._domainkey.{{ domain.name }}. IN 600 TXT "v=DKIM1; k=rsa; p={{ domain.dkim_publickey }}"</pre></td> <td><pre style="white-space: pre-wrap; word-wrap: break-word;">{{ config["DKIM_SELECTOR"] }}._domainkey.{{ domain.name }}. IN 600 TXT "v=DKIM1; k=rsa; p={{ domain.dkim_publickey }}"</pre></td>
</tr> </tr>
<tr> <tr>
<th>DNS DMARC entry</th> <th>{% trans %}DNS DMARC entry{% endtrans %}</th>
<td><pre>_dmarc.{{ domain.name }}. 600 IN TXT "v=DMARC1; p=reject; rua=mailto:{{ config["POSTMASTER"] }}@{{ config["DOMAIN"] }}; adkim=s; aspf=s"</pre></td> <td><pre>_dmarc.{{ domain.name }}. 600 IN TXT "v=DMARC1; p=reject; rua=mailto:{{ config["POSTMASTER"] }}@{{ config["DOMAIN"] }}; adkim=s; aspf=s"</pre></td>
</tr> </tr>
{% endif %} {% endif %}

@ -1,7 +1,7 @@
{% extends "domain/create.html" %} {% extends "domain/create.html" %}
{% block title %} {% block title %}
Edit domain {% trans %}Edit domain{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}

@ -1,12 +1,12 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Domain list {% trans %}Domain list{% endtrans %}
{% endblock %} {% endblock %}
{% block main_action %} {% block main_action %}
{% if current_user.global_admin %} {% if current_user.global_admin %}
<a class="btn btn-primary" href="{{ url_for('.domain_create') }}">New domain</a> <a class="btn btn-primary" href="{{ url_for('.domain_create') }}">{% trans %}New domain{% endtrans %}</a>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
@ -14,28 +14,28 @@ Domain list
<table class="table table-bordered"> <table class="table table-bordered">
<tbody> <tbody>
<tr> <tr>
<th>Actions</th> <th>{% trans %}Actions{% endtrans %}</th>
<th>Manage</th> <th>{% trans %}Manage{% endtrans %}</th>
<th>Domain name</th> <th>{% trans %}Domain name{% endtrans %}</th>
<th>Mailbox count</th> <th>{% trans %}Mailbox count{% endtrans %}</th>
<th>Alias count</th> <th>{% trans %}Alias count{% endtrans %}</th>
<th>Comment</th> <th>{% trans %}Comment{% endtrans %}</th>
<th>Created</th> <th>{% trans %}Created{% endtrans %}</th>
<th>Last edit</th> <th>{% trans %}Last edit{% endtrans %}</th>
</tr> </tr>
{% for domain in current_user.get_managed_domains() %} {% for domain in current_user.get_managed_domains() %}
<tr> <tr>
<td> <td>
<a href="{{ url_for('.domain_details', domain_name=domain.name) }}" title="Details"><i class="fa fa-list"></i></a>&nbsp; <a href="{{ url_for('.domain_details', domain_name=domain.name) }}" title="{% trans %}Details{% endtrans %}"><i class="fa fa-list"></i></a>&nbsp;
{% if current_user.global_admin %} {% if current_user.global_admin %}
<a href="{{ url_for('.domain_edit', domain_name=domain.name) }}" title="Edit"><i class="fa fa-pencil"></i></a>&nbsp; <a href="{{ url_for('.domain_edit', domain_name=domain.name) }}" title="{% trans %}Edit{% endtrans %}"><i class="fa fa-pencil"></i></a>&nbsp;
<a href="{{ url_for('.domain_delete', domain_name=domain.name) }}" title="Delete"><i class="fa fa-trash"></i></a>&nbsp; <a href="{{ url_for('.domain_delete', domain_name=domain.name) }}" title="{% trans %}Delete{% endtrans %}"><i class="fa fa-trash"></i></a>&nbsp;
{% endif %} {% endif %}
</td> </td>
<td> <td>
<a href="{{ url_for('.user_list', domain_name=domain.name) }}" title="Users"><i class="fa fa-envelope-o"></i></a>&nbsp; <a href="{{ url_for('.user_list', domain_name=domain.name) }}" title="{% trans %}Users{% endtrans %}"><i class="fa fa-envelope-o"></i></a>&nbsp;
<a href="{{ url_for('.alias_list', domain_name=domain.name) }}" title="Aliases"><i class="fa fa-at"></i></a>&nbsp; <a href="{{ url_for('.alias_list', domain_name=domain.name) }}" title="{% trans %}Aliases{% endtrans %}"><i class="fa fa-at"></i></a>&nbsp;
<a href="{{ url_for('.manager_list', domain_name=domain.name) }}" title="Managers"><i class="fa fa-user"></i></a>&nbsp; <a href="{{ url_for('.manager_list', domain_name=domain.name) }}" title="{% trans %}Managers{% endtrans %}"><i class="fa fa-user"></i></a>&nbsp;
</td> </td>
<td>{{ domain.name }}</td> <td>{{ domain.name }}</td>
<td>{{ domain.users | count }} / {{ domain.max_users or '∞' }}</td> <td>{{ domain.users | count }} / {{ domain.max_users or '∞' }}</td>

@ -1,7 +1,7 @@
{% extends "form.html" %} {% extends "form.html" %}
{% block title %} {% block title %}
Add a fetched account {% trans %}Add a fetched account{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}

@ -1,7 +1,7 @@
{% extends "form.html" %} {% extends "form.html" %}
{% block title %} {% block title %}
Update a fetched account {% trans %}Update a fetched account{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Fetched accounts {% trans %}Fetched accounts{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}
@ -9,26 +9,26 @@ Fetched accounts
{% endblock %} {% endblock %}
{% block main_action %} {% block main_action %}
<a class="btn btn-primary" href="{{ url_for('.fetch_create', user_email=user.email) }}">Add an account</a> <a class="btn btn-primary" href="{{ url_for('.fetch_create', user_email=user.email) }}">{% trans %}Add an account{% endtrans %}</a>
{% endblock %} {% endblock %}
{% block box %} {% block box %}
<table class="table table-bordered"> <table class="table table-bordered">
<tbody> <tbody>
<tr> <tr>
<th>Actions</th> <th>{% trans %}Actions{% endtrans %}</th>
<th>Endpoint</th> <th>{% trans %}Endpoint{% endtrans %}</th>
<th>Username</th> <th>{% trans %}Username{% endtrans %}</th>
<th>Last check</th> <th>{% trans %}Last check{% endtrans %}</th>
<th>Status</th> <th>{% trans %}Status{% endtrans %}</th>
<th>Created</th> <th>{% trans %}Created{% endtrans %}</th>
<th>Last edit</th> <th>{% trans %}Last edit{% endtrans %}</th>
</tr> </tr>
{% for fetch in user.fetches %} {% for fetch in user.fetches %}
<tr> <tr>
<td> <td>
<a href="{{ url_for('.fetch_edit', fetch_id=fetch.id) }}" title="Edit"><i class="fa fa-pencil"></i></a>&nbsp; <a href="{{ url_for('.fetch_edit', fetch_id=fetch.id) }}" title="{% trans %}Edit{% endtrans %}"><i class="fa fa-pencil"></i></a>&nbsp;
<a href="{{ url_for('.fetch_delete', fetch_id=fetch.id) }}" title="Delete"><i class="fa fa-trash"></i></a> <a href="{{ url_for('.fetch_delete', fetch_id=fetch.id) }}" title="{% trans %}Delete{% endtrans %}"><i class="fa fa-trash"></i></a>
</td> </td>
<td>{{ fetch.protocol }}{{ 's' if fetch.tls else '' }}://{{ fetch.host }}:{{ fetch.port }}</td> <td>{{ fetch.protocol }}{{ 's' if fetch.tls else '' }}://{{ fetch.host }}:{{ fetch.port }}</td>
<td>{{ fetch.username }}</td> <td>{{ fetch.username }}</td>

@ -3,10 +3,10 @@
{% block sidebar %} {% block sidebar %}
<section class="sidebar"> <section class="sidebar">
<ul class="sidebar-menu"> <ul class="sidebar-menu">
<li class="header">Your account</li> <li class="header">{% trans %}Your account{% endtrans %}</li>
<li> <li>
<a href="#"> <a href="#">
<i class="fa fa-sign-in"></i> <span>Sign in</span> <i class="fa fa-sign-in"></i> <span>{% trans %}Sign in{% endtrans %}</span>
</a> </a>
</li> </li>
</ul> </ul>
@ -14,11 +14,11 @@
{% endblock %} {% endblock %}
{% block title %} {% block title %}
Sign in {% trans %}Sign in{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}
to access the administration tools {% trans %}to access the administration tools{% endtrans %}
{% endblock %} {% endblock %}
{% block box_content %} {% block box_content %}

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Add a manager {% trans %}Add a manager{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}

@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Manager list {% trans %}Manager list{% endtrans %}
{% endblock %} {% endblock %}
{% block subtitle %} {% block subtitle %}
@ -9,20 +9,20 @@ Manager list
{% endblock %} {% endblock %}
{% block main_action %} {% block main_action %}
<a class="btn btn-primary" href="{{ url_for('.manager_create', domain_name=domain.name) }}">Add manager</a> <a class="btn btn-primary" href="{{ url_for('.manager_create', domain_name=domain.name) }}">{% trans %}Add manager{% endtrans %}</a>
{% endblock %} {% endblock %}
{% block box %} {% block box %}
<table class="table table-bordered"> <table class="table table-bordered">
<tbody> <tbody>
<tr> <tr>
<th>Actions</th> <th>{% trans %}Actions{% endtrans %}</th>
<th>Email</th> <th>{% trans %}Email{% endtrans %}</th>
</tr> </tr>
{% for manager in domain.managers %} {% for manager in domain.managers %}
<tr> <tr>
<td> <td>
<a href="{{ url_for('.manager_delete', domain_name=domain.name, user_email=manager.email) }}" title="Delete"><i class="fa fa-trash"></i></a> <a href="{{ url_for('.manager_delete', domain_name=domain.name, user_email=manager.email) }}" title="{% trans %}Delete{% endtrans %}"><i class="fa fa-trash"></i></a>
</td> </td>
<td>{{ manager }}</td> <td>{{ manager }}</td>
</tr> </tr>

@ -1,19 +1,19 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
Services status {% trans %}Services status{% endtrans %}
{% endblock %} {% endblock %}
{% block box %} {% block box %}
<table class="table table-bordered"> <table class="table table-bordered">
<tbody> <tbody>
<tr> <tr>
<th>Service</th> <th>{% trans %}Service{% endtrans %}</th>
<th>Status</th> <th>{% trans %}Status{% endtrans %}</th>
<th>PID</th> <th>{% trans %}PID{% endtrans %}</th>
<th>Image</th> <th>{% trans %}Image{% endtrans %}</th>
<th>Started</th> <th>{% trans %}Started{% endtrans %}</th>
<th>Last update</th> <th>{% trans %}Last update{% endtrans %}</th>
</tr> </tr>
{% for name, container in containers.items() %} {% for name, container in containers.items() %}
<tr> <tr>

@ -2,61 +2,61 @@
<h4 class="text-center text-primary">{{ current_user }}</h4> <h4 class="text-center text-primary">{{ current_user }}</h4>
<ul class="sidebar-menu"> <ul class="sidebar-menu">
<li class="header">My account</li> <li class="header">{% trans %}My account{% endtrans %}</li>
<li> <li>
<a href="{{ url_for('.user_settings') }}"> <a href="{{ url_for('.user_settings') }}">
<i class="fa fa-wrench"></i> <span>Settings</span> <i class="fa fa-wrench"></i> <span>{% trans %}Settings{% endtrans %}</span>
</a> </a>
</li> </li>
<li> <li>
<a href="{{ url_for('.user_password') }}"> <a href="{{ url_for('.user_password') }}">
<i class="fa fa-lock"></i> <span>Update password</span> <i class="fa fa-lock"></i> <span>{% trans %}Update password{% endtrans %}</span>
</a> </a>
</li> </li>
<li> <li>
<a href="{{ url_for('.user_forward') }}"> <a href="{{ url_for('.user_forward') }}">
<i class="fa fa-share"></i> <span>Auto-forward</span> <i class="fa fa-share"></i> <span>{% trans %}Auto-forward{% endtrans %}</span>
</a> </a>
</li> </li>
<li> <li>
<a href="{{ url_for('.user_reply') }}"> <a href="{{ url_for('.user_reply') }}">
<i class="fa fa-plane"></i> <span>Auto-reply</span> <i class="fa fa-plane"></i> <span>{% trans %}Auto-reply{% endtrans %}</span>
</a> </a>
</li> </li>
<li> <li>
<a href="{{ url_for('.fetch_list') }}"> <a href="{{ url_for('.fetch_list') }}">
<i class="fa fa-download"></i> <span>Fetched accounts</span> <i class="fa fa-download"></i> <span>{% trans %}Fetched accounts{% endtrans %}</span>
</a> </a>
</li> </li>
<li> <li>
<a href="{{ url_for('.logout') }}"> <a href="{{ url_for('.logout') }}">
<i class="fa fa-sign-out"></i> <span>Sign out</span> <i class="fa fa-sign-out"></i> <span>{% trans %}Sign out{% endtrans %}</span>
</a> </a>
</li> </li>
<li class="header">Administration</li> <li class="header">{% trans %}Administration{% endtrans %}</li>
{% if current_user.global_admin %} {% if current_user.global_admin %}
<li> <li>
<a href="{{ url_for('.services') }}"> <a href="{{ url_for('.services') }}">
<i class="fa fa-dashboard"></i> <span>Services status</span> <i class="fa fa-dashboard"></i> <span>{% trans %}Services status{% endtrans %}</span>
</a> </a>
</li> </li>
<li> <li>
<a href="{{ url_for('.admin_list') }}"> <a href="{{ url_for('.admin_list') }}">
<i class="fa fa-user"></i> <span>Administrators</span> <i class="fa fa-user"></i> <span>{% trans %}Administrators{% endtrans %}</span>
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if current_user.manager_of or current_user.global_admin %} {% if current_user.manager_of or current_user.global_admin %}
<li> <li>
<a href="{{ url_for('.domain_list') }}"> <a href="{{ url_for('.domain_list') }}">
<i class="fa fa-envelope"></i> <span>Mail domains</span> <i class="fa fa-envelope"></i> <span>{% trans %}Mail domains{% endtrans %}</span>
</a> </a>
</li> </li>
{% endif %} {% endif %}
<li> <li>
<a href="https://github.com/kaiyou/freeposte.io"> <a href="https://github.com/kaiyou/freeposte.io">
<i class="fa fa-life-ring"></i> <span>Help</span> <i class="fa fa-life-ring"></i> <span>{% trans %}Help{% endtrans %}</span>
</a> </a>
</li> </li>
</ul> </ul>

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block content %} {% block content %}
<div class="alert alert-warning" role="alert">We are still working on this feature!</div> <div class="alert alert-warning" role="alert">{% trans %}We are still working on this feature!{% endtrans %}</div>
{% endblock %} {% endblock %}

@ -0,0 +1,436 @@
# English translations for PROJECT.
# Copyright (C) 2016 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2016-10-02 17:33+0200\n"
"PO-Revision-Date: 2016-10-02 15:02+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n"
"Language-Team: en <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
#: freeposte/admin/forms.py:32
msgid "Invalid email address."
msgstr ""
#: freeposte/admin/forms.py:36
msgid "Confirm"
msgstr ""
#: freeposte/admin/forms.py:40 freeposte/admin/forms.py:54
msgid "E-mail"
msgstr ""
#: freeposte/admin/forms.py:41 freeposte/admin/forms.py:55
#: freeposte/admin/forms.py:72 freeposte/admin/forms.py:120
msgid "Password"
msgstr ""
#: freeposte/admin/forms.py:42 freeposte/admin/templates/login.html:9
#: freeposte/admin/templates/login.html:17
msgid "Sign in"
msgstr ""
#: freeposte/admin/forms.py:46 freeposte/admin/templates/domain/details.html:21
#: freeposte/admin/templates/domain/list.html:19
msgid "Domain name"
msgstr ""
#: freeposte/admin/forms.py:47
msgid "Maximum user count"
msgstr ""
#: freeposte/admin/forms.py:48
msgid "Maximum alias count"
msgstr ""
#: freeposte/admin/forms.py:49 freeposte/admin/forms.py:60
#: freeposte/admin/forms.py:98 freeposte/admin/templates/alias/list.html:22
#: freeposte/admin/templates/domain/list.html:22
msgid "Comment"
msgstr ""
#: freeposte/admin/forms.py:50 freeposte/admin/forms.py:99
msgid "Create"
msgstr ""
#: freeposte/admin/forms.py:56
msgid "Confirm password"
msgstr ""
#: freeposte/admin/forms.py:57
msgid "Quota"
msgstr ""
#: freeposte/admin/forms.py:58
msgid "Allow IMAP access"
msgstr ""
#: freeposte/admin/forms.py:59
msgid "Allow POP3 access"
msgstr ""
#: freeposte/admin/forms.py:61
msgid "Save"
msgstr ""
#: freeposte/admin/forms.py:65
msgid "Displayed name"
msgstr ""
#: freeposte/admin/forms.py:66
msgid "Enable spam filter"
msgstr ""
#: freeposte/admin/forms.py:67
msgid "Spam filter threshold"
msgstr ""
#: freeposte/admin/forms.py:68
msgid "Save settings"
msgstr ""
#: freeposte/admin/forms.py:73
msgid "Password check"
msgstr ""
#: freeposte/admin/forms.py:74 freeposte/admin/templates/sidebar.html:13
msgid "Update password"
msgstr ""
#: freeposte/admin/forms.py:78
msgid "Enable forwarding"
msgstr ""
#: freeposte/admin/forms.py:80 freeposte/admin/forms.py:97
#: freeposte/admin/templates/alias/list.html:21
msgid "Destination"
msgstr ""
#: freeposte/admin/forms.py:82 freeposte/admin/forms.py:90
msgid "Update"
msgstr ""
#: freeposte/admin/forms.py:86
msgid "Enable automatic reply"
msgstr ""
#: freeposte/admin/forms.py:87
msgid "Reply subject"
msgstr ""
#: freeposte/admin/forms.py:88
msgid "Reply body"
msgstr ""
#: freeposte/admin/forms.py:94
msgid "Alias"
msgstr ""
#: freeposte/admin/forms.py:96
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr ""
#: freeposte/admin/forms.py:103
msgid "Admin email"
msgstr ""
#: freeposte/admin/forms.py:104 freeposte/admin/forms.py:109
#: freeposte/admin/forms.py:121
msgid "Submit"
msgstr ""
#: freeposte/admin/forms.py:108
msgid "Manager email"
msgstr ""
#: freeposte/admin/forms.py:113
msgid "Protocol"
msgstr ""
#: freeposte/admin/forms.py:116
msgid "Hostname or IP"
msgstr ""
#: freeposte/admin/forms.py:117
msgid "TCP port"
msgstr ""
#: freeposte/admin/forms.py:118
msgid "Enable TLS"
msgstr ""
#: freeposte/admin/forms.py:119 freeposte/admin/templates/fetch/list.html:21
msgid "Username"
msgstr ""
#: freeposte/admin/templates/confirm.html:4
msgid "Confirm action"
msgstr ""
#: freeposte/admin/templates/confirm.html:12
#, python-format
msgid "You are about to %(action)s. Please confirm your action."
msgstr ""
#: freeposte/admin/templates/login.html:6
msgid "Your account"
msgstr ""
#: freeposte/admin/templates/login.html:21
msgid "to access the administration tools"
msgstr ""
#: freeposte/admin/templates/services.html:4
#: freeposte/admin/templates/sidebar.html:40
msgid "Services status"
msgstr ""
#: freeposte/admin/templates/services.html:11
msgid "Service"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:23
#: freeposte/admin/templates/services.html:12
msgid "Status"
msgstr ""
#: freeposte/admin/templates/services.html:13
msgid "PID"
msgstr ""
#: freeposte/admin/templates/services.html:14
msgid "Image"
msgstr ""
#: freeposte/admin/templates/services.html:15
msgid "Started"
msgstr ""
#: freeposte/admin/templates/services.html:16
msgid "Last update"
msgstr ""
#: freeposte/admin/templates/sidebar.html:5
msgid "My account"
msgstr ""
#: freeposte/admin/templates/sidebar.html:8
msgid "Settings"
msgstr ""
#: freeposte/admin/templates/sidebar.html:18
msgid "Auto-forward"
msgstr ""
#: freeposte/admin/templates/sidebar.html:23
msgid "Auto-reply"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:4
#: freeposte/admin/templates/sidebar.html:28
msgid "Fetched accounts"
msgstr ""
#: freeposte/admin/templates/sidebar.html:33
msgid "Sign out"
msgstr ""
#: freeposte/admin/templates/sidebar.html:36
msgid "Administration"
msgstr ""
#: freeposte/admin/templates/sidebar.html:45
msgid "Administrators"
msgstr ""
#: freeposte/admin/templates/sidebar.html:52
msgid "Mail domains"
msgstr ""
#: freeposte/admin/templates/sidebar.html:59
msgid "Help"
msgstr ""
#: freeposte/admin/templates/working.html:4
msgid "We are still working on this feature!"
msgstr ""
#: freeposte/admin/templates/admin/create.html:4
msgid "Add a global administrator"
msgstr ""
#: freeposte/admin/templates/admin/list.html:4
msgid "Global administrators"
msgstr ""
#: freeposte/admin/templates/admin/list.html:9
msgid "Add administrator"
msgstr ""
#: freeposte/admin/templates/admin/list.html:17
#: freeposte/admin/templates/alias/list.html:19
#: freeposte/admin/templates/domain/list.html:17
#: freeposte/admin/templates/fetch/list.html:19
#: freeposte/admin/templates/manager/list.html:19
msgid "Actions"
msgstr ""
#: freeposte/admin/templates/admin/list.html:18
#: freeposte/admin/templates/alias/list.html:20
#: freeposte/admin/templates/manager/list.html:20
msgid "Email"
msgstr ""
#: freeposte/admin/templates/admin/list.html:23
#: freeposte/admin/templates/alias/list.html:30
#: freeposte/admin/templates/domain/list.html:32
#: freeposte/admin/templates/fetch/list.html:31
#: freeposte/admin/templates/manager/list.html:25
msgid "Delete"
msgstr ""
#: freeposte/admin/templates/alias/create.html:4
msgid "Create alias"
msgstr ""
#: freeposte/admin/templates/alias/edit.html:4
msgid "Edit alias"
msgstr ""
#: freeposte/admin/templates/alias/list.html:4
msgid "Alias list"
msgstr ""
#: freeposte/admin/templates/alias/list.html:12
msgid "Add alias"
msgstr ""
#: freeposte/admin/templates/alias/list.html:23
#: freeposte/admin/templates/domain/list.html:23
#: freeposte/admin/templates/fetch/list.html:24
msgid "Created"
msgstr ""
#: freeposte/admin/templates/alias/list.html:24
#: freeposte/admin/templates/domain/list.html:24
#: freeposte/admin/templates/fetch/list.html:25
msgid "Last edit"
msgstr ""
#: freeposte/admin/templates/alias/list.html:29
#: freeposte/admin/templates/domain/list.html:31
#: freeposte/admin/templates/fetch/list.html:30
msgid "Edit"
msgstr ""
#: freeposte/admin/templates/domain/create.html:4
#: freeposte/admin/templates/domain/list.html:9
msgid "New domain"
msgstr ""
#: freeposte/admin/templates/domain/details.html:4
msgid "Domain details"
msgstr ""
#: freeposte/admin/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr ""
#: freeposte/admin/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr ""
#: freeposte/admin/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr ""
#: freeposte/admin/templates/domain/details.html:36
msgid "DKIM public key"
msgstr ""
#: freeposte/admin/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr ""
#: freeposte/admin/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr ""
#: freeposte/admin/templates/domain/edit.html:4
msgid "Edit domain"
msgstr ""
#: freeposte/admin/templates/domain/list.html:4
msgid "Domain list"
msgstr ""
#: freeposte/admin/templates/domain/list.html:18
msgid "Manage"
msgstr ""
#: freeposte/admin/templates/domain/list.html:20
msgid "Mailbox count"
msgstr ""
#: freeposte/admin/templates/domain/list.html:21
msgid "Alias count"
msgstr ""
#: freeposte/admin/templates/domain/list.html:29
msgid "Details"
msgstr ""
#: freeposte/admin/templates/domain/list.html:36
msgid "Users"
msgstr ""
#: freeposte/admin/templates/domain/list.html:37
msgid "Aliases"
msgstr ""
#: freeposte/admin/templates/domain/list.html:38
msgid "Managers"
msgstr ""
#: freeposte/admin/templates/fetch/create.html:4
msgid "Add a fetched account"
msgstr ""
#: freeposte/admin/templates/fetch/edit.html:4
msgid "Update a fetched account"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:12
msgid "Add an account"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:20
msgid "Endpoint"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:22
msgid "Last check"
msgstr ""
#: freeposte/admin/templates/manager/create.html:4
msgid "Add a manager"
msgstr ""
#: freeposte/admin/templates/manager/list.html:4
msgid "Manager list"
msgstr ""
#: freeposte/admin/templates/manager/list.html:12
msgid "Add manager"
msgstr ""

@ -0,0 +1,436 @@
# French translations for PROJECT.
# Copyright (C) 2016 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2016-10-02 17:33+0200\n"
"PO-Revision-Date: 2016-10-02 16:32+0200\n"
"Last-Translator: \n"
"Language: fr\n"
"Language-Team: fr <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
#: freeposte/admin/forms.py:32
msgid "Invalid email address."
msgstr ""
#: freeposte/admin/forms.py:36
msgid "Confirm"
msgstr "Confirmer"
#: freeposte/admin/forms.py:40 freeposte/admin/forms.py:54
msgid "E-mail"
msgstr ""
#: freeposte/admin/forms.py:41 freeposte/admin/forms.py:55
#: freeposte/admin/forms.py:72 freeposte/admin/forms.py:120
msgid "Password"
msgstr ""
#: freeposte/admin/forms.py:42 freeposte/admin/templates/login.html:9
#: freeposte/admin/templates/login.html:17
msgid "Sign in"
msgstr ""
#: freeposte/admin/forms.py:46 freeposte/admin/templates/domain/details.html:21
#: freeposte/admin/templates/domain/list.html:19
msgid "Domain name"
msgstr ""
#: freeposte/admin/forms.py:47
msgid "Maximum user count"
msgstr ""
#: freeposte/admin/forms.py:48
msgid "Maximum alias count"
msgstr ""
#: freeposte/admin/forms.py:49 freeposte/admin/forms.py:60
#: freeposte/admin/forms.py:98 freeposte/admin/templates/alias/list.html:22
#: freeposte/admin/templates/domain/list.html:22
msgid "Comment"
msgstr ""
#: freeposte/admin/forms.py:50 freeposte/admin/forms.py:99
msgid "Create"
msgstr ""
#: freeposte/admin/forms.py:56
msgid "Confirm password"
msgstr ""
#: freeposte/admin/forms.py:57
msgid "Quota"
msgstr ""
#: freeposte/admin/forms.py:58
msgid "Allow IMAP access"
msgstr ""
#: freeposte/admin/forms.py:59
msgid "Allow POP3 access"
msgstr ""
#: freeposte/admin/forms.py:61
msgid "Save"
msgstr ""
#: freeposte/admin/forms.py:65
msgid "Displayed name"
msgstr ""
#: freeposte/admin/forms.py:66
msgid "Enable spam filter"
msgstr ""
#: freeposte/admin/forms.py:67
msgid "Spam filter threshold"
msgstr ""
#: freeposte/admin/forms.py:68
msgid "Save settings"
msgstr ""
#: freeposte/admin/forms.py:73
msgid "Password check"
msgstr ""
#: freeposte/admin/forms.py:74 freeposte/admin/templates/sidebar.html:13
msgid "Update password"
msgstr ""
#: freeposte/admin/forms.py:78
msgid "Enable forwarding"
msgstr ""
#: freeposte/admin/forms.py:80 freeposte/admin/forms.py:97
#: freeposte/admin/templates/alias/list.html:21
msgid "Destination"
msgstr ""
#: freeposte/admin/forms.py:82 freeposte/admin/forms.py:90
msgid "Update"
msgstr ""
#: freeposte/admin/forms.py:86
msgid "Enable automatic reply"
msgstr ""
#: freeposte/admin/forms.py:87
msgid "Reply subject"
msgstr ""
#: freeposte/admin/forms.py:88
msgid "Reply body"
msgstr ""
#: freeposte/admin/forms.py:94
msgid "Alias"
msgstr ""
#: freeposte/admin/forms.py:96
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr ""
#: freeposte/admin/forms.py:103
msgid "Admin email"
msgstr "Email de l'administrateur"
#: freeposte/admin/forms.py:104 freeposte/admin/forms.py:109
#: freeposte/admin/forms.py:121
msgid "Submit"
msgstr ""
#: freeposte/admin/forms.py:108
msgid "Manager email"
msgstr ""
#: freeposte/admin/forms.py:113
msgid "Protocol"
msgstr ""
#: freeposte/admin/forms.py:116
msgid "Hostname or IP"
msgstr ""
#: freeposte/admin/forms.py:117
msgid "TCP port"
msgstr ""
#: freeposte/admin/forms.py:118
msgid "Enable TLS"
msgstr ""
#: freeposte/admin/forms.py:119 freeposte/admin/templates/fetch/list.html:21
msgid "Username"
msgstr ""
#: freeposte/admin/templates/confirm.html:4
msgid "Confirm action"
msgstr "Confirmer"
#: freeposte/admin/templates/confirm.html:12
#, python-format
msgid "You are about to %(action)s. Please confirm your action."
msgstr "Vous allez %(action)s. Merci de confirmer votre action."
#: freeposte/admin/templates/login.html:6
msgid "Your account"
msgstr ""
#: freeposte/admin/templates/login.html:21
msgid "to access the administration tools"
msgstr ""
#: freeposte/admin/templates/services.html:4
#: freeposte/admin/templates/sidebar.html:40
msgid "Services status"
msgstr ""
#: freeposte/admin/templates/services.html:11
msgid "Service"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:23
#: freeposte/admin/templates/services.html:12
msgid "Status"
msgstr ""
#: freeposte/admin/templates/services.html:13
msgid "PID"
msgstr ""
#: freeposte/admin/templates/services.html:14
msgid "Image"
msgstr ""
#: freeposte/admin/templates/services.html:15
msgid "Started"
msgstr ""
#: freeposte/admin/templates/services.html:16
msgid "Last update"
msgstr ""
#: freeposte/admin/templates/sidebar.html:5
msgid "My account"
msgstr ""
#: freeposte/admin/templates/sidebar.html:8
msgid "Settings"
msgstr ""
#: freeposte/admin/templates/sidebar.html:18
msgid "Auto-forward"
msgstr ""
#: freeposte/admin/templates/sidebar.html:23
msgid "Auto-reply"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:4
#: freeposte/admin/templates/sidebar.html:28
msgid "Fetched accounts"
msgstr ""
#: freeposte/admin/templates/sidebar.html:33
msgid "Sign out"
msgstr ""
#: freeposte/admin/templates/sidebar.html:36
msgid "Administration"
msgstr ""
#: freeposte/admin/templates/sidebar.html:45
msgid "Administrators"
msgstr ""
#: freeposte/admin/templates/sidebar.html:52
msgid "Mail domains"
msgstr ""
#: freeposte/admin/templates/sidebar.html:59
msgid "Help"
msgstr ""
#: freeposte/admin/templates/working.html:4
msgid "We are still working on this feature!"
msgstr ""
#: freeposte/admin/templates/admin/create.html:4
msgid "Add a global administrator"
msgstr ""
#: freeposte/admin/templates/admin/list.html:4
msgid "Global administrators"
msgstr ""
#: freeposte/admin/templates/admin/list.html:9
msgid "Add administrator"
msgstr ""
#: freeposte/admin/templates/admin/list.html:17
#: freeposte/admin/templates/alias/list.html:19
#: freeposte/admin/templates/domain/list.html:17
#: freeposte/admin/templates/fetch/list.html:19
#: freeposte/admin/templates/manager/list.html:19
msgid "Actions"
msgstr ""
#: freeposte/admin/templates/admin/list.html:18
#: freeposte/admin/templates/alias/list.html:20
#: freeposte/admin/templates/manager/list.html:20
msgid "Email"
msgstr ""
#: freeposte/admin/templates/admin/list.html:23
#: freeposte/admin/templates/alias/list.html:30
#: freeposte/admin/templates/domain/list.html:32
#: freeposte/admin/templates/fetch/list.html:31
#: freeposte/admin/templates/manager/list.html:25
msgid "Delete"
msgstr ""
#: freeposte/admin/templates/alias/create.html:4
msgid "Create alias"
msgstr ""
#: freeposte/admin/templates/alias/edit.html:4
msgid "Edit alias"
msgstr ""
#: freeposte/admin/templates/alias/list.html:4
msgid "Alias list"
msgstr ""
#: freeposte/admin/templates/alias/list.html:12
msgid "Add alias"
msgstr ""
#: freeposte/admin/templates/alias/list.html:23
#: freeposte/admin/templates/domain/list.html:23
#: freeposte/admin/templates/fetch/list.html:24
msgid "Created"
msgstr ""
#: freeposte/admin/templates/alias/list.html:24
#: freeposte/admin/templates/domain/list.html:24
#: freeposte/admin/templates/fetch/list.html:25
msgid "Last edit"
msgstr ""
#: freeposte/admin/templates/alias/list.html:29
#: freeposte/admin/templates/domain/list.html:31
#: freeposte/admin/templates/fetch/list.html:30
msgid "Edit"
msgstr ""
#: freeposte/admin/templates/domain/create.html:4
#: freeposte/admin/templates/domain/list.html:9
msgid "New domain"
msgstr ""
#: freeposte/admin/templates/domain/details.html:4
msgid "Domain details"
msgstr ""
#: freeposte/admin/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr ""
#: freeposte/admin/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr ""
#: freeposte/admin/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr ""
#: freeposte/admin/templates/domain/details.html:36
msgid "DKIM public key"
msgstr ""
#: freeposte/admin/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr ""
#: freeposte/admin/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr ""
#: freeposte/admin/templates/domain/edit.html:4
msgid "Edit domain"
msgstr ""
#: freeposte/admin/templates/domain/list.html:4
msgid "Domain list"
msgstr ""
#: freeposte/admin/templates/domain/list.html:18
msgid "Manage"
msgstr ""
#: freeposte/admin/templates/domain/list.html:20
msgid "Mailbox count"
msgstr ""
#: freeposte/admin/templates/domain/list.html:21
msgid "Alias count"
msgstr ""
#: freeposte/admin/templates/domain/list.html:29
msgid "Details"
msgstr ""
#: freeposte/admin/templates/domain/list.html:36
msgid "Users"
msgstr ""
#: freeposte/admin/templates/domain/list.html:37
msgid "Aliases"
msgstr ""
#: freeposte/admin/templates/domain/list.html:38
msgid "Managers"
msgstr ""
#: freeposte/admin/templates/fetch/create.html:4
msgid "Add a fetched account"
msgstr ""
#: freeposte/admin/templates/fetch/edit.html:4
msgid "Update a fetched account"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:12
msgid "Add an account"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:20
msgid "Endpoint"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:22
msgid "Last check"
msgstr ""
#: freeposte/admin/templates/manager/create.html:4
msgid "Add a manager"
msgstr ""
#: freeposte/admin/templates/manager/list.html:4
msgid "Manager list"
msgstr ""
#: freeposte/admin/templates/manager/list.html:12
msgid "Add manager"
msgstr ""

@ -0,0 +1,435 @@
# Translations template for PROJECT.
# Copyright (C) 2016 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2016-10-02 17:33+0200\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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
#: freeposte/admin/forms.py:32
msgid "Invalid email address."
msgstr ""
#: freeposte/admin/forms.py:36
msgid "Confirm"
msgstr ""
#: freeposte/admin/forms.py:40 freeposte/admin/forms.py:54
msgid "E-mail"
msgstr ""
#: freeposte/admin/forms.py:41 freeposte/admin/forms.py:55
#: freeposte/admin/forms.py:72 freeposte/admin/forms.py:120
msgid "Password"
msgstr ""
#: freeposte/admin/forms.py:42 freeposte/admin/templates/login.html:9
#: freeposte/admin/templates/login.html:17
msgid "Sign in"
msgstr ""
#: freeposte/admin/forms.py:46 freeposte/admin/templates/domain/details.html:21
#: freeposte/admin/templates/domain/list.html:19
msgid "Domain name"
msgstr ""
#: freeposte/admin/forms.py:47
msgid "Maximum user count"
msgstr ""
#: freeposte/admin/forms.py:48
msgid "Maximum alias count"
msgstr ""
#: freeposte/admin/forms.py:49 freeposte/admin/forms.py:60
#: freeposte/admin/forms.py:98 freeposte/admin/templates/alias/list.html:22
#: freeposte/admin/templates/domain/list.html:22
msgid "Comment"
msgstr ""
#: freeposte/admin/forms.py:50 freeposte/admin/forms.py:99
msgid "Create"
msgstr ""
#: freeposte/admin/forms.py:56
msgid "Confirm password"
msgstr ""
#: freeposte/admin/forms.py:57
msgid "Quota"
msgstr ""
#: freeposte/admin/forms.py:58
msgid "Allow IMAP access"
msgstr ""
#: freeposte/admin/forms.py:59
msgid "Allow POP3 access"
msgstr ""
#: freeposte/admin/forms.py:61
msgid "Save"
msgstr ""
#: freeposte/admin/forms.py:65
msgid "Displayed name"
msgstr ""
#: freeposte/admin/forms.py:66
msgid "Enable spam filter"
msgstr ""
#: freeposte/admin/forms.py:67
msgid "Spam filter threshold"
msgstr ""
#: freeposte/admin/forms.py:68
msgid "Save settings"
msgstr ""
#: freeposte/admin/forms.py:73
msgid "Password check"
msgstr ""
#: freeposte/admin/forms.py:74 freeposte/admin/templates/sidebar.html:13
msgid "Update password"
msgstr ""
#: freeposte/admin/forms.py:78
msgid "Enable forwarding"
msgstr ""
#: freeposte/admin/forms.py:80 freeposte/admin/forms.py:97
#: freeposte/admin/templates/alias/list.html:21
msgid "Destination"
msgstr ""
#: freeposte/admin/forms.py:82 freeposte/admin/forms.py:90
msgid "Update"
msgstr ""
#: freeposte/admin/forms.py:86
msgid "Enable automatic reply"
msgstr ""
#: freeposte/admin/forms.py:87
msgid "Reply subject"
msgstr ""
#: freeposte/admin/forms.py:88
msgid "Reply body"
msgstr ""
#: freeposte/admin/forms.py:94
msgid "Alias"
msgstr ""
#: freeposte/admin/forms.py:96
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr ""
#: freeposte/admin/forms.py:103
msgid "Admin email"
msgstr ""
#: freeposte/admin/forms.py:104 freeposte/admin/forms.py:109
#: freeposte/admin/forms.py:121
msgid "Submit"
msgstr ""
#: freeposte/admin/forms.py:108
msgid "Manager email"
msgstr ""
#: freeposte/admin/forms.py:113
msgid "Protocol"
msgstr ""
#: freeposte/admin/forms.py:116
msgid "Hostname or IP"
msgstr ""
#: freeposte/admin/forms.py:117
msgid "TCP port"
msgstr ""
#: freeposte/admin/forms.py:118
msgid "Enable TLS"
msgstr ""
#: freeposte/admin/forms.py:119 freeposte/admin/templates/fetch/list.html:21
msgid "Username"
msgstr ""
#: freeposte/admin/templates/confirm.html:4
msgid "Confirm action"
msgstr ""
#: freeposte/admin/templates/confirm.html:12
#, python-format
msgid "You are about to %(action)s. Please confirm your action."
msgstr ""
#: freeposte/admin/templates/login.html:6
msgid "Your account"
msgstr ""
#: freeposte/admin/templates/login.html:21
msgid "to access the administration tools"
msgstr ""
#: freeposte/admin/templates/services.html:4
#: freeposte/admin/templates/sidebar.html:40
msgid "Services status"
msgstr ""
#: freeposte/admin/templates/services.html:11
msgid "Service"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:23
#: freeposte/admin/templates/services.html:12
msgid "Status"
msgstr ""
#: freeposte/admin/templates/services.html:13
msgid "PID"
msgstr ""
#: freeposte/admin/templates/services.html:14
msgid "Image"
msgstr ""
#: freeposte/admin/templates/services.html:15
msgid "Started"
msgstr ""
#: freeposte/admin/templates/services.html:16
msgid "Last update"
msgstr ""
#: freeposte/admin/templates/sidebar.html:5
msgid "My account"
msgstr ""
#: freeposte/admin/templates/sidebar.html:8
msgid "Settings"
msgstr ""
#: freeposte/admin/templates/sidebar.html:18
msgid "Auto-forward"
msgstr ""
#: freeposte/admin/templates/sidebar.html:23
msgid "Auto-reply"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:4
#: freeposte/admin/templates/sidebar.html:28
msgid "Fetched accounts"
msgstr ""
#: freeposte/admin/templates/sidebar.html:33
msgid "Sign out"
msgstr ""
#: freeposte/admin/templates/sidebar.html:36
msgid "Administration"
msgstr ""
#: freeposte/admin/templates/sidebar.html:45
msgid "Administrators"
msgstr ""
#: freeposte/admin/templates/sidebar.html:52
msgid "Mail domains"
msgstr ""
#: freeposte/admin/templates/sidebar.html:59
msgid "Help"
msgstr ""
#: freeposte/admin/templates/working.html:4
msgid "We are still working on this feature!"
msgstr ""
#: freeposte/admin/templates/admin/create.html:4
msgid "Add a global administrator"
msgstr ""
#: freeposte/admin/templates/admin/list.html:4
msgid "Global administrators"
msgstr ""
#: freeposte/admin/templates/admin/list.html:9
msgid "Add administrator"
msgstr ""
#: freeposte/admin/templates/admin/list.html:17
#: freeposte/admin/templates/alias/list.html:19
#: freeposte/admin/templates/domain/list.html:17
#: freeposte/admin/templates/fetch/list.html:19
#: freeposte/admin/templates/manager/list.html:19
msgid "Actions"
msgstr ""
#: freeposte/admin/templates/admin/list.html:18
#: freeposte/admin/templates/alias/list.html:20
#: freeposte/admin/templates/manager/list.html:20
msgid "Email"
msgstr ""
#: freeposte/admin/templates/admin/list.html:23
#: freeposte/admin/templates/alias/list.html:30
#: freeposte/admin/templates/domain/list.html:32
#: freeposte/admin/templates/fetch/list.html:31
#: freeposte/admin/templates/manager/list.html:25
msgid "Delete"
msgstr ""
#: freeposte/admin/templates/alias/create.html:4
msgid "Create alias"
msgstr ""
#: freeposte/admin/templates/alias/edit.html:4
msgid "Edit alias"
msgstr ""
#: freeposte/admin/templates/alias/list.html:4
msgid "Alias list"
msgstr ""
#: freeposte/admin/templates/alias/list.html:12
msgid "Add alias"
msgstr ""
#: freeposte/admin/templates/alias/list.html:23
#: freeposte/admin/templates/domain/list.html:23
#: freeposte/admin/templates/fetch/list.html:24
msgid "Created"
msgstr ""
#: freeposte/admin/templates/alias/list.html:24
#: freeposte/admin/templates/domain/list.html:24
#: freeposte/admin/templates/fetch/list.html:25
msgid "Last edit"
msgstr ""
#: freeposte/admin/templates/alias/list.html:29
#: freeposte/admin/templates/domain/list.html:31
#: freeposte/admin/templates/fetch/list.html:30
msgid "Edit"
msgstr ""
#: freeposte/admin/templates/domain/create.html:4
#: freeposte/admin/templates/domain/list.html:9
msgid "New domain"
msgstr ""
#: freeposte/admin/templates/domain/details.html:4
msgid "Domain details"
msgstr ""
#: freeposte/admin/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr ""
#: freeposte/admin/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr ""
#: freeposte/admin/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr ""
#: freeposte/admin/templates/domain/details.html:36
msgid "DKIM public key"
msgstr ""
#: freeposte/admin/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr ""
#: freeposte/admin/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr ""
#: freeposte/admin/templates/domain/edit.html:4
msgid "Edit domain"
msgstr ""
#: freeposte/admin/templates/domain/list.html:4
msgid "Domain list"
msgstr ""
#: freeposte/admin/templates/domain/list.html:18
msgid "Manage"
msgstr ""
#: freeposte/admin/templates/domain/list.html:20
msgid "Mailbox count"
msgstr ""
#: freeposte/admin/templates/domain/list.html:21
msgid "Alias count"
msgstr ""
#: freeposte/admin/templates/domain/list.html:29
msgid "Details"
msgstr ""
#: freeposte/admin/templates/domain/list.html:36
msgid "Users"
msgstr ""
#: freeposte/admin/templates/domain/list.html:37
msgid "Aliases"
msgstr ""
#: freeposte/admin/templates/domain/list.html:38
msgid "Managers"
msgstr ""
#: freeposte/admin/templates/fetch/create.html:4
msgid "Add a fetched account"
msgstr ""
#: freeposte/admin/templates/fetch/edit.html:4
msgid "Update a fetched account"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:12
msgid "Add an account"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:20
msgid "Endpoint"
msgstr ""
#: freeposte/admin/templates/fetch/list.html:22
msgid "Last check"
msgstr ""
#: freeposte/admin/templates/manager/create.html:4
msgid "Add a manager"
msgstr ""
#: freeposte/admin/templates/manager/list.html:4
msgid "Manager list"
msgstr ""
#: freeposte/admin/templates/manager/list.html:12
msgid "Add manager"
msgstr ""

@ -2,9 +2,10 @@ Flask
Flask-Login Flask-Login
Flask-SQLAlchemy Flask-SQLAlchemy
Flask-bootstrap Flask-bootstrap
Flask-Babel
Flask-migrate Flask-migrate
Flask-script Flask-script
flask_wtf Flask-wtf
WTForms-Components WTForms-Components
PyOpenSSL PyOpenSSL
passlib passlib

Loading…
Cancel
Save