Internationalize strings in template files

This commit is contained in:
Sunil Mohan Adapa 2015-11-13 22:02:17 +05:30
parent 139db064a9
commit 02cd89b60d
64 changed files with 1331 additions and 815 deletions

View File

@ -18,16 +18,26 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h2>Services and Applications</h2>
<h2>{% trans "Services and Applications" %}</h2>
<p>You can install and run various services and applications on your
{{ cfg.box_name }}.</p>
<p>
{% blocktrans trimmed %}
You can install and run various services and applications on
your {{ cfg.box_name }}.
{% endblocktrans %}
</p>
<p>This box can be your photo sharing site, your instant
messaging site, your social networking site, your news site. Remember
web portals? We can be one of those too. Many of the services you
use on the web could soon be on site and under your control!</p>
<p>
{% blocktrans trimmed %}
This box can be your photo sharing site, your instant messaging
site, your social networking site, your news site. Remember web
portals? We can be one of those too. Many of the services you
use on the web could soon be on site and under your control!
{% endblocktrans %}
</p>
{% endblock %}

View File

@ -19,36 +19,45 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>Service Discovery</h2>
<h2>{% trans "Service Discovery" %}</h2>
<p>Service discovery allows other machines on the network to discover
your FreedomBox and services running on it. It also allows
FreedomBox to discover other machines and services running on your
local network. Service discovery is not essential and works only on
internal networks. It may be disabled to improve security
especially when connecting to a hostile local network.</p>
<p>
{% blocktrans trimmed %}
Service discovery allows other machines on the network to
discover your FreedomBox and services running on it. It also
allows FreedomBox to discover other machines and services
running on your local network. Service discovery is not
essential and works only on internal networks. It may be
disabled to improve security especially when connecting to a
hostile local network.
{% endblocktrans %}
</p>
<h3>Status</h3>
<h3>{% trans "Status" %}</h3>
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span> Service discovery server is running
{% else %}
<span class="running-status inactive"></span> Service discovery server is not running
{% endif %}
</p>
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span>
{% trans "Service discovery server is running" %}
{% else %}
<span class="running-status inactive"></span>
{% trans "Service discovery server is not running" %}
{% endif %}
</p>
<h3>Configuration</h3>
<h3>{% trans "Configuration" %}</h3>
<form class="form" method="post">
{% csrf_token %}
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
@ -27,8 +28,8 @@
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Submit"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Submit" %}"/>
</form>
{% endblock %}

View File

@ -19,32 +19,41 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>Date & Time</h2>
<h2>{% trans "Date & Time" %}</h2>
<p>Network time server is a program that maintians the system time in synchronization with servers on the Internet.</p>
<p>
{% blocktrans trimmed %}
Network time server is a program that maintians the system time
in synchronization with servers on the Internet.
{% endblocktrans %}
</p>
<h3>Status</h3>
<h3>{% trans "Status" %}</h3>
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span> Network time server is running
{% else %}
<span class="running-status inactive"></span> Network time server is not running
{% endif %}
</p>
{% include "diagnostics_button.html" with module="datetime" %}
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span>
{% trans "Network time server is running" %}
{% else %}
<span class="running-status inactive"></span>
{% trans "Network time server is not running" %}
{% endif %}
</p>
{% include "diagnostics_button.html" with module="datetime" %}
<h3>Configuration</h3>
<h3>{% trans "Configuration" %}</h3>
<form class="form" method="post">
{% csrf_token %}
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -19,37 +19,46 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>BitTorrent Web Client (Deluge)</h2>
<h2>{% trans "BitTorrent Web Client (Deluge)" %}</h2>
<p>Deluge is a BitTorrent client that features a Web UI.</p>
<p>{% trans "Deluge is a BitTorrent client that features a Web UI." %}</p>
<p>When enabled, the Deluge web client will be available from
<a href="/deluge">/deluge</a> path on the web server. The default
password is 'deluge', but you should log in and change it immediately after
enabling this service.</p>
<p>
{% blocktrans trimmed %}
When enabled, the Deluge web client will be available from
<a href="/deluge">/deluge</a> path on the web server. The
default password is 'deluge', but you should log in and change
it immediately after enabling this service.
{% endblocktrans %}
</p>
<h3>Status</h3>
<h3>{% trans "Status" %}</h3>
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span> deluge-web is running
{% else %}
<span class="running-status inactive"></span> deluge-web is not running
{% endif %}
</p>
{% include "diagnostics_button.html" with module="deluge" %}
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span>
{% trans "deluge-web is running" %}
{% else %}
<span class="running-status inactive"></span>
{% trans "deluge-web is not running" %}
{% endif %}
</p>
<h3>Configuration</h3>
{% include "diagnostics_button.html" with module="deluge" %}
<form class="form" method="post">
{% csrf_token %}
<h3>{% trans "Configuration" %}</h3>
{{ form|bootstrap }}
<form class="form" method="post">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -18,6 +18,7 @@
#
{% endcomment %}
{% load i18n %}
{% block page_head %}
@ -30,49 +31,55 @@
{% block content %}
<h2>{{ title }}</h2>
<h2>{{ title }}</h2>
<p>The system diagnostic test will run a number of checks on your
system to confirm that applications and services are working as expected.</p>
<p>
{% blocktrans trimmed %}
The system diagnostic test will run a number of checks on your
system to confirm that applications and services are working as
expected.
{% endblocktrans %}
</p>
{% if not is_running %}
<form class="form form-diagnostics-button" method="post"
action="{% url 'diagnostics:index' %}">
{% csrf_token %}
{% if not is_running %}
<form class="form form-diagnostics-button" method="post"
action="{% url 'diagnostics:index' %}">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Run Diagnostics"/>
</form>
{% else %}
<p>Diagnotics test is currently running</p>
<div class="progress">
<div class="progress-bar progress-bar-striped active"
role="progressbar" aria-valuemin="0" aria-valuemax="100"
aria-valuenow="{{ results.progress_percentage }}"
style="width: {{ results.progress_percentage }}%">
{{ results.progress_percentage }}%
</div>
</div>
{% endif %}
{% if results %}
<h3>Results</h3>
{% if results.error %}
<div class="alert alert-danger alert-dismissable">
<a class="close" data-dismiss="alert">&times;</a>
{{ results.error }}
</div>
<input type="submit" class="btn btn-primary"
value="{% trans "Run Diagnostics" %}"/>
</form>
{% else %}
{% for module, module_results in results.results.items %}
<h4>Module: {{ module }}</h4>
<p>{% trans "Diagnotics test is currently running" %}</p>
<div class="progress">
<div class="progress-bar progress-bar-striped active"
role="progressbar" aria-valuemin="0" aria-valuemax="100"
aria-valuenow="{{ results.progress_percentage }}"
style="width: {{ results.progress_percentage }}%">
{{ results.progress_percentage }}%
</div>
</div>
{% if module_results %}
{% include "diagnostics_results.html" with results=module_results %}
{% else %}
<p><span class="glyphicon glyphicon-hourglass"></span></p>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% if results %}
<h3>{% trans "Results" %}</h3>
{% if results.error %}
<div class="alert alert-danger alert-dismissable">
<a class="close" data-dismiss="alert">&times;</a>
{{ results.error }}
</div>
{% else %}
{% for module, module_results in results.results.items %}
<h4>{% blocktrans %}Module: {{ module }}{% endblocktrans %}</h4>
{% if module_results %}
{% include "diagnostics_results.html" with results=module_results %}
{% else %}
<p><span class="glyphicon glyphicon-hourglass"></span></p>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% endblock %}

View File

@ -17,9 +17,12 @@
#
{% endcomment %}
{% load i18n %}
<form class="form form-diagnostics-button" method="post"
action="{% url 'diagnostics:module' module %}">
{% csrf_token %}
<input type="submit" class="btn btn-default" value="Run Diagnostics"/>
<input type="submit" class="btn btn-default"
value="{% trans "Run Diagnostics" %}"/>
</form>

View File

@ -18,16 +18,18 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h2>Diagnostic Results</h2>
<h2>{% trans "Diagnostic Results" %}</h2>
<h3>Module: {{ module_name }}</h3>
<h3>{% blocktrans %}Module: {{ module_name }}{% endblocktrans %}</h3>
{% if results %}
{% include "diagnostics_results.html" with results=results %}
{% else %}
<p>This module does not support diagnostics</p>
{% endif %}
{% if results %}
{% include "diagnostics_results.html" with results=results %}
{% else %}
<p>{% trans "This module does not support diagnostics" %}</p>
{% endif %}
{% endblock %}

View File

@ -17,31 +17,33 @@
#
{% endcomment %}
{% load i18n %}
<div class="row">
<div class="col-sm-5">
<table class="table table-bordered table-striped diagnostics-results">
<thead>
<tr>
<th class="diagnostic-test">Test</th>
<th class="diagnostics-result">Result</th>
<th class="diagnostic-test">{% trans "Test" %}</th>
<th class="diagnostics-result">{% trans "Result" %}</th>
</tr>
</thead>
<tbody>
{% for test, result in results %}
<tr>
<td>{{ test }}</td>
<td>
{% if result == 'passed' %}
<span class="label label-success">{{ result }}</span>
{% elif result == 'failed' %}
<span class="label label-danger">{{ result }}</span>
{% elif result == 'error' %}
<span class="label label-warning">{{ result }}</span>
{% else %}
{{ result }}
{% endif %}
</td>
</tr>
<tr>
<td>{{ test }}</td>
<td>
{% if result == 'passed' %}
<span class="label label-success">{{ result }}</span>
{% elif result == 'failed' %}
<span class="label label-danger">{{ result }}</span>
{% elif result == 'error' %}
<span class="label label-warning">{{ result }}</span>
{% else %}
{{ result }}
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>

View File

@ -18,29 +18,50 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h2>DynamicDNS client</h2>
<p>If your internet provider changes your IP address periodic (i.e. every 24h)
it may be hard for others to find you in the WEB. And for this reason nobody
may find the services which are provided by FreedomBox (like your ownCloud).
</br> </br>
The solution is to assign a DNS name to your IP address and update the DNS
name every time your IP is changed by your Internet provider. Dynamic DNS
allows you to push your current public IP address to an
<a href='http://gnudip2.sourceforge.net/' target='_blank'> gnudip </a>
server. Afterwards the Server will assign your DNS name with the new IP
and if someone from the internet asks for your DNS name he will get your
current IP answered.
</br> </br>
If you are looking for a free dynamic DNS account, you may find a free
GnuDIP service at <a href='http://gnudip.datasystems24.net'
target='_blank'>gnudip.datasystems24.net</a> or you may find free update
URL based services on
<a href='http://freedns.afraid.org/' target='_blank'>
freedns.afraid.org</a>
</br> </br>
If your freedombox is connected behind some NAT router, don't forget
to add portforwarding (i.e. forward some standard ports like 80 and 443)
to your freedombox device.
</p>
<h2>{% trans "DynamicDNS client" %}</h2>
<p>
{% blocktrans trimmed %}
If your internet provider changes your IP address periodic
(i.e. every 24h) it may be hard for others to find you in the
WEB. And for this reason nobody may find the services which are
provided by FreedomBox (like your ownCloud).
{% endblocktrans %}
</p>
<p>
{% blocktrans trimmed %}
The solution is to assign a DNS name to your IP address and
update the DNS name every time your IP is changed by your
Internet provider. Dynamic DNS allows you to push your current
public IP address to an
<a href='http://gnudip2.sourceforge.net/' target='_blank'> gnudip </a>
server. Afterwards the Server will assign your DNS name with the
new IP and if someone from the internet asks for your DNS name
he will get your current IP answered.
{% endblocktrans %}
</p>
<p>
{% blocktrans trimmed %}
If you are looking for a free dynamic DNS account, you may find
a free GnuDIP service at <a href='http://gnudip.datasystems24.net'
target='_blank'>gnudip.datasystems24.net</a> or you may find
free update URL based services on
<a href='http://freedns.afraid.org/' target='_blank'>
freedns.afraid.org</a>
{% endblocktrans %}
</p>
<p>
{% blocktrans trimmed %}
If your freedombox is connected behind some NAT router, don't forget
to add portforwarding (i.e. forward some standard ports like 80 and 443)
to your freedombox device.
{% endblocktrans %}
</p>
{% endblock %}

View File

@ -19,22 +19,25 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<form class="form" method="post">
{% csrf_token %}
<noscript>
You have disabled Javascript. Dynamic form mode is disabled and
some helper functions may not work <br>
(but the main functionality should work)
<br><hr>
{% blocktrans trimmed %}
You have disabled Javascript. Dynamic form mode is disabled
and some helper functions may not work (but the main
functionality should work).
{% endblocktrans %}
</noscript>
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Update setup"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -18,25 +18,35 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h3>{% trans "NAT type" %}</h3>
<p>
<h3>NAT type</h3>
{% if nat_unchecked %}
NAT type not detected yet, if you do not provide a "IP check URL" we will
not detect a NAT type.
{% else %}
{% if no_nat %}
Direct connection to the internet.
{% if nat_unchecked %}
{% blocktrans trimmed %}
NAT type not detected yet, if you do not provide a "IP check
URL" we will not detect a NAT type.
{% endblocktrans %}
{% else %}
Behind NAT, this means that dynamic DNS service will poll the
"IP check URL" for changes (we need the "IP check URL" for this reason
- otherwise we will not detect IP changes).
It may take up to {{ timer }} minutes until we update your DNS entry in
case of WAN IP change.
{% if no_nat %}
{% trans "Direct connection to the internet." %}
{% else %}
{% blocktrans trimmed %}
Behind NAT, this means that dynamic DNS service will poll
the "IP check URL" for changes (we need the "IP check URL"
for this reason - otherwise we will not detect IP changes).
It may take up to {{ timer }} minutes until we update your
DNS entry in case of WAN IP change.
{% endblocktrans %}
{% endif %}
{% endif %}
{% endif %}
<h3>Last update</h3>
{{ last_update }}
</p>
<h3>{% trans "Last update" %}</h3>
<p>{{ last_update }}</p>
{% endblock %}

View File

@ -18,77 +18,96 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h2>{{ title }}</h2>
<h2>{{ title }}</h2>
<p>Firewall is a network security system that controls the incoming
and outgoing network traffic on your {{ cfg.box_name }}. Keeping a
firewall enabled and properly configured reduces risk of security
threat from the Internet.</p>
<p>
{% blocktrans trimmed %}
Firewall is a network security system that controls the incoming
and outgoing network traffic on your {{ cfg.box_name }}. Keeping
a firewall enabled and properly configured reduces risk of
security threat from the Internet.
{% endblocktrans %}
</p>
<p>The following is the current status:</p>
<p>{% trans "The following is the current status:" %}</p>
{% if firewall_status = 'not_running' %}
{% if firewall_status = 'not_running' %}
<p>Firewall daemon is not running. Please run it. Firewall comes
enabled by default on {{ cfg.box_name }}. On any Debian based system
(such as {{ cfg.box_name }}) you may run it using the command 'service
firewalld start' or in case of a system with systemd 'systemctl start
firewalld'</p>
<p>
{% blocktrans trimmed %}
Firewall daemon is not running. Please run it. Firewall comes
enabled by default on {{ cfg.box_name }}. On any Debian based
system (such as {{ cfg.box_name }}) you may run it using the
command 'service firewalld start' or in case of a system with
systemd 'systemctl start firewalld'
{% endblocktrans %}
</p>
{% else %}
{% else %}
<div class="row">
<div class="col-sm-8">
<table class='table table-autowidth table-striped'>
<thead>
<th>Service/Port</th>
<th>Status</th>
</thead>
<div class="row">
<div class="col-sm-8">
<table class='table table-autowidth table-striped'>
<thead>
<th>{% trans "Service/Port" %}</th>
<th>{% trans "Status" %}</th>
</thead>
<tbody>
{% for service in services %}
<tr>
<td><strong>{{ service.name }}</strong></td>
<td>
{% if service.is_enabled %}
<span class='label label-success'>Enabled</span>
{% else %}
<span class='label label-warning'>Disabled</span>
{% endif %}
</td>
</tr>
<tbody>
{% for service in services %}
<tr>
<td><strong>{{ service.name }}</strong></td>
<td>
{% if service.is_enabled %}
<span class='label label-success'>
{% trans "Enabled" %}</span>
{% else %}
<span class='label label-warning'>
{% trans "Disabled" %}</span>
{% endif %}
</td>
</tr>
{% for port in service.ports %}
<tr>
<td class='cell-indented'><em>{{ port }}</em></td>
<td>
{% if port in internal_enabled_services and port in external_enabled_services %}
<span class='label label-success'>Permitted</span>
{% elif port in internal_enabled_services %}
<span class='label label-warning'>Permitted (internal only)</span>
{% elif port in external_enabled_services %}
<span class='label label-warning'>Permitted (external only)</span>
{% else %}
<span class='label label-danger'>Blocked</span>
{% endif %}
</td>
</tr>
{% endfor %}
{% for port in service.ports %}
<tr>
<td class='cell-indented'><em>{{ port }}</em></td>
<td>
{% if port in internal_enabled_services and port in external_enabled_services %}
<span class='label label-success'>
{% trans "Permitted" %}</span>
{% elif port in internal_enabled_services %}
<span class='label label-warning'>
{% trans "Permitted (internal only)" %}</span>
{% elif port in external_enabled_services %}
<span class='label label-warning'>
{% trans "Permitted (external only)" %}</span>
{% else %}
<span class='label label-danger'>
{% trans "Blocked" %}</span>
{% endif %}
</td>
</tr>
{% endfor %}
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endfor %}
<p>
<em>
{% blocktrans trimmed %}
The operation of the firewall is automatic. When you enable
a service it is automatically permitted in the firewall and
you disable a service is automatically disabled in the firewall.
{% endblocktrans %}
</em>
</p>
</tbody>
</table>
</div>
</div>
<p><em>The operation of the firewall is automatic. When you enable a
service it is automatically permitted in the firewall and you disable
a service is automatically disabled in the firewall.</em></p>
{% endif %}
{% endif %}
{% endblock %}

View File

@ -18,8 +18,9 @@
#
{% endcomment %}
{% load static %}
{% load bootstrap %}
{% load i18n %}
{% load static %}
{% block page_head %}
<style type="text/css">
@ -46,14 +47,18 @@
</p>
<h3 class="text-center">
Congratulations! Your FreedomBox is up and running!
{% trans "Congratulations! Your FreedomBox is up and running!" %}
</h3>
<p class="text-center">Please provide the following basic
information to complete the setup process.</p>
<p class="text-center">
{% blocktrans trimmed %}
Please provide the following basic information to complete the
setup process.
{% endblocktrans %}
</p>
<p class="text-center">
<a href="{% url 'first_boot:state1' %}"
class="btn btn-primary btn-large">Next</a>
class="btn btn-primary btn-large">{% trans "Next" %}</a>
</p>
{% endblock %}

View File

@ -18,8 +18,9 @@
#
{% endcomment %}
{% load static %}
{% load bootstrap %}
{% load i18n %}
{% load static %}
{% block add_nav_and_login %}
<ul class="nav navbar-nav navbar-right">
@ -35,17 +36,24 @@
<div class="col-md-6 col-md-offset-3">
{% include 'messages.html' %}
<h2>Administrator Account</h2>
<h2>{% trans "Administrator Account" %}</h2>
<p>Choose a username and password to access this web interface.
The password can be changed and other users can be added
later. An LDAP user with administrative privileges (sudo) is
also created.</p>
<p>
{% blocktrans trimmed %}
Choose a username and password to access this web interface.
The password can be changed and other users can be added
later. An LDAP user with administrative privileges (sudo) is
also created.
{% endblocktrans %}
</p>
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Box it up!"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Box it up!" %}"/>
</form>
</div>

View File

@ -19,34 +19,44 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content_row %}
<div class="col-lg-6 col-lg-offset-3">
{% include 'messages.html' %}
<h2>Setup Complete!</h2>
<h2>{% trans "Setup Complete!" %}</h2>
<p>FreedomBox setup is now complete. However, you should check
the network setup and modify it if necessary. Do not forget to
change the default Wi-Fi passwords.</p>
<p>
{% blocktrans trimmed %}
FreedomBox setup is now complete. However, you should check
the network setup and modify it if necessary. Do not forget
to change the default Wi-Fi passwords.
{% endblocktrans %}
</p>
<p>To make your FreedomBox functional, you need some applications.
Applications will be installed the first time you access them.</p>
<p>
{% blocktrans trimmed %}
To make your FreedomBox functional, you need some
applications. Applications will be installed the first time
you access them.
{% endblocktrans %}
</p>
<h3>Network Configuration</h3>
<h3>{% trans "Network Configuration" %}</h3>
{% include "connections_diagram.html" %}
<div class="row">
<div class="col-xs-6 text-center">
<a class="btn btn-lg btn-primary" href="{% url 'networks:index' %}">
Go to Networks</a>
{% trans "Go to Networks" %}</a>
</div>
<div class="col-xs-6 text-center">
<a class="btn btn-lg btn-primary" href="{% url 'apps:index' %}">
Go to Apps</a>
{% trans "Go to Apps" %}</a>
</div>
</div>
</div>

View File

@ -19,41 +19,62 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<img src="{% static 'theme/img/freedombox-logo-250px.png' %}"
class="main-graphic" />
<img src="{% static 'theme/img/freedombox-logo-250px.png' %}"
class="main-graphic" />
<p>FreedomBox is a community project to develop, design and promote
personal servers running free software for private, personal
communications. It is a networking appliance designed to allow
interfacing with the rest of the Internet under conditions of
protected privacy and data security. It hosts applications such as
blog, wiki, website, social network, email, web proxy and a Tor relay
on a device that can replace your Wi-Fi router so that your data stays
with you.</p>
<p>
{% blocktrans trimmed %}
FreedomBox is a community project to develop, design and promote
personal servers running free software for private, personal
communications. It is a networking appliance designed to allow
interfacing with the rest of the Internet under conditions of
protected privacy and data security. It hosts applications such
as blog, wiki, website, social network, email, web proxy and a
Tor relay on a device that can replace your Wi-Fi router so that
your data stays with you.
{% endblocktrans %}
</p>
<p>We live in a world where our use of the network is mediated by
those who often do not have our best interests at heart. By building
software that does not rely on a central service, we can regain
control and privacy. By keeping our data in our homes, we gain useful
legal protections over it. By giving back power to the users over
their networks and machines, we are returning the Internet to its
intended peer-to-peer architecture.</p>
<p>
{% blocktrans trimmed %}
We live in a world where our use of the network is mediated by
those who often do not have our best interests at heart. By
building software that does not rely on a central service, we
can regain control and privacy. By keeping our data in our
homes, we gain useful legal protections over it. By giving back
power to the users over their networks and machines, we are
returning the Internet to its intended peer-to-peer
architecture.
{% endblocktrans %}
</p>
<p>There are a number of projects working to realize a future of
distributed services; FreedomBox aims to bring them all together in a
convenient package.</p>
<p>
{% blocktrans trimmed %}
There are a number of projects working to realize a future of
distributed services; FreedomBox aims to bring them all together
in a convenient package.
{% endblocktrans %}
</p>
<p>For more information about the FreedomBox project, see the
<a href="https://wiki.debian.org/FreedomBox">FreedomBox Wiki</a>.</p>
<p>
{% blocktrans trimmed %}
For more information about the FreedomBox project, see the
<a href="https://wiki.debian.org/FreedomBox">FreedomBox Wiki</a>.
{% endblocktrans %}
</p>
<p><a class="btn btn-primary btn-lg"
href="https://wiki.debian.org/FreedomBox" target="_blank">Learn more
&raquo;</a></p>
<p><a class="btn btn-primary btn-lg"
href="https://wiki.debian.org/FreedomBox"
target="_blank">{% trans "Learn more &raquo;" %}</a></p>
<p style='margin-top:30px'>
You are running Plinth version {{ version }}.
</p>
<p style='margin-top:30px'>
{% blocktrans trimmed %}
You are running Plinth version {{ version }}.
{% endblocktrans %}
</p>
{% endblock %}

View File

@ -18,24 +18,42 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h2>Help</h2>
<h2>{% trans "Help" %}</h2>
<p>The <a href={% url 'help:manual' %}>FreedomBox Manual</a> is the
best place to start for information regarding {{ cfg.box_name }}.</p>
<p>
{% url 'help:manual' as manual_url %}
{% blocktrans trimmed %}
The <a href="{{ manual_url }}">FreedomBox Manual</a> is the
best place to start for information regarding {{ cfg.box_name }}.
{% endblocktrans %}
</p>
<p><a href="http://wiki.debian.org/FreedomBox"
target="_blank">FreedomBox project wiki </a> contains further
information.</p>
<p>
{% blocktrans trimmed %}
<a href="http://wiki.debian.org/FreedomBox" target="_blank">
FreedomBox project wiki </a> contains further information.
{% endblocktrans %}
</p>
<p>To seek help from FreedomBox community, queries may be posted on
the
<a href="https://lists.alioth.debian.org/mailman/listinfo/freedombox-discuss">
mailing list</a>. The list archives also contain information about
problems faced by other users and possible solutions.</p>
<p>
{% blocktrans trimmed %}
To seek help from FreedomBox community, queries may be posted on
the
<a href="https://lists.alioth.debian.org/mailman/listinfo/freedombox-discuss">
mailing list</a>. The list archives also contain information
about problems faced by other users and possible solutions.
{% endblocktrans %}
</p>
<p>Many FreedomBox contributors and users are also available on the
#freedombox channel of the irc.oftc.net IRC network.</p>
<p>
{% blocktrans trimmed %}
Many FreedomBox contributors and users are also available on the
#freedombox channel of the irc.oftc.net IRC network.
{% endblocktrans %}
</p>
{% endblock %}

View File

@ -18,6 +18,8 @@
#
{% endcomment %}
{% load i18n %}
{% block page_head %}
<style type="text/css">
dd {
@ -29,4 +31,3 @@
{% block content %}
{{ content|safe }}
{% endblock %}

View File

@ -19,22 +19,28 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<p>When enabled, the blogs and wikis will be available
from <a href="/ikiwiki">/ikiwiki</a>.</p>
<p>
{% blocktrans trimmed %}
When enabled, the blogs and wikis will be available
from <a href="/ikiwiki">/ikiwiki</a>.
{% endblocktrans %}
</p>
{% include "diagnostics_button.html" with module="ikiwiki" %}
<h3>Configuration</h3>
<h3>{% trans "Configuration" %}</h3>
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Update setup"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -19,15 +19,17 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<form class="form" method="post">
{% csrf_token %}
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -19,23 +19,31 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h3>Delete Wiki/Blog <em>{{ name }}</em></h3>
<h3>
{% blocktrans trimmed %}
Delete Wiki/Blog <em>{{ name }}</em>
{% endblocktrans %}
</h3>
<p>This action will remove all the posts, pages and comments
including revision history. Delete this wiki/blog
permanently?</p>
<p>
{% blocktrans trimmed %}
This action will remove all the posts, pages and comments
including revision history. Delete this wiki/blog permanently?
{% endblocktrans %}
</p>
<form class="form" method="post">
{% csrf_token %}
<input type="submit" class="btn btn-md btn-primary"
value="Delete {{ name }}"/>
value="{% blocktrans %}Delete {{ name }}{% endblocktrans %}"/>
<a href="{% url 'ikiwiki:manage' %}" role="button"
class="btn btn-md btn-primary">Cancel</a>
class="btn btn-md btn-primary">{% trans "Cancel" %}</a>
</form>
{% endblock %}

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block page_head %}
<style type="text/css">
@ -37,28 +38,29 @@
<div class="row">
<div class="col-sm-6">
{% if not sites %}
<p>No wikis or blogs available.</p>
<p>{% trans "No wikis or blogs available." %}</p>
<p>
<a class="btn btn-primary btn-md"
href="{% url 'ikiwiki:create' %}">Create a Wiki or Blog</a>
href="{% url 'ikiwiki:create' %}">
{% trans "Create a Wiki or Blog" %}
</a>
</p>
{% else %}
<div class="list-group">
{% for site in sites %}
<div class="list-group-item clearfix">
<a href="{% url 'ikiwiki:delete' site %}"
<a href="{% url 'ikiwiki:delete' site %}"
class="btn btn-default btn-sm pull-right"
role="button" title="Delete site {{ site }}">
role="button"
title="{% blocktrans %}Delete site {{ site }}{% endblocktrans %}">
<span class="glyphicon glyphicon-trash"
aria-hidden="true"></span>
</a>
<a class="wiki-label"
href="/ikiwiki/{{ site }}"
title="Go to site {{ site }}">
<a class="wiki-label" href="/ikiwiki/{{ site }}"
title="{% blocktrans %}Go to site {{ site }}{% endblocktrans %}">
{{ site }}
</a>
</div>
{% endfor %}
</div>

View File

@ -19,39 +19,52 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>Voice Chat (Mumble)</h2>
<h2>{% trans "Voice Chat (Mumble)" %}</h2>
<p>Mumble is an open source, low-latency, encrypted, high quality voice chat
software.</p>
<p>
{% blocktrans trimmed %}
Mumble is an open source, low-latency, encrypted, high quality
voice chat software.
{% endblocktrans %}
</p>
<p>You can connect to your Mumble server on the regular Mumble port 64738.
<a href="http://mumble.info">Clients</a> to connect to Mumble from your
desktop and Android devices are available.</p>
<p>
{% blocktrans trimmed %}
You can connect to your Mumble server on the regular Mumble port 64738.
<a href="http://mumble.info">Clients</a> to connect to Mumble
from your desktop and Android devices are available.
{% endblocktrans %}
</p>
<h3>Status</h3>
<h3>{% trans "Status" %}</h3>
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span> Mumble server is running
{% else %}
<span class="running-status inactive"></span> Mumble server is not running
{% endif %}
</p>
{% include "diagnostics_button.html" with module="mumble" %}
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span>
{% trans "Mumble server is running" %}
{% else %}
<span class="running-status inactive"></span>
{% trans "Mumble server is not running" %}
{% endif %}
</p>
{% include "diagnostics_button.html" with module="mumble" %}
<h3>Configuration</h3>
<h3>{% trans "Configuration" %}</h3>
<form class="form" method="post">
{% csrf_token %}
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -18,6 +18,10 @@
#
# ToDo: if connection is disabled, no information are visible anymore (Bug)
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block page_head %}
<style type="text/css">
.list-group-item .btn {
@ -28,123 +32,131 @@
}
</style>
{% endblock %}
{% load bootstrap %}
{% block content %}
<div class="row">
<div class="col-sm-8">
<div>
<a href="{% url 'networks:edit' connection.uuid %}"
class="btn btn-primary" role="button"
title="Edit connection">Edit</a>
title="{% trans "Edit connection" %}">{% trans "Edit" %}</a>
{% if active_connection %}
<form class="form form-inline" method="post"
action="{% url 'networks:deactivate' connection.uuid %}">
{% csrf_token %}
<button class="btn btn-default" type="submit">Deactivate</button>
<button class="btn btn-default" type="submit">
{% trans "Deactivate" %}</button>
</form>
{% else %}
<form class="form form-inline" method="post"
action="{% url 'networks:activate' connection.uuid %}">
{% csrf_token %}
<button class="btn btn-default" type="submit">Activate</button>
<button class="btn btn-default" type="submit">
{% trans "Activate" %}</button>
</form>
{% endif %}
<a href="{% url 'networks:delete' connection.uuid %}"
class="btn btn-default" role="button"
title="Delete connection">Delete</a>
title="{% trans "Delete connection" %}">{% trans "Delete" %}</a>
</div>
<h3>Connection</h3>
<h3>{% trans "Connection" %}</h3>
<div class="list-group">
{% if connection.primary %}
<div class="list-group-item">
Primary connection
{% trans "Primary connection" %}
<div class="pull-right">
<span class="label label-success">yes</span>
<span class="label label-success">{% trans "yes" %}</span>
</div>
</div>
{% endif %}
<div class="list-group-item">
Name
{% trans "Name" %}
<div class="pull-right">{{ connection.id }}</div>
</div>
</div>
{% if device %}
<h3>Device</h3>
<h3>{% trans "Device" %}</h3>
<div class="list-group">
<div class="list-group-item">
State
{% trans "State" %}
<span class="pull-right">{{ device.state }}</span>
</div>
{% if device.state_reason != 'none' %}
<div class="list-group-item">
State reason
{% trans "State reason" %}
<span class="pull-right">{{ device.state_reason }}</span>
</div>
{% endif %}
<div class="list-group-item">
Type
{% trans "Type" %}
<span class="pull-right">{{ device.type }}</span>
</div>
<div class="list-group-item">
MAC address
{% trans "MAC address" %}
<span class="pull-right">{{ device.hw_address }}</span>
</div>
<div class="list-group-item">
Interface
{% trans "Interface" %}
<span class="pull-right">{{ device.interface_name }}</span>
</div>
<div class="list-group-item">
Description
{% trans "Description" %}
<span class="pull-right">{{ device.description }}</span>
</div>
</div>
{% endif %}
<h3>Physical Link</h3>
<h3>{% trans "Physical Link" %}</h3>
<div class="list-group">
{% if device.ethernet %}
<div class="list-group-item">
Link state
{% trans "Link state" %}
<div class="pull-right">
{% if device.ethernet.carrier %}
<span class='label label-success'>cable is connected</span>
<span class='label label-success'>
{% trans "cable is connected" %}</span>
{% else %}
<span class='label label-warning'>please check cable</span>
<span class='label label-warning'>
{% trans "please check cable" %}</span>
{% endif %}
</div>
</div>
<div class="list-group-item">
Speed
<span class="pull-right">{{ device.ethernet.speed }} Mbit/s</span>
{% trans "Speed" %}
<span class="pull-right">
{% blocktrans %}{{ device.ethernet.speed }} Mbit/s{% endblocktrans %}
</span>
</div>
{% endif %}
{% if connection.type == "802-11-wireless" %}
<div class="list-group-item">
SSID
{% trans "SSID" %}
<span class="pull-right">{{ connection.wireless.ssid }}</span>
</div>
{% if device %}
<div class="list-group-item">
Speed
<span class="pull-right">{{ device.wireless.bitrate }} Mbit/s</span>
{% trans "Speed" %}
<span class="pull-right">
{% blocktrans %}{{ device.wireless.bitrate }} Mbit/s{% endblocktrans %}
</span>
</div>
<div class="list-group-item">
Mode
{% trans "Mode" %}
<span class="pull-right">{{ device.wireless.mode }}</span>
</div>
{% endif %}
{% if access_point.channel %}
<div class="list-group-item">
Signal strength
{% trans "Signal strength" %}
<div class="pull-right">
<span class="btn btn-primary btn-xs">
{{ access_point.strength }}%
@ -154,7 +166,7 @@
{% endif %}
{% if access_point.channel %}
<div class="list-group-item">
Channel
{% trans "Channel" %}
<span class="pull-right">{{ access_point.channel }}</span>
</div>
{% endif %}
@ -162,19 +174,19 @@
</div>
{% if active_connection %}
<h3>IPv4</h3>
<h3>{% trans "IPv4" %}</h3>
<div class="list-group">
{% if connection.ipv4.method %}
<div class="list-group-item">
Method
{% trans "Method" %}
<span class="pull-right">{{ connection.ipv4.method }}</span>
</div>
{% endif %}
{% for address in device.ip4.addresses %}
<div class="list-group-item">
IP address
{% trans "IP address" %}
<span class="pull-right">
{{ address.address }}/{{ address.prefix }}
</span>
@ -183,76 +195,76 @@
{% if device.ip4.gateway %}
<div class="list-group-item">
Gateway
{% trans "Gateway" %}
<span class="pull-right">{{ device.ip4.gateway }}</span>
</div>
{% endif %}
{% for server in device.ip4.nameservers %}
<div class="list-group-item">
DNS server
{% trans "DNS server" %}
<span class="pull-right">{{ server }}</span>
</div>
{% endfor %}
{% if active_connection.ip4.default %}
<div class="list-group-item">
Default
<span class="pull-right">yes</span>
{% trans "Default" %}
<span class="pull-right">{% trans "yes" %}</span>
</div>
{% endif %}
</div>
<h3>IPv6</h3>
<h3>{% trans "IPv6" %}</h3>
<div class="list-group">
{% if connection.ipv6.method %}
<div class="list-group-item">
Method
{% trans "Method" %}
<span class="pull-right">{{ connection.ipv6.method }}</span>
</div>
{% endif %}
{% for address in device.ip6.addresses %}
<div class="list-group-item">
IP address
{% trans "IP address" %}
<span class="pull-right">{{ address.address }}/{{ address.prefix }}</span>
</div>
{% endfor %}
{% if device.ip6.gateway %}
<div class="list-group-item">
Gateway
{% trans "Gateway" %}
<span class="pull-right">{{ device.ip6.gateway }}</span>
</div>
{% endif %}
{% for server in device.ip6.nameservers %}
<div class="list-group-item">
DNS server
{% trans "DNS server" %}
<span class="pull-right">{{ server }}</span>
</div>
{% endfor %}
{% if active_connection.ip6.default %}
<div class="list-group-item">
Default
<span class="pull-right">yes</span>
{% trans "Default" %}
<span class="pull-right">{% trans "yes" %}</span>
</div>
{% endif %}
</div>
{% else %}
<h3>Status</h3>
<h3>{% trans "Status" %}</h3>
<p>This connection is not active.</p>
<p>{% trans "This connection is not active." %}</p>
{% endif %}
<h3>Security</h3>
<h3>{% trans "Security" %}</h3>
{% if connection.zone == "internal" %}
<div class="list-group">
<div class="list-group-item">
Firewall zone
{% trans "Firewall zone" %}
<div class="pull-right">
<span class="label label-success">{{ connection.zone }}</span>
</div>
@ -261,15 +273,18 @@
<div class="alert alert-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
This interface should be connected to local network/machine. If you
connect this interface to a public network, services meant to
be available only internally will become available externally.
This is a security risk.
{% blocktrans trimmed %}
This interface should be connected to local
network/machine. If you connect this interface to a
public network, services meant to be available only
internally will become available externally. This is a
security risk.
{% endblocktrans %}
</div>
{% elif connection.zone == "external" %}
<div class="list-group">
<div class="list-group-item">
Firewall zone
{% trans "Firewall zone" %}
<div class="pull-right">
<span class="label label-warning">{{ connection.zone }}</span>
</div>
@ -278,14 +293,17 @@
<div class="alert alert-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
This interface should receive your Internet connection. If
you connect it your a local network/machine, many services
meant to available only internally will not be available.
{% blocktrans trimmed %}
This interface should receive your Internet connection.
If you connect it your a local network/machine, many
services meant to available only internally will not be
available.
{% endblocktrans %}
</div>
{% else %}
<div class="list-group">
<div class="list-group-item">
Firewall zone
{% trans "Firewall zone" %}
<div class="pull-right">
<span class="label label-danger">{{ connection.zone }}</span>
</div>
@ -294,10 +312,13 @@
<div class="alert alert-danger">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
This interface is not maintained by FreedomBox. Its security
status is unknown to FreedomBox. Many FreedomBox services may
not be available on this interface. It is recommended that
you deactivate/delete this connection and re-configure it.
{% blocktrans trimmed %}
This interface is not maintained by FreedomBox. Its
security status is unknown to FreedomBox. Many FreedomBox
services may not be available on this interface. It is
recommended that you deactivate/delete this connection and
re-configure it.
{% endblocktrans %}
</div>
{% endif %}
</div>

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
@ -29,8 +30,8 @@
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Create..."/>
<input type="submit" class="btn btn-primary"
value="{% trans "Create..." %}"/>
</form>
</div>
</div>

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
@ -29,8 +30,8 @@
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Create Connection"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Create Connection" %}"/>
</form>
</div>
</div>

View File

@ -19,12 +19,13 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h3>Delete Connection <em>{{ name }}</em></h3>
<h3>{% blocktrans %}Delete Connection <em>{{ name }}</em>{% endblocktrans %}</h3>
<p>Delete connection permanently?</p>
<p>{% trans "Delete connection permanently?" %}</p>
<form class="form" method="post">
{% csrf_token %}
@ -33,7 +34,7 @@
value="Delete {{ name }}"/>
<a href="{% url 'networks:index' %}" role="button"
class="btn btn-md btn-primary">Cancel</a>
class="btn btn-md btn-primary">{% trans "Cancel" %}</a>
</form>
{% endblock %}

View File

@ -18,6 +18,7 @@
{% endcomment %}
{% load static %}
{% load i18n %}
<style type="text/css">
.connection-diagram {
@ -61,28 +62,31 @@
<div class="row connection-diagram">
<div class="col-sm-2">
<img src="{% static 'theme/img/network-internet.svg' %}"
class="col-image network-entity" alt="Internet"/>
class="col-image network-entity" alt="{% trans "Internet" %}"/>
</div>
<div class="col-sm-3">
<img src="{% static 'theme/img/network-spacing.svg' %}"
class="col-image network-spacing hidden-xs" alt="Spacing"/>
class="col-image network-spacing hidden-xs"
alt="{% trans "Spacing" %}"/>
<img src="{% static 'theme/img/network-connection.svg' %}"
class="col-image network-connection hidden-xs" alt="Connection"/>
class="col-image network-connection hidden-xs"
alt="{% trans "Connection" %}"/>
<img src="{% static 'theme/img/network-connection-vertical.svg' %}"
class="network-connection-vertical visible-xs-block" alt="Connection"/>
class="network-connection-vertical visible-xs-block"
alt="{% trans "Connection" %}"/>
<div class="connection-list">
<p class="connection-list-heading">External</p>
<p class="connection-list-heading">{% trans "External" %}</p>
{% for connection in connections %}
{% if connection.interface_name and connection.is_active and connection.zone == 'external' %}
{% if connection.type == '802-3-ethernet' %}
<img src="{% static 'theme/img/network-ethernet.svg' %}"
class="network-type-icon" alt="Ethernet"/>
class="network-type-icon" alt="{% trans "Ethernet" %}"/>
{% elif connection.type == '802-11-wireless' %}
<img src="{% static 'theme/img/network-wireless.svg' %}"
class="network-type-icon" alt="Wi-Fi"/>
class="network-type-icon" alt="{% trans "Wi-Fi" %}"/>
{% endif %}
<a href="{% url 'networks:show' connection.uuid %}"
title="Show connection {{ connection.name }}">
title="{% blocktrans %}Show connection {{ connection.name }}{% endblocktrans %}">
{{ connection.name }} ({{ connection.interface_name }})</a>
{% endif %}
{% endfor %}
@ -90,37 +94,40 @@
</div>
<div class="col-sm-2">
<img src="{% static 'theme/img/network-freedombox.svg' %}"
class="col-image network-entity" alt="FreedomBox"/>
class="col-image network-entity" alt="{{ cfg.box_name }}"/>
</div>
<div class="col-sm-3">
<img src="{% static 'theme/img/network-spacing.svg' %}"
class="col-image network-spacing hidden-xs" alt="Spacing"/>
class="col-image network-spacing hidden-xs"
alt="{% trans "Spacing" %}"/>
<img src="{% static 'theme/img/network-connection.svg' %}"
class="col-image network-connection hidden-xs" alt="Connection"/>
class="col-image network-connection hidden-xs"
alt="{% trans "Connection" %}"/>
<div class="connection-list">
<p class="connection-list-heading">Internal</p>
<p class="connection-list-heading">{% trans "Internal" %}</p>
{% for connection in connections %}
{% if connection.interface_name and connection.is_active and connection.zone == 'internal' %}
<p>
{% if connection.type == '802-3-ethernet' %}
<img src="{% static 'theme/img/network-ethernet.svg' %}"
class="network-type-icon" alt="Ethernet"/>
class="network-type-icon" alt="{% trans "Ethernet" %}"/>
{% elif connection.type == '802-11-wireless' %}
<img src="{% static 'theme/img/network-wireless.svg' %}"
class="network-type-icon" alt="Wi-Fi"/>
class="network-type-icon" alt="{% trans "Wi-Fi" %}"/>
{% endif %}
<a href="{% url 'networks:show' connection.uuid %}"
title="Show connection {{ connection.name }}">
title="{% blocktrans %}Show connection {{ connection.name }}{% endblocktrans %}">
{{ connection.name }} ({{ connection.interface_name }})</a>
</p>
{% endif %}
{% endfor %}
</div>
<img src="{% static 'theme/img/network-connection-vertical.svg' %}"
class="network-connection-vertical visible-xs-block" alt="Connection"/>
class="network-connection-vertical visible-xs-block"
alt="{% trans "Connection" %}"/>
</div>
<div class="col-sm-2">
<img src="{% static 'theme/img/network-computer.svg' %}"
class="col-image network-entity" alt="Computer"/>
class="col-image network-entity" alt="{% trans "Computer" %}"/>
</div>
</div>

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
@ -29,8 +30,8 @@
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Edit Connection"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Edit Connection" %}"/>
</form>
</div>
</div>

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block page_head %}
<style type="text/css">
@ -62,7 +63,8 @@
<div class="list-group-item clearfix">
<a href="{% url 'networks:delete' connection.uuid %}"
class="btn btn-default btn-sm pull-right"
role="button" title="Delete connection {{ connection.name }}">
role="button"
title="{% blocktrans %}Delete connection {{ connection.name }}{% endblocktrans %}">
<span class="glyphicon glyphicon-trash"
aria-hidden="true"></span>
</a>
@ -73,7 +75,7 @@
{% csrf_token %}
<button type="submit" class="btn btn-default btn-sm">
Deactivate</button>
{% trans "Deactivate" %}</button>
</form>
{% else %}
<form class="form pull-right" method="post"
@ -81,16 +83,16 @@
{% csrf_token %}
<button type="submit" class="btn btn-default btn-sm">
Activate</button>
{% trans "Activate" %}</button>
</form>
{% endif %}
{% if connection.is_active %}
<span class="label label-success connection-status-label">
Active</span>
{% trans "Active" %}</span>
{% else %}
<span class="label label-warning connection-status-label">
Inactive</span>
{% trans "Inactive" %}</span>
{% endif %}
<a class="connection-show-label"

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
@ -29,8 +30,8 @@
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Create..."/>
<input type="submit" class="btn btn-primary"
value="{% trans "Create..." %}"/>
</form>
</div>
</div>

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
@ -26,19 +27,19 @@
<div class="col-sm-6">
<div class="list-group">
{% for access_point in access_points %}
<div class="list-group-item clearfix">
{% if access_point.ssid %}
<a display="inline-block" width="40%"
href="{% url 'networks:add_wifi' access_point.ssid access_point.interface_name %}">
{{ access_point.ssid }}
</a>
{% else %}
--
{% endif %}
<span class="btn btn-primary btn-xs pull-right">
{{ access_point.strength }}%
</span>
</div>
<div class="list-group-item clearfix">
{% if access_point.ssid %}
<a display="inline-block" width="40%"
href="{% url 'networks:add_wifi' access_point.ssid access_point.interface_name %}">
{{ access_point.ssid }}
</a>
{% else %}
--
{% endif %}
<span class="btn btn-primary btn-xs pull-right">
{{ access_point.strength }}%
</span>
</div>
{% endfor %}
</div>
</div>

View File

@ -19,7 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block page_head %}
@ -32,84 +32,111 @@
{% block content %}
<h2>Virtual Private Network (OpenVPN)</h2>
<h2>{% trans "Virtual Private Network (OpenVPN)" %}</h2>
<p>Virtual Private Network (VPN) is a technique for securely
connecting two machines in order to access resources of a private
network. While you are away from home, you can connect to your
{{ cfg.box_name }} in order to join your home network and access
private/internal services provided by {{ cfg.box_name }}. You can
also access the rest of the Internet via {{ cfg.box_name }} for
added security and anonymity.</p>
<p>
{% blocktrans trimmed %}
Virtual Private Network (VPN) is a technique for securely
connecting two machines in order to access resources of a
private network. While you are away from home, you can connect
to your {{ cfg.box_name }} in order to join your home network
and access private/internal services provided by
{{ cfg.box_name }}. You can also access the rest of the
Internet via {{ cfg.box_name }} for added security and
anonymity.
{% endblocktrans %}
</p>
{% if status.is_setup %}
<h3>Profile</h3>
<h3>{% trans "Profile" %}</h3>
<p>To connect to {{ cfg.box_name }}'s VPN, you need to download a
profile and feed it to an OpenVPN client on your mobile or
desktop machine. OpenVPN Clients are available for most
platforms. See
<a href="https://wiki.debian.org/FreedomBox/Manual/OpenVPN"
title="FreedomBox Manual - OpenVPN">documentation</a> on
recommended clients and instructions on how to configure them.</p>
<p>
{% blocktrans trimmed %}
To connect to {{ cfg.box_name }}'s VPN, you need to download a
profile and feed it to an OpenVPN client on your mobile or
desktop machine. OpenVPN Clients are available for most
platforms. See
<a href="https://wiki.debian.org/FreedomBox/Manual/OpenVPN"
title="FreedomBox Manual - OpenVPN">documentation</a> on
recommended clients and instructions on how to configure them.
{% endblocktrans %}
</p>
<p>Profile is specific to each user of {{ cfg.box_name }}. Keep
it a secret.</p>
<p>
{% blocktrans trimmed %}
Profile is specific to each user of {{ cfg.box_name }}. Keep
it a secret.
{% endblocktrans %}
</p>
<form class="form" method="post" action="{% url 'openvpn:profile' %}">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Download my profile"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Download my profile" %}"/>
</form>
{% endif %}
<h3>Status</h3>
<h3>{% trans "Status" %}</h3>
{% if not status.is_setup and not status.setup_running %}
<p>OpenVPN has not yet been setup. Performing a secure setup
takes a very long time. Depending on how fast your
{{ cfg.box_name }} is, it may even take hours. If the setup is
interrupted, you may start it again.</p>
<p>
{% blocktrans trimmed %}
OpenVPN has not yet been setup. Performing a secure setup
takes a very long time. Depending on how fast your
{{ cfg.box_name }} is, it may even take hours. If the setup
is interrupted, you may start it again.
{% endblocktrans %}
</p>
<form class="form" method="post" action="{% url 'openvpn:setup' %}">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Start setup"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Start setup" %}"/>
</form>
{% endif %}
{% if not status.is_setup and status.setup_running %}
<p class="running-status-parent">
<span class='running-status active'></span> OpenVPN setup is running
<span class='running-status active'></span>
{% trans "OpenVPN setup is running" %}
</p>
<p>To perform a secure setup, this process takes a very long time.
Depending on how fast your {{ cfg.box_name }} is, it may even
take hours. If the setup is interrupted, you may start it
again.</p>
<p>
{% blocktrans trimmed %}
To perform a secure setup, this process takes a very long
time. Depending on how fast your {{ cfg.box_name }} is, it
may even take hours. If the setup is interrupted, you may
start it again.
{% endblocktrans %}
</p>
{% endif %}
{% if status.is_setup %}
<p class="running-status-parent">
{% if status.is_running %}
<span class='running-status active'></span> OpenVPN server is running
<span class='running-status active'></span>
{% trans "OpenVPN server is running" %}
{% else %}
<span class='running-status inactive'></span> OpenVPN server is not running
<span class='running-status inactive'></span>
{% trans "OpenVPN server is not running" %}
{% endif %}
</p>
{% include "diagnostics_button.html" with module="openvpn" %}
<h3>Configuration</h3>
<h3>{% trans "Configuration" %}</h3>
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Update setup"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endif %}

View File

@ -19,34 +19,44 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>File Hosting (ownCloud)</h2>
<h2>{% trans "File Hosting (ownCloud)" %}</h2>
<p>ownCloud gives you universal access to your files through a web
interface or WebDAV. It also provides a platform to easily view &
sync your contacts, calendars and bookmarks across all your devices
and enables basic editing right on the web. Installation has minimal
server requirements, doesn't need special permissions and is
quick. ownCloud is extendable via a simple but powerful API for
applications and plugins.</p>
<p>
{% blocktrans trimmed %}
ownCloud gives you universal access to your files through a web
interface or WebDAV. It also provides a platform to easily view
& sync your contacts, calendars and bookmarks across all your
devices and enables basic editing right on the web. Installation
has minimal server requirements, doesn't need special
permissions and is quick. ownCloud is extendable via a simple
but powerful API for applications and plugins.
{% endblocktrans %}
</p>
<p>When enabled, the ownCloud installation will be available
from <a href="/owncloud">/owncloud</a> path on the web server.
Visit this URL to set up the initial administration account for
ownCloud.</p>
<p>
{% blocktrans trimmed %}
When enabled, the ownCloud installation will be available
from <a href="/owncloud">/owncloud</a> path on the web server.
Visit this URL to set up the initial administration account for
ownCloud.
{% endblocktrans %}
</p>
{% include "diagnostics_button.html" with module="owncloud" %}
<h3>Configuration</h3>
<h3>{% trans "Configuration" %}</h3>
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary btn-md" value="Apply changes"/>
<input type="submit" class="btn btn-primary btn-md"
value="{% trans "Apply changes" %}"/>
</form>
{% endblock %}

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
@ -29,14 +30,15 @@
<div id='pagekite-post-enabled-form'
style='display: {{ form.enabled.value|yesno:'block,none' }};'>
<h3>PageKite Account</h3>
<h3>{% trans "PageKite Account" %}</h3>
{{ form.server_domain|bootstrap_horizontal }}
{{ form.server_port|bootstrap_horizontal }}
{{ form.kite_name|bootstrap_horizontal }}
{{ form.kite_secret|bootstrap_horizontal }}
</div>
<input type="submit" class="btn btn-primary" value="Save settings"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Save settings" %}"/>
</form>
{% endblock %}

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% load pagekite_extras %}
@ -40,31 +41,39 @@
{% block content %}
<div class="alert alert-warning" role="alert">
<b>Warning:</b><br>Your PageKite frontend server may not support all the
protocol/port combinations that you are able to define here. For example,
HTTPS on ports other than 443 is known to cause problems.
{% blocktrans trimmed %}
<b>Warning:</b><br>Your PageKite frontend server may not support
all the protocol/port combinations that you are able to define
here. For example, HTTPS on ports other than 443 is known to
cause problems.
{% endblocktrans %}
</div>
<div class="row custom-services">
<div class="col-lg-6">
<form class="form add-service" method="post">
<h4>Create a custom service</h4>
<h4>{% trans "Create a custom service" %}</h4>
{{ form|bootstrap_horizontal:'col-lg-6' }}
{% csrf_token %}
<div class="form-group">
<div class=" col-lg-offset-6 col-lg-6">
<input type="submit" class="btn btn-primary" value="Add Service"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Add Service" %}"/>
</div>
</div>
</form>
</div>
<div class="col-lg-5 col-lg-offset-1">
<h4>Existing custom services</h4>
<h4>{% trans "Existing custom services" %}</h4>
{% if not custom_services %}
<i>You don't have any Custom Services enabled</i>
<i>{% trans "You don't have any Custom Services enabled" %}</i>
{% endif %}
<div class="list-group">
{% for service in custom_services %}
{% create_pagekite_service_url service kite_name as service_url %}
@ -77,7 +86,9 @@
{{ service_url }}
{% endif %}
<br>
connected to {{ service.backend_host }}:{{ service.backend_port }}
{% blocktrans trimmed %}
connected to {{ service.backend_host }}:{{ service.backend_port }}
{% endblocktrans %}
</span>
</span>
<form class="form pull-right" method="post"
@ -87,7 +98,7 @@
{{ service.form.as_p }}
</div>
<button type="submit" class="btn btn-default"
title="Delete this service">
title="{% trans "Delete this service" %}">
<span class="glyphicon glyphicon-trash" aria-hidden="true">
</span>
</button>

View File

@ -18,38 +18,65 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<p>PageKite is a system for exposing {{ cfg.box_name }} services when
you don't have a direct connection to the Internet. You only need this
if your {{ cfg.box_name }} services are unreachable from the
rest of the Internet. This includes the following situations: </p>
<p>
{% blocktrans trimmed %}
PageKite is a system for exposing {{ cfg.box_name }} services
when you don't have a direct connection to the Internet. You
only need this if your {{ cfg.box_name }} services are
unreachable from the rest of the Internet. This includes the
following situations:
{% endblocktrans %}
</p>
<ul>
<li>{{ cfg.box_name }} is behind a restricted firewall.</li>
<ul>
<li>
{% blocktrans trimmed %}
{{ cfg.box_name }} is behind a restricted firewall.
{% endblocktrans %}
</li>
<li>{{ cfg.box_name }} is connected to a (wireless) router which you
don't control.</li>
<li>
{% blocktrans trimmed %}
{{ cfg.box_name }} is connected to a (wireless) router which
you don't control.
{% endblocktrans %}
</li>
<li>Your ISP does not provide you an external IP address and instead
provides Internet connection through NAT.</li>
<li>
{% blocktrans trimmed %}
Your ISP does not provide you an external IP address and
instead provides Internet connection through NAT.
{% endblocktrans %}
</li>
<li>Your ISP does not provide you a static IP address and your IP
address changes evertime you connect to Internet.</li>
<li>
{% blocktrans trimmed %}
Your ISP does not provide you a static IP address and your IP
address changes evertime you connect to Internet.
{% endblocktrans %}
</li>
<li>Your ISP limits incoming connections.</li>
</ul>
<li>{% trans "Your ISP limits incoming connections." %}</li>
</ul>
<p>PageKite works around NAT, firewalls and IP-address limitations by
using a combination of tunnels and reverse proxies. You can use any
pagekite service provider, for example
<a href="https://pagekite.net">pagekite.net</a>.
In future it might be possible to use your buddy's
{{ cfg.box_name }} for this.</p>
<p>
{% blocktrans trimmed %}
PageKite works around NAT, firewalls and IP-address limitations
by using a combination of tunnels and reverse proxies. You can
use any pagekite service provider, for example
<a href="https://pagekite.net">pagekite.net</a>. In future it
might be possible to use your buddy's {{ cfg.box_name }} for
this.
{% endblocktrans %}
</p>
<p>
<a class="btn btn-primary btn-md"
href="{% url 'pagekite:configure' %}">Configure PageKite</a>
</p>
<p>
<a class="btn btn-primary btn-md" href="{% url 'pagekite:configure' %}">
{% trans "Configure PageKite" %}</a>
</p>
{% endblock %}

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block page_head %}
<style type="text/css">
@ -35,9 +36,23 @@
{% block content %}
<div class="alert alert-warning" role="alert">
<b>Warning:</b><br>
<p>Published services are accessible and attackable from the evil internet.<p>
<p>Exposing SSH with the default password for 'fbx' is a VERY BAD idea.</p>
{% trans "<b>Warning:</b><br/>" %}
<p>
{% blocktrans trimmed %}
Published services are accessible and attackable from the evil
internet.
{% endblocktrans %}
</p>
<p>
{% blocktrans trimmed %}
Exposing SSH with the default password for 'fbx' is a VERY BAD
idea.
{% endblocktrans %}
</p>
</div>
<form class="form predefined" method="post">
@ -45,7 +60,9 @@
{{ form.https|bootstrap_horizontal:'col-lg-0' }}
{{ form.ssh|bootstrap_horizontal:'col-lg-0' }}
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Save Services"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Save Services" %}"/>
</form>
{% endblock %}

View File

@ -19,42 +19,55 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>Web Proxy (Privoxy)</h2>
<h2>{% trans "Web Proxy (Privoxy)" %}</h2>
<p>Privoxy is a non-caching web proxy with advanced filtering
capabilities for enhancing privacy, modifying web page data and HTTP
headers, controlling access, and removing ads and other obnoxious
Internet junk.</p>
<p>
{% blocktrans trimmed %}
Privoxy is a non-caching web proxy with advanced filtering
capabilities for enhancing privacy, modifying web page data and
HTTP headers, controlling access, and removing ads and other
obnoxious Internet junk.
{% endblocktrans %}
</p>
<p>You can use Privoxy by modifying your browser proxy settings to
your {{ cfg.box_name }} hostname (or IP address) with port 8118.
While using Privoxy, you can see its configuration details and
documentation
at <a href="http://config.privoxy.org">http://config.privoxy.org/</a>
or <a href="http://p.p">http://p.p</a></p>
<p>
{% blocktrans trimmed %}
You can use Privoxy by modifying your browser proxy settings to
your {{ cfg.box_name }} hostname (or IP address) with port 8118.
While using Privoxy, you can see its configuration details and
documentation at
<a href="http://config.privoxy.org">http://config.privoxy.org/</a>
or <a href="http://p.p">http://p.p</a>
{% endblocktrans %}
</p>
<h3>Status</h3>
<h3>{% trans "Status" %}</h3>
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span> Privoxy is running
{% else %}
<span class="running-status inactive"></span> Privoxy is not running
{% endif %}
</p>
{% include "diagnostics_button.html" with module="privoxy" %}
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span>
{% trans "Privoxy is running" %}
{% else %}
<span class="running-status inactive"></span>
{% trans "Privoxy is not running" %}
{% endif %}
</p>
<h3>Configuration</h3>
{% include "diagnostics_button.html" with module="privoxy" %}
<form class="form" method="post">
{% csrf_token %}
<h3>{% trans "Configuration" %}</h3>
{{ form|bootstrap }}
<form class="form" method="post">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -19,25 +19,37 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>reStore</h2>
<p>reStore is a server for <a href='https://unhosted.org/'>unhosted</a>
web applications. The idea is to uncouple web applications from the
data, and thus the data can be stored on any unhosted storage server.</p>
<h2>{% trans "reStore" %}</h2>
<p>You can create and edit accounts in the
<a href='/restore/'>reStore web-interface</a>.</p>
<p>
{% blocktrans trimmed %}
reStore is a server for <a href='https://unhosted.org/'>unhosted</a>
web applications. The idea is to uncouple web applications from
the data, and thus the data can be stored on any unhosted
storage server.
{% endblocktrans %}
</p>
<h3>Configuration</h3>
<p>
{% blocktrans trimmed %}
You can create and edit accounts in the
<a href='/restore/'>reStore web-interface</a>.
{% endblocktrans %}
</p>
<form class="form" method="post">
{% csrf_token %}
<h3>Configuration</h3>
{{ form|bootstrap }}
<form class="form" method="post">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -19,40 +19,55 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>Email Client (Roundcube)</h2>
<h2>{% trans "Email Client (Roundcube)" %}</h2>
<p>Roundcube webmail is a browser-based multilingual IMAP client with
an application-like user interface. It provides full functionality
you expect from an email client, including MIME support, address
book, folder manipulation, message searching and spell checking.</p>
<p>
{% blocktrans trimmed %}
Roundcube webmail is a browser-based multilingual IMAP client
with an application-like user interface. It provides full
functionality you expect from an email client, including MIME
support, address book, folder manipulation, message searching
and spell checking.
{% endblocktrans %}
</p>
<p>You can access Roundcube from <a href="/roundcube">/roundcube</a>.
Provide the username and password of the email account you wish to
access followed by the domain name of the IMAP server for your email
provider, like <code>imap.example.com</code>. For IMAP over SSL
(recommended), fill the server field
like <code>imaps://imap.example.com</code>.</p>
<p>
{% blocktrans trimmed %}
You can access Roundcube from <a href="/roundcube">/roundcube</a>.
Provide the username and password of the email account you wish
to access followed by the domain name of the IMAP server for
your email provider, like <code>imap.example.com</code>. For
IMAP over SSL (recommended), fill the server field like
<code>imaps://imap.example.com</code>.
{% endblocktrans %}
</p>
<p>For Gmail, username will be your Gmail address, password will be
your Google account password and server will be
<code>imaps://imap.gmail.com</code>. Note that you will also need
to enable "Less secure apps" in your Google account settings
(<a href="https://www.google.com/settings/security/lesssecureapps"
>https://www.google.com/settings/security/lesssecureapps</a>).</p>
<p>
{% blocktrans trimmed %}
For Gmail, username will be your Gmail address, password will be
your Google account password and server will be
<code>imaps://imap.gmail.com</code>. Note that you will also need
to enable "Less secure apps" in your Google account settings
(<a href="https://www.google.com/settings/security/lesssecureapps"
>https://www.google.com/settings/security/lesssecureapps</a>).
{% endblocktrans %}
</p>
{% include "diagnostics_button.html" with module="roundcube" %}
{% include "diagnostics_button.html" with module="roundcube" %}
<h3>Configuration</h3>
<h3>{% trans "Configuration" %}</h3>
<form class="form" method="post">
{% csrf_token %}
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -19,25 +19,33 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>Bookmarks (Shaarli)</h2>
<h2>{% trans "Bookmarks (Shaarli)" %}</h2>
<p>Shaarli allows you to save and share bookmarks.</p>
<p>{% trans "Shaarli allows you to save and share bookmarks." %}</p>
<p>When enabled, Shaarli will be available from <a href="/shaarli">/shaarli</a>
path on the web server. Note that Shaarli only supports a single user
account, which you will need to setup on the initial visit.<p>
<p>
{% blocktrans trimmed %}
<h3>Configuration</h3>
When enabled, Shaarli will be available from <a href="/shaarli">/shaarli</a>
path on the web server. Note that Shaarli only supports a single
user account, which you will need to setup on the initial visit.
<form class="form" method="post">
{% csrf_token %}
{% endblocktrans %}
</p>
{{ form|bootstrap }}
<h3>{% trans "Configuration" %}</h3>
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -18,13 +18,24 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h2>System Configuration</h2>
<h2>{% trans "System Configuration" %}</h2>
<p>Here you can administrate the underlying system of your {{ cfg.box_name }}.
</p>
<p>The options affect the {{ cfg.box_name }} at its most
general level, so be careful!</p>
<p>
{% blocktrans trimmed %}
Here you can administrate the underlying system of your
{{ cfg.box_name }}.
{% endblocktrans %}
</p>
<p>
{% blocktrans trimmed %}
The options affect the {{ cfg.box_name }} at its most general
level, so be careful!
{% endblocktrans %}
</p>
{% endblock %}

View File

@ -19,91 +19,109 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>Anonymity Network (Tor)</h2>
<h2>{% trans "Anonymity Network (Tor)" %}</h2>
<p>Tor is an anonymous communication system. You can learn more about
it from the <a href="https://www.torproject.org/">Tor Project</a>
website. For best protection when web surfing, the Tor Project
recommends that you use
the <a href="https://www.torproject.org/download/download-easy.html.en">
Tor Browser</a>.</p>
<p>
{% blocktrans trimmed %}
Tor is an anonymous communication system. You can learn more
about it from the <a href="https://www.torproject.org/">Tor
Project</a> website. For best protection when web surfing, the
Tor Project recommends that you use the
<a href="https://www.torproject.org/download/download-easy.html.en">
Tor Browser</a>.
{% endblocktrans %}
</p>
<h3>Status</h3>
<h3>{% trans "Status" %}</h3>
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span> Tor is running
{% else %}
<span class="running-status inactive"></span> Tor is not running
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span>
{% trans "Tor is running" %}
{% else %}
<span class="running-status inactive"></span>
{% trans "Tor is not running" %}
{% endif %}
</p>
{% include "diagnostics_button.html" with module="tor" %}
{% if status.hs_enabled %}
<div class="row">
<div class="col-sm-3">
<table class="table table-bordered table-condensed table-striped">
<thead>
<tr>
<th>{% trans "Hidden Service" %}</th>
<th>{% trans "Port" %}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ status.hs_hostname }}</td>
<td>{{ status.hs_ports }}</td>
</tr>
</tbody>
</table>
</div>
</div>
{% endif %}
</p>
{% include "diagnostics_button.html" with module="tor" %}
{% if status.hs_enabled %}
<h3>{% trans "Configuration" %}</h3>
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary btn-md"
value="{% trans "Update setup" %}"/>
</form>
<h3>{% trans "Bridge" %}</h3>
<p>
{% blocktrans trimmed %}
Your {{ cfg.box_name }} is configured as a Tor bridge with
obfsproxy, so it can help circumvent censorship. If your {{
cfg.box_name }} is behind a router or firewall, you should make
sure the following ports are open, and port-forwarded, if
necessary:
{% endblocktrans %}
</p>
<div class="row">
<div class="col-sm-3">
<table class="table table-bordered table-condensed table-striped">
<thead>
<tr>
<th>Hidden Service</th>
<th>Port</th>
<th>{% trans "Service" %}</th>
<th>{% trans "Port" %}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ status.hs_hostname }}</td>
<td>{{ status.hs_ports }}</td>
</tr>
{% for name, port in status.ports.items %}
<tr>
<td>{{ name }}</td>
<td>{{ port }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endif %}
<h3>Configuration</h3>
<h3>{% trans "SOCKS" %}</h3>
<form class="form" method="post">
{% csrf_token %}
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary btn-md" value="Update setup"/>
</form>
<h3>Bridge</h3>
<p>Your {{ cfg.box_name }} is configured as a Tor bridge with obfsproxy, so it
can help circumvent censorship. If your {{ cfg.box_name }} is behind a router
or firewall, you should make sure the following ports are open, and
port-forwarded, if necessary:</p>
<div class="row">
<div class="col-sm-3">
<table class="table table-bordered table-condensed table-striped">
<thead>
<tr>
<th>Service</th>
<th>Port</th>
</tr>
</thead>
<tbody>
{% for name, port in status.ports.items %}
<tr>
<td>{{ name }}</td>
<td>{{ port }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<h3>SOCKS</h3>
<p>A Tor SOCKS port is available on your {{ cfg.box_name }} on TCP port
9050.</p>
<p>
{% blocktrans trimmed %}
A Tor SOCKS port is available on your {{ cfg.box_name }} on TCP port
9050.
{% endblocktrans %}
</p>
{% endblock %}

View File

@ -19,36 +19,49 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>Bittorrent (Transmission)</h2>
<h2>{% trans "Bittorrent (Transmission)" %}</h2>
<p>BitTorrent is a peer-to-peer file sharing protocol. Transmission
daemon handles Bitorrent file sharing. Note that BitTorrent is not
anonymous.</p>
<p>
{% blocktrans trimmed %}
BitTorrent is a peer-to-peer file sharing protocol.
Transmission daemon handles Bitorrent file sharing. Note that
BitTorrent is not anonymous.
{% endblocktrans %}
</p>
<p>Access the web interface at <a href="/transmission">/transmission</a></p>
<p>
{% blocktrans trimmed %}
Access the web interface at <a href="/transmission">/transmission</a>
{% endblocktrans %}
</p>
<h3>Status</h3>
<h3>{% trans "Status" %}</h3>
<p class="running-status-parent">
{% if status.is_running %}
<span class='running-status active'></span> Transmission daemon is running
{% else %}
<span class='running-status inactive'></span> Transmission daemon is not running
{% endif %}
</p>
{% include "diagnostics_button.html" with module="transmission" %}
<p class="running-status-parent">
{% if status.is_running %}
<span class='running-status active'></span>
{% trans "Transmission daemon is running" %}
{% else %}
<span class='running-status inactive'></span>
{% trans "Transmission daemon is not running" %}
{% endif %}
</p>
<h3>Configuration</h3>
{% include "diagnostics_button.html" with module="transmission" %}
<form class="form" method="post">
{% csrf_token %}
<h3>{% trans "Configuration" %}</h3>
{{ form|bootstrap }}
<form class="form" method="post">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -18,18 +18,25 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h2>{{ title }}</h2>
<h2>{{ title }}</h2>
<p>This will run unattended-upgrades, which will attempt to upgrade your system
with the latest Debian packages. It may take a few minutes to complete.</p>
<p>
{% blocktrans trimmed %}
This will run unattended-upgrades, which will attempt to upgrade
your system with the latest Debian packages. It may take a few
minutes to complete.
{% endblocktrans %}
</p>
<form class="form" method="post" action="{% url 'upgrades:run' %}">
{% csrf_token %}
<form class="form" method="post" action="{% url 'upgrades:run' %}">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Upgrade now &raquo;"/>
</form>
<input type="submit" class="btn btn-primary"
value="{% trans "Upgrade now &raquo;" %}"/>
</form>
{% endblock %}

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
@ -29,8 +30,8 @@
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary btn-md" value="Update setup"/>
<input type="submit" class="btn btn-primary btn-md"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -18,37 +18,42 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h2>{{title}}</h2>
<h2>{{title}}</h2>
{% if upgrades_error %}
<div class="alert alert-danger" role="alert">
There was an error while upgrading.
</div>
<h5>Output from unattended-upgrades:</h5>
<pre>{{ upgrades_error }}</pre>
{% endif %}
{% if upgrades_error %}
<div class="alert alert-danger" role="alert">
{% trans "There was an error while upgrading." %}
</div>
{% if upgrades_output %}
<div class="row">
<div class="col-lg-6">
<div class="alert alert-success" role="alert">
The operating system is up to date now. &nbsp;
<button type="button" class="btn btn-default show-details" style='display:none'>
Show Details
<div class="caret"></div>
</button>
<h5>{% trans "Output from unattended-upgrades:" %}</h5>
<pre>{{ upgrades_error }}</pre>
{% endif %}
{% if upgrades_output %}
<div class="row">
<div class="col-lg-6">
<div class="alert alert-success" role="alert">
{% trans "The operating system is up to date now. &nbsp;" %}
<button type="button" class="btn btn-default show-details"
style='display:none'>
{% trans "Show Details" %}
<div class="caret"></div>
</button>
</div>
</div>
</div>
</div>
<div class="details">
<h5>Output from unattended-upgrades:</h5>
<pre>{{ upgrades_output }}</pre>
</div>
<div class="details">
<h5>{% trans "Output from unattended-upgrades:" %}</h5>
<pre>{{ upgrades_output }}</pre>
</div>
{% endif %}
{% endif %}
{% endblock %}

View File

@ -19,10 +19,15 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h3>Change Password for <em>{{ form.user.username }}</em></h3>
<h3>
{% blocktrans trimmed %}
Change Password for <em>{{ form.user.username }}</em>
{% endblocktrans %}
</h3>
<div class="row">
<div class="col-sm-6">
@ -31,8 +36,8 @@
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Save Password"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Save Password" %}"/>
</form>
</div>
</div>

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block page_head %}
<style type="text/css">
@ -37,8 +38,8 @@
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Create User"/>
<input type="submit" class="btn btn-primary"
value="{%trans "Create User" %}"/>
</form>
</div>
</div>

View File

@ -19,21 +19,26 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h3>Delete User <em>{{ object.username }}</em></h3>
<h3>
{% blocktrans trimmed %}
Delete User <em>{{ object.username }}</em>
{% endblocktrans %}
</h3>
<p>Delete user permanently?</p>
<p>{% trans "Delete user permanently?" %}</p>
<form class="form" method="post">
{% csrf_token %}
<input type="submit" class="btn btn-md btn-primary"
value="Delete {{ object.username }}"/>
value="{% blocktrans %}Delete {{ object.username }}{% endblocktrans %}"/>
<a href="{% url 'users:index' %}" role="button"
class="btn btn-md btn-primary">Cancel</a>
class="btn btn-md btn-primary">{% trans "Cancel" %}</a>
</form>
{% endblock %}

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block page_head %}
<style type="text/css">
@ -41,14 +42,15 @@
<div class="list-group-item clearfix">
<a href="{% url 'users:delete' user.username %}"
class="btn btn-default btn-sm pull-right"
role="button" title="Delete user {{ user.username }}">
role="button"
title="{% blocktrans %}Delete user {{ user.username }}{% endblocktrans %}">
<span class="glyphicon glyphicon-trash"
aria-hidden="true"></span>
</a>
<a class='user-edit-label'
href="{% url 'users:edit' user.username %}"
title="Edit user {{ user.username }}">
title="{% blocktrans %}Edit user {{ user.username }}{% endblocktrans %}">
{{ user.username }}
</a>

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block page_head %}
<style type="text/css">
@ -30,13 +31,19 @@
{% block content %}
<h3>Edit User <em>{{ object.username }}</em></h3>
<h3>
{% blocktrans trimmed %}
Edit User <em>{{ object.username }}</em>
{% endblocktrans %}
</h3>
<p>
Use the
<a href='{% url 'users:change_password' object.username %}'>
change password form
</a> to change the password.
{% url 'users:change_password' as change_password_url %}
{% blocktrans trimmed %}
Use the <a href='{{ change_password_url }}'>change password form
</a> to change the password.
{% endblocktrans %}
</p>
<div class="row">
@ -46,8 +53,8 @@
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary" value="Save Changes"/>
<input type="submit" class="btn btn-primary"
value="{% trans "Save Changes" %}"/>
</form>
</div>
</div>

View File

@ -19,45 +19,65 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
<h2>Chat Server (XMPP)</h2>
<h2>{% trans "Chat Server (XMPP)" %}</h2>
<p>XMPP is an open and standardized communication protocol. Here you
can run and configure your XMPP server, called ejabberd.</p>
<p>
{% blocktrans trimmed %}
XMPP is an open and standardized communication protocol. Here
you can run and configure your XMPP server, called ejabberd.
{% endblocktrans %}
</p>
<p>To actually communicate, you can use the <a href='/jwchat'>web client</a> or
any other <a href='http://xmpp.org/xmpp-software/clients/' target='_blank'>
XMPP client </a>.</p>
<p>
{% blocktrans trimmed %}
To actually communicate, you can use the <a href='/jwchat'>web
client</a> or any other <a href='http://xmpp.org/xmpp-software/clients/'
target='_blank'>XMPP client</a>.
{% endblocktrans %}
</p>
<p>Your XMPP server domain is set to <b>{{ status.domainname }}</b>. User IDs
will look like <i>username@{{ status.domainname }}</i>. You can setup your
domain on the system <a href="{% url 'config:index' %}">Configure</a>
page.</p>
<p>
{% url 'config:index' as index_url %}
{% blocktrans trimmed with domainname=status.domainname %}
Your XMPP server domain is set to <b>{{ domainname }}</b>. User
IDs will look like <i>username@{{ domainname }}</i>. You
can setup your domain on the system
<a href="{{ index_url }}">Configure</a> page.
{% endblocktrans %}
</p>
<p><a href='/jwchat' target='_blank' class='btn btn-primary'> Launch web
client</a></p>
<p>
<a href='/jwchat' target='_blank' class='btn btn-primary'>
{% trans "Launch web client" %}</a>
</p>
<h3>Status</h3>
<h3>{% trans "Status" %}</h3>
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span> ejabberd is running
{% else %}
<span class="running-status inactive"></span> ejabberd is not running
{% endif %}
</p>
{% include "diagnostics_button.html" with module="xmpp" %}
<p class="running-status-parent">
{% if status.is_running %}
<span class="running-status active"></span>
{% trans "ejabberd is running" %}
{% else %}
<span class="running-status inactive"></span>
{% trans "ejabberd is not running" %}
{% endif %}
</p>
<h3>Configuration</h3>
{% include "diagnostics_button.html" with module="xmpp" %}
<form class="form" method="post">
{% csrf_token %}
<h3>{% trans "Configuration" %}</h3>
{{ form|bootstrap }}
<form class="form" method="post">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Update setup"/>
</form>
{{ form|bootstrap }}
<input type="submit" class="btn btn-primary"
value="{% trans "Update setup" %}"/>
</form>
{% endblock %}

View File

@ -18,17 +18,25 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h2>404</h2>
<h2>{% trans "404" %}</h2>
<p>Requested page {{ request_path }} was not found.</p>
<p>
{% blocktrans trimmed %}
Requested page {{ request_path }} was not found.
{% endblocktrans %}
</p>
<p>If you believe this missing page should exist, please file a bug with either
the Plinth project (<a href="https://github.com/freedombox/Plinth/issues">it
has an issue tracker</a>) or the people responsible for the module you are
trying to access.</p>
<p>Sorry for the mistake.</p>
<p>
{% blocktrans trimmed %}
If you believe this missing page should exist, please file a bug
at the Plinth project
<a href="https://github.com/freedombox/Plinth/issues">issue
tracker</a>.
{% endblocktrans %}
</p>
{% endblock %}

View File

@ -18,13 +18,19 @@
#
{% endcomment %}
{% load i18n %}
{% block content %}
<h2>500</h2>
<h2>{% trans "500" %}</h2>
<p>This is an internal error and not something you caused or can fix. Please
report the error on
the <a href="https://github.com/freedombox/Plinth/issues">bug tracker</a> so
we can fix it.</p>
<p>
{% blocktrans trimmed %}
This is an internal error and not something you caused or can
fix. Please report the error on
the <a href="https://github.com/freedombox/Plinth/issues">bug
tracker</a> so we can fix it.
{% endblocktrans %}
</p>
{% endblock %}

View File

@ -1,3 +1,4 @@
{% load i18n %}
{% load static %}
{% load plinth_extras %}
@ -44,10 +45,11 @@
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noodp, noimageindex, notranslate" />
<meta name="msnbot" content="noindex, nofollow, noarchive, noodp" />
<meta name="slurp" content="noindex, nofollow, noarchive, noodp, noydir" />
<meta name="description" content="Plinth administrative interface for the FreedomBox" />
<meta name="description"
content="{% trans "Plinth administrative interface for the FreedomBox" %}" />
{% block title %}
<title>
{% if title %} {{ title }} {% else %} FreedomBox {% endif %}
{% if title %} {{ title }} {% else %} {% trans "FreedomBox" %} {% endif %}
</title>
{% endblock %}
@ -76,29 +78,29 @@
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse"
data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="sr-only">{% trans "Toggle navigation" %}</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="{% url 'index' %}" class="navbar-brand" title="Applications">
<a href="{% url 'index' %}" class="navbar-brand" title="{% trans "Applications" %}">
<img src="{% static 'theme/img/freedombox-logo-32px.png' %}"
alt="FreedomBox" />
Applications
alt="{% trans "FreedomBox" %}" />
{% trans "Applications" %}
</a>
</div>
<div class="collapse navbar-collapse">
{% block add_nav_and_login %}
<ul class="nav navbar-nav navbar-right">
<li>
<a href="{% url 'help:index' %}" title="Help">
<a href="{% url 'help:index' %}" title="{% trans "Help" %}">
<span class="glyphicon-question-sign glyphicon nav-icon"></span>
</a>
</li>
{% if user.is_authenticated %}
<li>
<a href="{% url 'system:index' %}" title="System Configuration">
<a href="{% url 'system:index' %}" title="{% trans "System Configuration" %}">
<span class="glyphicon-cog glyphicon nav-icon"></span>
</a>
</li>
@ -112,27 +114,29 @@
<span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="{% url 'users:edit' user.username %}"
title="Edit">Edit</a></li>
title="{% trans "Edit"%}">{% trans "Edit" %}</a></li>
<li><a href="{% url 'users:change_password' user.username %}"
title="Change password">Change password</a></li>
title="{% trans "Change password" %}">
{% trans "Change password" %}</a></li>
<li class="divider"></li>
<li><a href="{% url 'users:logout' %}" title="Log out">
Log out</a></li>
<li><a href="{% url 'users:logout' %}"
title="{% trans "Log out" %}">
{% trans "Log out" %}</a></li>
</ul>
</li>
{% else %}
<li>
<a href="{% url 'users:login' %}" title="Log in">
<a href="{% url 'users:login' %}" title="{% trans "Log in" %}">
<i class="glyphicon glyphicon-user nav-icon"></i>
Log in</a>
{% trans "Log in" %}</a>
</li>
{% endif %}
{% if user.is_authenticated %}
<li id="logout-nojs">
<a href="{% url 'users:logout' %}" title="Log out">
<a href="{% url 'users:logout' %}" title="{% trans "Log out" %}">
<i class="glyphicon glyphicon-remove-circle nav-icon"></i>
Log out</a>
{% trans "Log out" %}</a>
</li>
{% endif %}
</ul>

View File

@ -19,6 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block content %}
@ -30,7 +31,8 @@
{{ form|bootstrap }}
<div class="text-center">
<input type="submit" class="btn btn-primary" value="Login" />
<input type="submit" class="btn btn-primary"
value="{% trans "Login" %}" />
</div>
</div>
</div>

View File

@ -17,6 +17,8 @@
#
{% endcomment %}
{% load i18n %}
<ul class="nav nav-pills nav-stacked">
{% for item in menu.items %}

View File

@ -17,6 +17,8 @@
#
{% endcomment %}
{% load i18n %}
{% for message in messages %}
<div class='alert alert-{{ message.tags }} alert-dismissable'>
<a class="close" data-dismiss="alert">&times;</a>

View File

@ -19,7 +19,7 @@
{% endcomment %}
{% load bootstrap %}
{% load i18n %}
{% block page_head %}
@ -32,16 +32,23 @@
{% block content %}
<h2>Installation</h2>
<h2>{% trans "Installation" %}</h2>
{% if not is_installing %}
<p>This feature requires addtional packages to be installed. Do you
wish to install them?</p>
<p>
{% blocktrans trimmed %}
This feature requires addtional packages to be installed. Do
you wish to install them?
{% endblocktrans %}
</p>
<table class="table">
<thead>
<tr><th>Package</th><th>Summary</th></tr>
<tr>
<th>{% trans "Package" %}</th>
<th>{% trans "Summary" %}</th>
</tr>
</thead>
<tbody>
{% for package_name, package in packages.items %}
@ -55,21 +62,30 @@
<form action="" method="post">
{% csrf_token %}
<input type="submit" class="btn btn-md btn-primary" value="Install" />
<input type="submit" class="btn btn-md btn-primary"
value="{% trans "Install" %}" />
</form>
{% else %}
{% for key, transaction in transactions.items %}
<div>Installing {{ transaction.package_names|join:", " }}:
{{ transaction.status_string }}
<div>
{% blocktrans trimmed %}
Installing {{ transaction.package_names|join:", " }}:
{{ transaction.status_string }}
{% endblocktrans %}
</div>
<div class="progress">
<div class="progress-bar progress-bar-striped active"
role="progressbar" aria-valuemin="0" aria-valuemax="100"
aria-valuenow="{{ transaction.percentage }}"
style="width: {{ transaction.percentage }}%">
<span class="sr-only">{{ transaction.percentage }}% complete</span>
<span class="sr-only">
{% blocktrans trimmed %}
{{ transaction.percentage }}% complete
{% endblocktrans %}
</span>
</div>
</div>
{% endfor %}

View File

@ -17,6 +17,8 @@
#
{% endcomment %}
{% load i18n %}
<ul class="nav nav-pills nav-stacked">
{% for item in menu.items %}

View File

@ -17,6 +17,8 @@
#
{% endcomment %}
{% load i18n %}
<ul class="nav nav-tabs">
{% for urlitem in subsubmenu %}
<li {% if urlitem.active %} class="active"{% endif %}